【发布时间】: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", §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_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段在您的情况下是否有用,如stackoverflow.com/a/47951167/5329717 ?不过,这绝对不是最微妙的方法。 -
@Meirs 甚至更好,也许您可以简单地将您的
"__mysection"完全移出__TEXT段。 -
首先,
vm_protect()返回的错误码是什么?另外,你有没有尝试过更现代的功能mach_vm_protect()?
标签: xcode macos memory xcode11 entitlements