在Mojave OSX 10.14中mach_override()函数失败

时间:2018-07-10 13:31:15

标签: macos hook method-swizzling macos-mojave

我有一个小项目,该项目使用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

1 个答案:

答案 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忽略证书验证。