使用Xcode 11编译时,vm_保护失败
我正在使用Mach-O部分之一的运行时内存解密。为此,我使用vm_protect,如下所示:使用Xcode 11编译时,vm_保护失败,xcode,macos,memory,xcode11,entitlements,Xcode,Macos,Memory,Xcode11,Entitlements,我正在使用Mach-O部分之一的运行时内存解密。为此,我使用vm_protect,如下所示: uint8_t *section_start = 0; unsigned long section_size = 0; section_start = getsectiondata(&_mh_execute_header, "__TEXT", "__mysection", §ion_size); // change virtual memory protection if (v
uint8_t *section_start = 0;
unsigned long section_size = 0;
section_start = getsectiondata(&_mh_execute_header, "__TEXT", "__mysection", §ion_size);
// change virtual memory protection
if (vm_protect(mach_task_self(), (vm_address_t)section_start, (vm_size_t)section_size, 0, VM_PROT_READ | VM_PROT_WRITE) != KERN_SUCCESS) {
os_log_error(my_logger, "Virtual memory protection changing to write error");
return false;
}
当我使用Xcode 10编译调试配置时,vm_保护成功。但是,使用Xcode 11编译的相同代码失败
我已尝试将这些权利添加到项目中:
com.apple.security.cs.disable-executable-page-protection
com.apple.security.cs.allow-jit
com.apple.security.cs.allow-unsigned-executable-memory
,但没有成功
还将签名证书更改为专门针对Xcode 11的Apple Development证书,结果相同
在Catalina和Mojave上运行该项目会得到相同的结果——如果使用Xcode 10构建成功,使用Xcode 11构建成功——失败
提前谢谢。我也遇到了同样的问题。如果启用了强化运行时并指定了所有权限(包括上面指定的权限),则会遇到相同的问题。另外,如果我禁用了强化运行时 我尝试编译到一个早期的SDK(早在10.8版本),但问题仍然存在(即使使用早期版本的XCode编译到同一个SDK时它并不存在) 我还尝试使用链接器标志将u_文本段设置为可写: segprot,文本,rwx,rwx。 这一次不是vmprotect失败,而是较早时崩溃,出现dyld错误:“\u文本段映射文件的开头,但可写”
这肯定是XCode 11的一个bug吗?我忘了提到在测试机上禁用了SIP。也许最新的XCode指向SDK,在SDK中,
vm\u protect
的实现是不同的。尝试将SDK更改为与Xcode 10中相同的版本。@MeirS将rwx
权限设置为整个\u TEXT
段在您的情况下是否有任何用处?不过,这肯定不是最微妙的方法。@Meirs甚至更好也许你可以简单地将你的“\uu mysection”
移动到\uu TEXT
段之外。首先,从vm\u protect()
返回的错误代码是什么?另外,您是否尝试过更现代的函数mach\u vm\u protect()
?检查“文本段映射文件开头但可写”的可能解决方法