gpt4 book ai didi

xcode - 使用 mprotect 使文本段在 macOS 上可写

转载 作者:行者123 更新时间:2023-12-03 13:32:58 25 4
gpt4 key购买 nike

这基本上就是我想要做的,

#include <sys/mman.h>

int zero() {
return 0;
}

int main(int argc, const char *argv[]) {
return mprotect((void *) &zero, 4096, PROT_READ | PROT_WRITE);
}

所以我试图使代码可写,本质上。这在当前的 macOS (Catalina 10.15.2) 上不起作用,它只返回 -1和套 errnoEACCES ,据我所知,这是因为缺乏权利/代码签名。我找到了我需要设置的权利,但我不知道如何去做,也不知道如何实际签署它..

如果我运行 codesign -d --entitlements :- <path_to_app> ,它失败了 code object is not signed at all ,即使我已经尝试在 Xcode 中配置签名一段时间(我有证书等等)。那么我应该怎么做呢?实际上用 Xcode 签署它并不明显,所以我相当无能为力。

最佳答案

这不是一个明确的答案,但它是一种解决方法。

您的问题是由 macOS Catalina 中链接器 (ld64) 的更改引起的。 max_prot的默认值__TEXT 的属性Mach-O header 中的段已更改。

以前 max_prot默认值为 0x7 ( PROT_READ | PROT_WRITE | PROT_EXEC )。
默认值现已更改为 0x5 ( PROT_READ | PROT_EXEC )。

这意味着 mprotect无法创建位于 __TEXT 内的任何区域可写。

理论上,这应该通过提供链接器标志 -segprot __TEXT rwx rx 来解决。 , 但这种情况并非如此。自 Catalina 起,max_prot字段被忽略。相反,max_prot设置为 init_prot 的值(见 here)。

最重要的是,init_prot不能设置为 rwx要么是由于 macOS 拒绝执行具有可写权限的文件 __TEXT(init_prot)属性。

一个粗暴的解决方法是手动修改和设置 __TEXT(max_prot)0x7链接后。

printf '\x07' | dd of=<executable> bs=1 seek=160 count=1 conv=notrunc

由于该代码片段依赖于 __TEXT(max_prot)偏移量被硬编码为 0xA0 ,作为替代,我创建了一个 drop-in replacement/wrapperld尊重 max_prot segprot的参数.

关于xcode - 使用 mprotect 使文本段在 macOS 上可写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60654834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com