Macos mojave OSX 10.14中的mach_override()函数失败

Macos mojave OSX 10.14中的mach_override()函数失败,macos,hook,method-swizzling,macos-mojave,Macos,Hook,Method Swizzling,Macos Mojave,我有一个小项目,它使用Jonathan'Wolf'Rentzsch的mach_override()在MAC中实现函数挂钩: 我已经从mac上钩住了kextstat进程的一个函数 所以当我执行的时候 $kextstat OSX正在终止此进程,并显示以下错误: 代码签名:进程2211[kextstat]:拒绝位于的无效页面 文件中偏移量0xca53000的地址0x7fff5132d000 “/private/var/db/dyld/dyld_共享_缓存_x86_64h” (cs_mtime:1531

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

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

所以当我执行的时候

$kextstat

OSX正在终止此进程,并显示以下错误:

代码签名:进程2211[kextstat]:拒绝位于的无效页面 文件中偏移量0xca53000的地址0x7fff5132d000 “/private/var/db/dyld/dyld_共享_缓存_x86_64h” (cs_mtime:1531207073.366350606==mtime:1531207073.366350606) (签名:0已验证:0受污染:0 nx:0 wpmapped:1脏:1深度:2)

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

原子mov64((uint64)原始函数PTR, 跳线(相对指令)

可以找到以上代码:马赫数超控。c:342

首先,您应该注意,公开讨论苹果的开发者测试版软件违反了苹果的条款和条件。这些问题应该发布到,它有一个测试版的特定部分

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

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

在本例中,
kextstat
包含的苹果证书与您试图注入kextstat的代码证书不匹配。此外,
kexstat
的证书包括
platformbinary
标志,开发人员证书没有该标志


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

上述问题的任何解决方案?您是否尝试过关闭SIP?Ya。。使用SIP禁用。。。它很好用。。!!但这不是我的案例的解决方案嗨,根据你的解释,amfid将作为mmap的文件的证书与可执行文件的证书相匹配。。。我认为它将注入进程的可执行文件的证书与正在注入的进程的可执行文件相匹配。这里不是这样吗?@osxUser No注入器二进制是不相关的,是注入到进程中的新代码被验证了。