C vm_写入返回(os/kern)无效地址

C vm_写入返回(os/kern)无效地址,c,cocoa,macos,C,Cocoa,Macos,我做了一个自签名代码代码设计——但不确定vm_写入失败的原因。(我使用的是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 PI

我做了一个自签名代码代码设计——但不确定vm_写入失败的原因。(我使用的是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;
}
#包括
#包括
#包括
int main(int argc,const char*argv[]
{
//获取PID的任务
内核返回错误;
int pid=73002;//系统中进程的pid
机器端口名称;
err=任务(用于pid)(马赫任务(mach)、pid和t);
如果(0!=错误)
{
printf(“用于pid%s的任务”,马赫错误字符串(err));
}
虚拟机地址;
vm_size_t size=108;
err=vm\u分配(t,&地址,大小,TRUE);
如果(0!=错误)
{
printf(“vm_分配:%s”,马赫错误字符串(err));
}
vm_offset_t data=pid;
mach\u msg\u type\u number\u t dataCnt=sizeof(pid);
err=vm_write(t,地址,数据,dataCnt);
如果(0!=错误)
{
printf(“虚拟机写入:%s”,马赫错误字符串(err));
}
返回0;
}
更新:

  • 自签名代码协同设计——我已在系统中生成证书并用于协同设计

  • vm_写入返回(os/kern)无效地址(返回值为“1”)

  • 获取指向内存位置的指针(
    pointer\t
    ),但传递的PID不是有效的内存位置。您需要传递正确的内存位置,如:

    char *text = "123";
    err = vm_write(t, address, text, strlen(text));
    
    。。。它会将指针传递到一个静态字符串。

    接受一个指向内存位置的指针(
    pointer\t
    ),但传递的PID根本不是有效的内存位置。您需要传递正确的内存位置,如:

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

    。。。它会将指针传递到一个静态字符串。

    您应该使用更为最新的mach\u vm\u address\t、mach\u vm\u size\t、mach\u vm\u allocate、mach\u vm\u offset\t、mach\u vm\u write()等。根据我的经验,旧的API在64位进程上并不特别有效(这在10.6上可能非常相关)。另外,对进程ID使用pid\u t而不是int

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


    如果task\u for\u pid返回时没有错误,我认为您的代码签名正确。您还应该使用常量KERN_SUCCESS,而不是适当的0。

    您应该使用更为最新的mach_vm_地址、mach_vm_大小、mach_vm_分配、mach_vm_偏移、mach_vm_write()等。根据我的经验,旧的API在64位进程上并不特别有效(这在10.6中可能非常相关)。此外,对进程ID使用pid_t而不是int

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


    如果task\u for\u pid返回时没有错误,我认为您的代码签名正确。您还应该使用常量KERN\u SUCCESS,而不是在适当的情况下使用0。

    您的问题毫无意义。“自我叹息代码叹息”是什么意思意思?还有,
    vm_write
    返回的错误是什么?@Rob Keniger有打字错误——我已经更新了帖子。@DarkDust返回值是1(无效地址)。你的问题没有意义。“自我叹息代码叹息”是什么意思意思是?另外,
    vm_write
    返回的错误是什么?@Rob Keniger有输入错误--我已经更新了帖子。@DarkDust返回值是1(无效地址)。我尝试了相同的方法…但结果是相同的错误无效地址。我尝试了相同的方法…但结果是相同的错误无效地址。