1

我有一个小项目,它使用 Jonathan 'Wolf' Rentzsch 的 mach_override() 在 MAC 中实现函数挂钩:https ://github.com/rentzsch/mach_override

我已经从 mac 钩住了 kextstat 进程的功能之一。

所以当我执行

$kextstat

OSX 正在杀死这个进程,说下面的错误:

代码签名:进程 2211[kextstat]:从文件“/private/var/db/dyld/dyld_shared_cache_x86_64h”中的偏移量 0xca53000 拒绝地址 0x7fff5132d000 处的无效页面(cs_mtime:1531207073.366350606 == mtime:1531207073.3066350signed :0 nx:0 wpmapped:1 脏:1 深度:2)

我的动态库是代码签名的。在我最初的观察中,我可以得出结论 mach_override() 函数在以下代码中失败:

atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelativeInstruction);

上面的代码可以找到:mach_override.c:342 https://github.com/rentzsch/mach_override

4

1 回答 1

3

首先,您应该注意,公开讨论 Apple 的 Developer Beta 软件违反了 Apple 的条款和条件。此类问题应发布到Apple 论坛,该论坛有专门针对 Beta 版本的部分。

话虽如此,您看到的技术和问题是SIP,它包括拒绝代码注入,以及保护系统文件不被覆盖。接下来的细节并不是什么新鲜事,并且存在于 10.14 之前的 macOS 版本中,尽管在这些版本中被禁用(默认情况下)。

当应用程序被签名时,它会在二进制文件中创建每个文件页面的哈希,以及所有这些哈希的超级哈希。在二进制文件执行期间,当发生页面错误或文件(例如 dylib)mmap进入执行进程时,amfid(Apple Mobile File Integrity daemon)验证新代码是否已签名并且其签名与执行的签名匹配二进制。如果签名或哈希不匹配,则拒绝加载代码,或者在某些情况下,进程被终止。

在这种情况下,kextstat包含与您尝试注入 kextstat 的代码证书不匹配的 Apple 证书。此外,证书中kexstat还包含platform binary开发者证书所没有的标志。

如果没有零日漏洞,您将无法kextstat在商业环境中使用。如果您只是想做研究,那么您可以禁用 SIP,或者从kextstat二进制文件中删除签名,从而amfid忽略证书验证。

于 2018-07-12T08:09:36.913 回答