【发布时间】:2019-04-08 17:36:44
【问题描述】:
我写了一个小程序来读写进程的内存,但我不明白为什么它不起作用。 这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/ptrace.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
int main()
{
pid_t pid=3169;
char mem_file_name[2048];
int mem_fd;
int offset=0;
char buf[1005128];
sprintf(mem_file_name, "/proc/%d/mem", pid);
mem_fd = open(mem_file_name, O_RDWR,S_IRWXU);
printf("1 %s\n",strerror(errno));
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
printf("2 %s\n",strerror(errno));
waitpid(pid, NULL, 0);
printf("3 %s\n",strerror(errno));
lseek(mem_fd, offset, SEEK_SET);
printf("4 %s\n",strerror(errno));
read(mem_fd, buf, _SC_PAGE_SIZE);
printf("5 %s\n",strerror(errno));
ptrace(PTRACE_DETACH, pid, NULL, NULL);
printf("6 %s\n",strerror(errno));
printf("%s\n",buf );
}
这是我的输出:
1 Success
2 Success
3 Success
4 Success
5 Input/output error
6 Input/output error
我用
编译gcc -Wall -Wextra main.c
我以 root 权限运行
sudo ./a.out
在此示例中,我仅尝试从进程中读取,但它不起作用。 我的想法是dump一个进程的内存,但是不知道为什么读不出来。
ps 我知道有一些工具可以转储进程的内存,但是我想创建一个小程序来练习。
【问题讨论】:
-
首先,对于大多数系统调用,
errno的值是 undefined,除非之前的函数确实失败了。当他们失败时,他们会用一个特定的返回值(通常是-1)来指示它,你不能使用errno来检查一个函数是否失败,因为它的值是(如上所述)undefined .您需要阅读您使用的函数的文档(如the manual pages)。
标签: c memory process operating-system