使用 Xcode 11 编译时 vm_protect 失败

Posted

技术标签:

【中文标题】使用 Xcode 11 编译时 vm_protect 失败【英文标题】:vm_protect fails when compiled with Xcode 11 【发布时间】:2019-12-19 10:40:27 【问题描述】:

我正在使用其中一个 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 编译调试配置时,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 Development 证书,结果相同。

在 Catalina 和 Mojave 上运行该项目会产生相同的结果 - 如果使用 Xcode 10 构建,则成功,使用 Xcode 11 - 会失败。

提前致谢。

【问题讨论】:

我忘了说 SIP 在测试机上被禁用了。 也许最新的 Xcode 指向 SDK,其中 vm_protect 的实现有所不同。尝试将 SDK 更改为与 Xcode 10 中相同的版本。 @MeirS 将rwx 权限设置为整个__TEXT 段在您的情况下是否有用,如***.com/a/47951167/5329717 ?不过,这绝对不是最微妙的方法。 @Meirs 甚至更好,也许您可​​以简单地将您的 "__mysection" 完全移出 __TEXT 段。 首先,vm_protect()返回的错误码是什么?另外,你有没有尝试过更现代的功能mach_vm_protect() 【参考方案1】:

我也遇到了同样的问题。如果我启用了强化运行时并指定了所有权利(包括上面指定的权利),那么我会遇到同样的问题。另外,如果我禁用了强化运行时。

我尝试编译到较早版本的 SDK(早在 10.8),但问题仍然存在(即使使用较早版本的 XCode 编译到同一个 SDK 时问题不存在)。

我还尝试使用链接器标志使 __TEXT 段可写: segprot,__TEXT,rwx,rwx。 这次不是 vmprotect 失败,而是更早地崩溃并出现 dyld 错误:“__TEXT 段映射文件的开头但可写”

这肯定是 XCode 11 的错误?

【讨论】:

检查 ***.com/q/60497896/5329717 以了解“__TEXT 段映射文件开头但可写”的可能解决方法

以上是关于使用 Xcode 11 编译时 vm_protect 失败的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11.4 中的资产目录编译 (actool) 失败

仅在使用设备 arm_neon.h 时 Xcode6 编译错误

为 iOS 编译 Flutter 项目时的 Xcode 构建问题

使用 Xcode 4.2 为 iOS 3.1.3 编译

在 XCode、iOS 开发中编译时在 Keychain.swift 中构建错误

Xcode 11.5 发布,以修改 BUG 为主