kernel - Mach vm_read 未返回 OSX 10.8.2 的预期值

标签 kernel osx-mountain-lion mach xnu

我最近刚转到 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/

相关文章:

linux - seccomp-bpf 如何过滤系统调用?

linux - 运行 Linux 内核模块 (Hello World)

ios - 包含一个对 Mountain Lion 上的 Safari 很有用的 Passbook pkpass

macos - 将长行粘贴到 Mac OS X 终端

swift - 无法让 XPC 从客户端接收数据

c++ - IOMemoryDe​​scriptor 类的 C 等效项

linux-kernel - 如何在 linux 内核 2.6 中使用 CryptoAPI

linux - 使用 netif_rx() 时出现内核错误

xcode - 使用 Xcode 4 创建 MacOS 服务

mysql - SQL Mach 两表