2011-08-04 12 views
0

。それを動作させる - 私はこの問題のいくつかの助けに感謝します。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. 自己Iは、システム内の証明書を生成し、協調設計のために使用している---コード協調設計に署名しました。

  2. vm_write戻る(OS /カーニング)無効なアドレス(戻り値が "1" である)

+2

あなたの質問は意味をなさない。 「自己告発されたコード・シギング」とはどういう意味ですか? –

+0

また、 'vm_write'によって返されるエラーは何ですか? – DarkDust

+0

@Rob Keniger typoがありました - 私は投稿を更新しました。 –

答えて

3

最新のmach_vm_address_t、mach_vm_size_t、mach_vm_allocate、mach_vm_offset_t、mach_vm_write()などを使用する必要があります。私が経験から覚えている限り、古いAPIは64ビット版では特にうまく機能しません。 (これは10.6とかなり関連している可能性があります)。また、プロセスIDにはintの代わりにpid_tを使用します。

第3引数を間違ってvm_writeに渡していて、おそらく&のデータを渡したいと思うもう1つのポスターですが、途中でmach_vm_writeを使用してください。私はあなたのプログラムがクラッシュするか、vm_writeを使っていたやり方でごみを書き込もうとしますが、返されたエラーはKERN_INVALID_ADDRESSのようで、プロセスのメモリアドレスへの書き込みに失敗したことを示しています。

task_for_pidがエラーなしに返された場合は、コードに正しく署名したものとみなします。適切な場合は、定数KERN_SUCCESSを使用してください。

+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

私は同じことを試みました...しかし、それは私に同じエラーの結果として無効なアドレスです。 –

関連する問題