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

时间:2011-08-04 07:26:54

标签: c cocoa macos

我做了一个自签名代码编码 - 但不确定为什么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;
}

更新

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

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

2 个答案:

答案 0 :(得分:3)

您应该使用更新的mach_vm_address_t,mach_vm_size_t,mach_vm_allocate,mach_vm_offset_t,mach_vm_write()等。据我记得,经验丰富的旧API在64位上运行不是很好过程(在10.6上可能非常相关)。另外,对进程ID使用pid_t而不是int。

另一张海报是对的,你错误地将第三个参数传递给了vm_write,也许你想传递&amp;数据,但顺便说一下你应该使用mach_vm_write。我希望你的程序崩溃或尝试用你使用vm_w​​rite的方式写垃圾,但是返回的错误似乎是KERN_INVALID_ADDRESS,这表明它在过程中写入内存地址失败。

如果task_for_pid返回没有错误,我估计您正确签署了代码。您还应该使用常量KERN_SUCCESS,而不是在适当的地方使用。

答案 1 :(得分:1)

third argument of vm_write获取指向内存位置(pointer_t)的指针,但是您传递的PID不是有效的内存位置。您需要传递正确的内存位置,例如:

char *text = "123";
err = vm_write(t, address, text, strlen(text));

...将指针传递给静态字符串。