xcode - 使用 Xcode 11 编译时 vm_protect 失败
问题描述
我正在使用其中一个 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 - 会失败。
提前致谢。
解决方案
我也遇到了同样的问题。如果我启用了强化运行时并指定了所有权利(包括上面指定的权利),那么我会遇到同样的问题。另外,如果我禁用了强化运行时。
我尝试编译到较早的 SDK(早在 10.8)并且问题仍然存在(即使如果您使用较早版本的 XCode 编译到同一个 SDK,它也不存在)。
我还尝试使用链接器标志使 __TEXT 段可写:segprot、__TEXT、rwx、rwx。这次不是 vmprotect 失败,而是更早地崩溃并出现 dyld 错误:“__TEXT 段映射文件的开头但可写”
这肯定是 XCode 11 的错误吗?
推荐阅读
- hibernate - Quarkus (2.0.1), Hibernate Panache Reactive , Gradle 7.0.2, 6.8.3 在快速启动 hibernate-reactive-panache-quickstart 上测试失败
- html - Django Forms vs HTML - 按钮的名称值/使用动态数据
- oracle - plsql 错误“在“drug_name IN CHAR(255)”行上遇到符号(当期望以下之一时::-)“”
- android - 在 React Native 应用程序中集成三星健康的权限问题和步数
- python - 安装 pytorch 时出现“命令错误,退出状态 1”错误
- docker - 当 docker-compose 中的卷中的文件在 Dockerfile 中可用时?
- ruby-on-rails - 标题:- Amazon SP API 授权的标题问题
- c# - 在 C# webforms 中更新选中值(复选框)的 SQL
- rabbitmq - spring Rabbitmq运行时出现Bad frame end marker Error
- oracle - 如何使用 ASP.NET / EF Core(获取 ConnectionTimeout)为 Oracle 数据库设置正确的连接字符串?