我最近刚转到 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 的魔数(Magic Number)。
(gdb) x/x 0x100000000
0x100000000 <_mh_execute_header>: 0xfeedfacf
(gdb)
然而,当我的程序试图读取目标进程的内存时,它只是返回 随机值,而不是我期望的魔数(Magic Number)(它是随机的)。
2157 -> 1103 [0 - (os/kern) successful]
0x0619F000
2157 是目标 PID,1103 是任务端口以及来自 mach_error_string
的结果。
我还尝试了 vm_read
函数,但仍然是相同的行为。
最佳答案
Nvm,发现问题了。魔术变量应被视为指针而不是 复制数据的实际内存单元。
pointer_t magic;
...
int magicValue = (uint32_t) *((int *)(magic));
关于kernel - Mach vm_read 未返回 OSX 10.8.2 的预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14973399/