C -MACH_VM_WRITE失败(OS/KERN)无效地址



我已经创建了一些代码以将内存写入系统上的另一个过程,但是Mach_vm_write((在"(OS/KERN(无效地址"中失败了,尽管地址似乎是地址有效的。我的代码在下面。

if ((kret = task_for_pid(mach_task_self(), pid, &task)) == KERN_SUCCESS)
    {
        //this succeeds with the correct value.
        if ((kret = get_task_base(task, &base)) == KERN_SUCCESS)
        {
            char patch_1[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
            mach_vm_address_t address_1 = base + 0x77777;
            //this also succeeds
            if ((kret = mach_vm_protect(task, address_1, 6, TRUE, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE)) == KERN_SUCCESS)
            {
                //fails with "(os/kern) invalid address" despite using the same value as the previous mach_vm_protect() call.
                if ((kret = mach_vm_write(task, address_1, (vm_offset_t)&patch_1, 6)) == KERN_SUCCESS)
                {
                }
                else printf("mach_vm_write failed w/ error %d: %sn", kret, mach_error_string(kret));
            }
            else printf("mach_vm_protect failed w/ error %d: %sn", kret, mach_error_string(kret));
        }
        else printf("mach_vm_region_recurse failed w/ error %d: %sn", kret, mach_error_string(kret));
    }
else printf("task_for_pid failed w/ error %d: %sn", kret, mach_error_string(kret));

事实证明,mach_vm_write((失败的原因是我的mach_vm_protect((呼叫正在设置最大保护。呼叫应该看起来像这样:

mach_vm_protect(task, address_1, 6, FALSE, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE)