最近 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
関数を試してみましたが、それでも同じ動作です。