vm_write 返回(os/kern)无效地址

Gir*_*ari 0 c macos cocoa

我已经进行了自签名代码协同设计 - 但不确定为什么 vm_write 失败。(我正在使用 10.6.6)

试图找出让它发挥作用所缺少的东西——我很感谢这个问题的一些帮助。

#include <mach/vm_map.h>
#include <mach/mach_traps.h>
#include <mach/mach_error.h>

int main (int argc, const char * argv[])
{

    //get the task for PID
    kern_return_t err;
    int pid = 73002; // PID of process in the system
    mach_port_name_t t;


    err = task_for_pid(mach_task_self(), pid, &t);


    if(0 != err)
    {
        printf("task_for_pid : %s",mach_error_string(err));
    }

    vm_address_t address;
    vm_size_t size = 108;

    err =  vm_allocate(t,&address,size,TRUE);

    if(0 != err)
    {
        printf("vm_allocate : %s",mach_error_string(err));
    }

    vm_offset_t data = pid;
    mach_msg_type_number_t dataCnt = sizeof(pid);

    err = vm_write(t,address,data,dataCnt);

    if(0 != err)
    {
        printf("vm_write : %s",mach_error_string(err));
    }


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新:

  1. 自签名代码codesign --- 我已经在系统中生成了证书并用于codesign。

  2. vm_write 返回(os/kern)无效地址(返回值为“1”)

Zor*_*org 5

您应该使用最新的 mach_vm_address_t、mach_vm_size_t、mach_vm_allocate、mach_vm_offset_t、mach_vm_write() 等。据我的经验,旧的 API 在 64 位进程上效果不佳(可能与 10.6 非常相关)。另外,使用 pid_t 而不是 int 作为进程 ID。

另一位海报是正确的,您错误地将第三个参数传递给 vm_write,也许您想传递 &data,但顺便说一下,您应该使用 mach_vm_write 。我预计你的程序会崩溃或尝试使用 vm_write 的方式写入垃圾,但返回的错误似乎是 KERN_INVALID_ADDRESS,这表明它无法写入进程中的内存地址。

如果 task_for_pid 返回没有错误,我认为您正确签署了代码。您还应该在适当的情况下使用常量 KERN_SUCCESS,而不是 0。