C vm_写入返回(os/kern)无效地址
我做了一个自签名代码代码设计——但不确定vm_写入失败的原因。(我使用的是10.6.6) 试图找出它所缺少的东西以使其发挥作用——我感谢对这些问题的一些帮助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
#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;
}
更新:
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(无效地址)。我尝试了相同的方法…但结果是相同的错误无效地址。我尝试了相同的方法…但结果是相同的错误无效地址。