macos – 在Mac OSX中获取进程基址

我正在尝试使用task_for_pid / vm_read读取进程的内存.

uint32_t sz;
pointer_t buf;
task_t task;
pid_t pid = 9484;
kern_return_t error = task_for_pid(current_task(), pid, &task);
vm_read(task, 0x10e448000, 2048, &buf, &sz);

在这种情况下,我读取前2048字节.

当我知道进程的基地址(我可以使用gdb“info shared”找到它 – 在本例中为0x10e448000)时,这是有效的,但是如何在运行时找到基址(不用gdb查看)?

最佳答案
回答我自己的问题.我能够使用mach_vm_region_recurse获得基地址,如下所示.偏移落在vmoffset中.如果还有另一种更“正确”的方式 – 请毫不犹豫地发表评论!

#include <stdio.h>
#include <mach/mach_init.h>
#include <sys/sysctl.h>
#include <mach/mach_vm.h>

 ...

    mach_port_name_t task;
    vm_map_offset_t vmoffset;
    vm_map_size_t vmsize;
    uint32_t nesting_depth = 0;
    struct vm_region_submap_info_64 vbr;
    mach_msg_type_number_t vbrcount = 16;
    kern_return_t kr;

    if ((kr = mach_vm_region_recurse(task, &vmoffset, &vmsize,
                 &nesting_depth,
                 (vm_region_recurse_info_t)&vbr,
                 &vbrcount)) != KERN_SUCCESS) 
    {
        printf("FAIL");
    }

转载注明原文:macos – 在Mac OSX中获取进程基址 - 代码日志