可以读取 Unix/Linux 上的虚拟内存吗?在 Windows 上?
Is possible to read virtual memory on Unix/Linux? And on Windows?
我正在使用 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 编写另一个版本来做同样的事情。
我一直在搜索,看起来应该没有问题,因为它们都在他们的进程中使用虚拟内存,但我不确定是否会出现权限或其他任何问题。
对于 Windows,如果您需要从进程中读取内存,则需要在获取进程句柄时请求 PROCESS_VM_READ(ReadProcessMemory 是合适的调用)。为了获得该句柄,通常更容易使用 OpenProcess 自己启动进程。
在 UNIX 上没有访问另一个进程内存的标准方法,但在 Linux 上,您可以通过读取特殊文件 /proc/pid 来实现/内存:
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); }
我正在使用 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 编写另一个版本来做同样的事情。
我一直在搜索,看起来应该没有问题,因为它们都在他们的进程中使用虚拟内存,但我不确定是否会出现权限或其他任何问题。
对于 Windows,如果您需要从进程中读取内存,则需要在获取进程句柄时请求 PROCESS_VM_READ(ReadProcessMemory 是合适的调用)。为了获得该句柄,通常更容易使用 OpenProcess 自己启动进程。
在 UNIX 上没有访问另一个进程内存的标准方法,但在 Linux 上,您可以通过读取特殊文件 /proc/pid 来实现/内存:
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); }