2011-08-04 39 views
0

我已经做了一个自签名的代码协同设计 - 但不知道为什么vm_write失败(我使用10.6.6)vm_write回报(OS /克恩)地址无效

试图找出什么是缺少让它工作 - 我很感谢这个问题的一些帮助。

#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 /克恩)无效的地址(返回值是 “1”)

+2

你的问题没有意义。 “自叹号代码叹气”是什么意思? –

+0

另外,'vm_write'返回的错误是什么? – DarkDust

+0

@Rob Keniger有错别字 - 我已更新该帖子。 –

回答

3

您应该使用更新的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作为进程标识。

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

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

+0

mach_vm_write诀窍...谢谢.... –

1

third argument of vm_write采用指向的存储器位置(pointer_t),但传递的PID它简单地ISN没有有效的存储位置。您需要传递正确的内存位置,例如:

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

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

+0

我试过相同的...但它导致了相同的错误无效的地址。 –