我有一个小项目,该项目使用Jonathan'Wolf'Rentzsch的mach_override()在MAC中实现函数挂钩:https://github.com/rentzsch/mach_override
我已经从Mac钩住了kextstat进程的功能之一。
所以当我执行
$ kextstat
OSX正在终止此过程,并显示以下错误:
代码签名:进程2211 [kextstat]:拒绝位于的无效页面 文件中偏移量0xca53000的地址0x7fff5132d000 “ / private / var / db / dyld / dyld_shared_cache_x86_64h” (cs_mtime:1531207073.366350606 == mtime:1531207073.366350606) (签名:0已验证:0污染: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
答案 0 :(得分:2)
首先,您应注意,公开讨论Apple的Developer Beta软件违反了Apple的条款和条件。这些问题应发布到Apple's forums,其中有专门针对Beta版本的部分。
话说回来,您看到的技术和问题是SIP,其中包括拒绝代码注入以及保护系统文件不被覆盖。接下来的细节并不是什么新鲜事物,并且存在于10.14之前的macOS版本中,尽管在那些版本中(默认情况下已禁用)。
对应用程序进行签名后,它会在二进制文件中为每个文件页面创建一个哈希,并为所有这些哈希创建一个超级哈希。在执行二进制文件期间,如果发生页面错误,或者将文件(例如dylib)mmap
放入执行过程中,则amfid
(Apple Mobile File Integrity守护程序)会验证新代码是否为已签名,并且其签名与正在执行的二进制文件的签名匹配。如果签名或哈希值不匹配,则拒绝加载代码,或者在某些情况下,该过程将被终止。
在这种情况下,kextstat
包含一个Apple证书,该证书与您尝试注入kextstat的代码证书不匹配。另外,kexstat
的证书包括platform binary
标志,而开发人员证书则没有。
没有零日漏洞,您将无法在商业环境中挂起kextstat
。如果只是研究而已,则可以禁用SIP,也可以从kextstat
二进制文件中删除签名,从而导致amfid
忽略证书验证。