关于HookCase
HookCase是一款针对maxOS的逆向工程安全分析工具,广大研究人员可以利用该工具在macOS上或对操作系统本身进行安全调试或执行逆向工程分析。
该工具重新实现并扩展了 Apple 的DYLD_INSERT_LIBRARIES功能。它可用于挂钩任何模块中的任何方法(甚至是未导出的方法,甚至是那些在其自己的模块的符号表中没有条目的方法)。在单个操作中,它可以应用于父进程及其所有子进程,无论子进程是否继承了其父进程的环境。它支持观察点。因此,HookCase 比DYLD_INSERT_LIBRARIES的功能强大得多,而且它也没有 Apple 对DYLD_INSERT_LIBRARIES的限制。
HookCase 可在 OS X 10.9(Mavericks)到 macOS 15(Sequoia)上运行。
工具要求
1、XCode
2、对应macOS版本相匹配的SDK
3、LLVM 3.9.0 Clang或LLVM 4.0.0 Clang
工具安装
广大研究人员可以直接使用下列命令将该项目源码克隆至本地:
git clone https://github.com/steven-michaud/HookCase.git
OS X 10.10
从命令行运行nvram boot-args以查看是否已经有一些启动参数。然后运行以下命令:
sudo nvram boot-args="<existing-boot-args> kext-dev-mode=1"
重新启动计算机。
OS X 10.11及更高版本上
重新启动计算机,在听到 Mac 启动声音后立即按下Command-R ,进入恢复分区。看到 Apple 标志时松开这些键。
选择实用程序-终端,然后在命令行中运行下列命令之一。第一个命令完全禁用 SIP。第二个命令启用除防止加载未签名的内核扩展之外的所有功能。第三个命令还禁用文件系统保护。
csrutil disable csrutil enable --without kext csrutil enable --without kext --without fs
退出终端并重新启动计算机。
现在复制HookCase.kext到/usr/local/sbin/目录。可能需要创建此目录,确保它归root:wheel拥有:
sudo cp -R HookCase.kext /usr/local/sbin
macOS 10.15 及更低版本
在 macOS 10.15 (Catalina) 及以下版本中,只需一个命令即可加载HookCase.kext到内核:
sudo kextutil /usr/local/sbin/HookCase.kext
因为它没有使用内核扩展签名证书进行签名,所以会看到以下错误(或类似的错误):
Diagnostics for HookCase.kext:
Code Signing Failure: code signature is invalid
kext-dev-mode allowing invalid signature -67050 0xFFFFFFFFFFFEFA16
for kext "HookCase.kext"
kext signature failure override allowing invalid signature -67050
0xFFFFFFFFFFFEFA16 for kext "/usr/local/sbin/HookCase.kext"
运行kextstat看看它是否确实加载。
HookCase.kext要从内核卸载,请运行以下命令:
sudo kextunload -b org.smichaud.HookCase
macOS 11及更高版本
在 macOS 11 (Big Sur) 及更高版本中,情况更加复杂。从此版本的 macOS 开始,HookCase 需要keepsyms=1启动参数。第三方内核扩展必须先加载到“辅助 kext 集合”中,然后才能加载到内核中。在此过程中,需要明确授予HookCase.kext加载权限,然后重新启动计算机。macOS 11 还使用一组新的命令行实用程序来加载和卸载内核扩展。
按照以下方法更改启动参数。为此,需要至少暂时禁用 SIP,重新启动计算机以使更改生效。
sudo nvram boot-args="keepsyms=1"
在终端提示符下运行以下命令:
sudo kmutil load -p /usr/local/sbin/HookCase.kext
几秒钟后,将出现“系统扩展已更新”对话框,告知HookCase 系统扩展已更新。单击“打开安全首选项”按钮,在“安全和隐私”偏好设置面板中,首先“单击锁进行更改”,然后单击 HookCase 旁边的“允许”按钮。将出现另一个对话框,告诉你“需要重新启动才能使用新的系统扩展”。默认选项是“现在不”,最好选择此选项。如果立即重新启动,可能会出现奇怪的情况。我通常会关闭所有打开的应用程序,然后重新启动。
计算机重新启动后,打开终端提示符并再次输入以下命令。它应该立即加载 HookCase.kext到内核中。
sudo kmutil load -p /usr/local/sbin/HookCase.kext
运行kextstat看看它是否确实加载。
运行以下命令之一HookCase.kext从内核卸载:
sudo kmutil unload -p /usr/local/sbin/HookCase.kext sudo kumtil unload -b org.smichaud.HookCase
工具使用
动态修复钩子
HC_INSERT_LIBRARY=/full/path/to/hook.dylib /Applications/Safari.app/Contents/MacOS/Safari
事件查看
HC_INSERT_LIBRARY=/full/path/to/hook.dylib /Applications/Safari.app/Contents/MacOS/Safari
观察点watchpoint
HC_INSERT_LIBRARY=/full/path/to/hook.dylib "/Applications/Firefox Nightly.app/Contents/MacOS/firefox"
项目地址
HookCase:【GitHub传送门】
参考资料
https://forums.developer.apple.com/thread/17452
https://books.google.com/books?id=K8vUkpOXhN4C&pg=PA73&lpg=PA73&dq=%22dyld+interposing%22+Singh.