【问题标题】:Is possible to read virtual memory on Unix/Linux? And on Windows?可以在 Unix/Linux 上读取虚拟内存吗?在 Windows 上?
【发布时间】:2021-06-17 21:19:49
【问题描述】:

我正在使用 Mach 开发 Debian GNU/Hurd。我被要求编写一个程序,给定一个 PID 和一个地址,在地址上执行 vm_read 并打印结果。

这是我写的代码:

#include <mach_error.h>
#include <mach/mig_errors.h>
#include <mach/thread_status.h>
#include <mach/processor_info.h>
#include <mach/i386/vm_param.h>
#include <stdio.h>
#include <stdlib.h>
#include <hurd.h>
#include <string.h>

int main(int argc, char * argv[]) {

    if(argc != 3) {
        printf ("Wrong arguments: ./vm_read PID address\n");
        exit(1);
    }
    
    int res;
    mach_port_t target_task = pid2task(atoi(argv[1]));

    vm_address_t addr = atoi(argv[2]);
    vm_offset_t *data;
    mach_msg_type_number_t data_count;
    res = vm_read (target_task, addr, sizeof(int), &data, &data_count);

    if (res != KERN_SUCCESS) {
            printf ("Error reading virtual mem (0x%x), %s \n", res, 
            mach_error_string(res));
            exit(1);
    }
    printf("done\n");

    for (int i=0; i<data_count; ++i){
        printf("byte %d : %x\n",i,((char*)data)[i]);
    }
}

它可以正常工作,但现在我被问到是否可以为 Unix/Linux 编写一个版本,为 Windows 编写另一个版本来做同样的事情。

我一直在搜索,看起来应该没有问题,因为两者都在其进程中使用虚拟内存,但我不确定权限或其他方面是否会出现并发症。

【问题讨论】:

    标签: c operating-system debian virtual-memory mach


    【解决方案1】:

    在 UNIX 上没有标准的方法来访问另一个进程的内存,但在 Linux 上,您可以通过读取特殊文件 /proc/pid/mem:

    char memfile[32];
    snprintf(memfile, sizeof(memfile), "/proc/%s/mem", argv[1]);
    int mfd = open(memfile, O_RDONLY);
    if (mfd < 0) {
        perror("Can't open pid/mem file");
        exit(1); }
    if (lseek(mfd, (off_t)strtoull(argv[2], 0, 0), SEEK_SET) {
        perror("Can't seek to address");
        exit(1); }
    if (read(mfd, &data, sizeof(data)) <= 0) {
        fprintf(stderr, "No data at address %s\n", argv[2]);
        exit(1); }
    

    【讨论】:

    • 我很好奇,这可能会失败吗?一个进程读取另一个进程的内存似乎是一个安全问题,除非它们具有特殊权限。
    • @wxz:如果您没有读取目标进程地址空间的权限,则打开调用将失败(使用 EPERM)。一个人获得或不获得许可的确切方式受到各种能力控制和所有权的影响。 “正常”的 linux 设置为正常进程的所有者提供了读取权限,而没有其他人。具有特殊权限的进程本身通常是不可读的,即使是所有者也是如此。
    【解决方案2】:

    对于 Windows,如果您需要从进程中读取内存,则需要在获取进程句柄时请求 PROCESS_VM_READ(ReadProcessMemory 是适当的调用)。为了获得该句柄,通常使用 OpenProcess 自己启动进程会更容易。

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2015-09-25
      • 2020-02-19
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多