2011-08-04 38 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

我試過相同的...但它導致了相同的錯誤無效的地址。 –