使用Xcode 11编译时,vm_protect失败。

3
我正在使用Mach-O部分的运行时内存解密。为此,我使用vm_protect如下所示:
uint8_t *section_start = 0;
unsigned long section_size = 0;
section_start = getsectiondata(&_mh_execute_header, "__TEXT", "__mysection", &section_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编译Debug配置时,vm_protect成功执行。然而,使用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开发证书,结果仍然相同。

在Catalina和Mojave上运行项目 - 如果使用Xcode 10构建,则成功;如果使用Xcode 11,则失败。

提前感谢。


我忘了提到测试机上已禁用SIP。 - MeirS
也许最新的Xcode指向了SDK,其中vm_protect的实现方式不同。尝试更改SDK为与Xcode 10相同的版本。 - Irad K
@MeirS,根据 https://dev59.com/pKfja4cB1Zd3GeqPy6br#47951167 ,将“rwx”权限设置为整个“__TEXT”段,在您的情况下是否有用?虽然这绝对不是最微妙的方法。 - Kamil.S
@Meirs 或许更好的做法是将你的“__mysection”移出__TEXT段。 - Kamil.S
首先,vm_protect() 返回的错误代码是什么?另外,您尝试过更现代的函数 mach_vm_protect() 吗? - Ken Thomases
显示剩余2条评论
1个回答

1
我也遇到了同样的问题。如果启用了强化运行时并指定所有权限(包括上述权限),那么我会遇到同样的问题。如果禁用了强化运行时,也是如此。
我尝试编译到早期的SDK(甚至是10.8),问题仍然存在(即使使用早期版本的XCode编译到相同的SDK时不存在该问题)。
我还尝试使用链接器标志使__TEXT段可写: segprot,__TEXT,rwx,rwx。 这次,虽然vmprotect失败了,但它在更早的时候崩溃了,出现了dyld错误:“__TEXT段映射文件的开头,但是可写”。
这肯定是XCode 11的一个错误吧?

请查看 https://dev59.com/Abnoa4cB1Zd3GeqPTJXS,了解“__TEXT segment maps the start of the file but is writable”的可能解决方法。 - Kamil.S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接