使用vm_read读取另一个进程内存

问题描述 投票:0回答:1

我编写了一些代码来读取另一个进程内存。这是针对 macOS/GNU Mach 的。

#include <stdio.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <mach/mach_vm.h>

int main() {
    pid_t pid;
    printf("PID: ");
    scanf("%d", &pid);
    vm_address_t address;
    printf("Address: ");
    scanf("%lx", &address);
    vm_offset_t readMem;
    vm_map_read_t task = task_for_pid(mach_task_self(), pid, &task);
    mach_msg_type_number_t size = sizeof(int);
    kern_return_t result = vm_read(task, address, (pointer_t)sizeof(int), &readMem, &size);
    if (result) {
        fprintf(stderr, "cant read, result 0x%x\n", result);
    }
    printf("%lu", readMem); 
}

运行它并提供有效的 PID 后,它会返回 MACH_SEND_INVALID_DEST。

c kernel low-level mach
1个回答
0
投票

我知道这个答案已经晚了,但它可能对遇到同样问题的其他人有用。

问题

  1. 正如 Craig Estey 指出的那样,
    task_for_pid()
    返回
    kern_return_t
  2. 您没有检查潜在的错误。
  3. 获取指针后读取数据的方式不正确。
  4. 使用 sudo 运行程序。

我修改了您的代码以使其更加清晰,添加了一些错误检查并进行了正确的阅读。根据您所做的评论,我相信您正在尝试读取整数,因此我调整了代码以满足该需求。

#include <stdio.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <mach/mach_vm.h>
#include <stdlib.h>

void check_result(kern_return_t kern_res, char * msg)
{
    if (kern_res != KERN_SUCCESS) {
            if (msg == NULL)
                    fprintf(stderr, "%s\n", mach_error_string(kern_res));
            else
                    fprintf(stderr, "%s : %s\n", msg, mach_error_string(kern_res));
            exit(1);
    }
}

int main()
{
    pid_t pid;
    printf("PID: ");
    scanf("%d", &pid);

    vm_address_t address;
    printf("Address: ");
    scanf("%lx", &address);

    kern_return_t res;
    mach_port_t   task_self = mach_task_self();
    mach_port_t   other_task;

    res = task_for_pid(task_self, pid, &other_task);
    check_result(res, "Error getting task");

    void * data;
    mach_msg_type_number_t size = sizeof(int);
    vm_size_t size_to_read = (vm_size_t) sizeof(int);

    res = vm_read(other_task, address, size_to_read, (vm_offset_t *) &data, &size);
    check_result(res, "Error reading virtual memory");

    char * char_ptr = (char *) data;
    fprintf(stdout, "%d\n", (int) char_ptr[0]);
}

我测试了它,并确保它按预期工作。有任何改进请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.