gpt4 book ai didi

iOS Mach-O – 使 __TEXT 段暂时可写

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:26 24 4
gpt4 key购买 nike

我已经尝试了很多来最终让它工作,但它仍然无法工作。我试图更改 __TEXT 部分中的一些变量,默认情况下它是只读的,例如更改 cryptid(和其他内容)

它有点像以前工作,回到 32 位设备上。但是不知何故,我使用64位命令后总是失败。

如果我点击以下行,它目前会崩溃:tseg->maxprot = tseg->initprot = VM_PROT_READ | VM_PROT_EXECUTE或者crypt->cryptid = 1

    struct mach_header_64* mach = (struct mach_header_64*) _dyld_get_image_header(0);

uint64_t header_size = 0;

struct encryption_info_command_64 *crypt;
struct segment_command_64 *tseg;
struct dylib_command *protector_cmd;


// clean up some commands
void *curloc = (void *)mach + sizeof(struct mach_header);
for (int i=0;i<mach->ncmds;i++) {
struct load_command *lcmd = curloc;
if (lcmd->cmd == LC_ENCRYPTION_INFO_64) {
// save crypt cmd
crypt = curloc;
} else if (lcmd->cmd == LC_SEGMENT_64) {
struct segment_command_64 *seg = curloc;
if (seg->fileoff == 0 && seg->filesize != 0) {
header_size = seg->vmsize;
tseg = curloc;
}
}
if(i == mach->ncmds-1){
protector_cmd = curloc;
}
curloc += lcmd->cmdsize;
}
kern_return_t err;

// make __TEXT temporarily writable
err = vm_protect(mach_task_self(), (vm_address_t)mach, (vm_size_t)header_size, false, VM_PROT_ALL);
if (err != KERN_SUCCESS) exit(1);

// modify the load commands
// change protection of __TEXT segment
tseg->maxprot = tseg->initprot = VM_PROT_READ | VM_PROT_EXECUTE;

// change cryptid
crypt->cryptid = 1;

最佳答案

更改加载命令没有意义。载入程序时已经处理了载入命令(必须在您的这段代码运行之前)。它们对页面保护​​没有进一步影响。

您显然已经知道 vm_protect() 函数。那么,为什么不使用它来使文​​本段本身可写,而是尝试使加载命令可写?

使用 getsegmentdata() 在内存中定位段肯定比查看加载命令(您必须向其添加幻灯片)更简单。

除此之外,如果 iOS 允许您这样做,我会感到惊讶。一般禁止运行时可修改代码(极少数异常(exception))。

关于iOS Mach-O – 使 __TEXT 段暂时可写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56419488/

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