3

最近 UNIX プラットフォームに移行したばかりで、現在はオペレーティング システムの研究を行っています。現在、私は XNU の設計/実装に特に興味を持っており、現在はプロセスとメモリのトピックに取り組んでいます。

実行可能ファイルが別のプロセスからタスクポートを取得できるようにするこのコードスニペットがあります

int retValTask = task_for_pid(mach_task_self(), pid, &task);
if (retValTask != KERN_SUCCESS || !MACH_PORT_VALID(task)) {
    printf("Error while getting port, check if root or valid pid");
}
...
int retValVmRead = mach_vm_read(task, (vm_address_t)0x100000000, sizeof(uint32_t), (vm_offset_t *)&magic, &sz);

Mac OSX 10.8.2 には ASLR があることを認識しているため、実行するターゲット プロセスは gdb 経由で呼び出されます。

(gdb) start
Breakpoint 1 at 0x100000ed8
Starting program: /private/tmp/test 
Reading symbols for shared libraries +............................. done

Breakpoint 1, 0x0000000100000ed8 in main ()

0x100000000アドレスに Mach-O のマジック ナンバーが含まれていることを GDB 内で確認することもできます。

(gdb) x/x 0x100000000
0x100000000 <_mh_execute_header>:   0xfeedfacf
(gdb)

ただし、私のプログラムがターゲット プロセスのメモリを読み込もうとすると、期待しているマジック ナンバーではなく、ランダムな値が返されます (ランダムです)。

 2157 -> 1103 [0 - (os/kern) successful]
 0x0619F000 

2157 はターゲット PID、1103 はタスク ポート、および からの結果ですmach_error_string。また、vm_read関数を試してみましたが、それでも同じ動作です。

4

1 に答える 1

2

Nvm、問題を発見しました。マジック変数は、データがコピーされる実際のメモリ セルではなく、ポインタとして扱われるべきです。

pointer_t magic;
...
int magicValue = (uint32_t) *((int *)(magic));
于 2013-02-20T14:16:18.533 に答える