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 ()

我还可以在 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功能,但行为仍然相同。

4

1 回答 1

2

NVM,发现问题。魔术变量应被视为指针,而不是复制数据的实际内存单元。

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