我最近刚搬到 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 ()
我还可以在 GDB 内部验证该地址是否0x100000000
包含 Mach-O 的幻数。
(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
功能,但行为仍然相同。