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



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

我已经从mac上钩住了kextstat进程的一个函数。

所以当我执行时

$kextstat

OSX正在杀死这个进程,并说以下错误:

代码签名:进程2211[kextstat]:拒绝处的无效页面文件中偏移量0xca53000的地址0x7fff5132d000"/private/var/db/dyld_shared_cache_x86_64h"(cs_mtime:1531207073.366350606==时间:1531207073.3 66350606((已签名:0已验证:0已污染:0 nx:0 wpmapped:1脏:1深度:2(

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

atomic_mov64((uint64_t*(originalFunctionPtr,jumpRelativeInstruction(;

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

首先,您应该注意,公开讨论苹果的开发者测试版软件违反了苹果的条款和条件。这些问题应该发布到苹果的论坛上,其中有一个专门针对Beta版本的部分。

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

当应用程序被签名时,它会在二进制文件中创建每个文件页的哈希,以及所有这些哈希的超级哈希。在二进制文件的执行过程中,当出现页面错误,或者文件(例如dylib(被mmap'd放入执行进程时,amfid(Apple Mobile file Integrity守护进程(会验证新代码是否已签名,以及其签名是否与执行二进制文件的签名相匹配。如果签名或散列不匹配,则代码被拒绝加载,或者在某些情况下,进程被终止。

在这种情况下,kextstat包含的Apple证书与您试图注入kextstat的代码的证书不匹配。此外,kexstat的证书包括platform binary标志,而开发人员证书没有该标志。

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

最新更新