linux – 编写跟踪进程的内存.
发布时间:2020-12-13 23:08:05 所属栏目:Linux 来源:网络整理
导读:我正在玩 linux中的ptrace.我试图使用/ proc / pid / mem接口编写跟踪进程的内存. 我用来完成这个任务的功能是: void write_proc(pid_t child,unsigned long int addr) { char mem_file_name[100]; char buf[10]="hope"; int mem_fd; memset( (void*)mem_fi
我正在玩
linux中的ptrace.我试图使用/ proc / pid / mem接口编写跟踪进程的内存.
我用来完成这个任务的功能是: void write_proc(pid_t child,unsigned long int addr) { char mem_file_name[100]; char buf[10]="hope"; int mem_fd; memset( (void*)mem_file_name,100); memset( (void *)buf,10); sprintf(mem_file_name,"/proc/%d/mem",child); mem_fd = open(mem_file_name,O_RDONLY); lseek(mem_fd,addr,SEEK_SET); if (write(mem_fd,buf,5) < 0 ) perror("Writing"); return; } 但我总是得到错误:写:错误的文件描述符. 是否可以使用此方法编写跟踪过程? 解决方法
您正在以只读模式(O_RDONLY)打开文件.我建议再试一次O_RDWR:
mem_fd = open(mem_file_name,O_RDWR); 然而,从man proc来看,目前尚不清楚它是否会起作用:
编辑: 我也很好奇,所以我直接用ptrace()把这个例子放在一起: #include <sys/ptrace.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define SHOW(call) ({ int _ret = (int)(call); printf("%s -> %dn",#call,_ret); if (_ret < 0) { perror(NULL); }}) char changeme[] = "This is a test"; int main (void) { pid_t pid = fork(); int ret; int i; union { char cdata[8]; int64_t data; } u = { "Hijacked" }; switch (pid) { case 0: /* child */ sleep(1); printf("Message: %sn",changeme); exit(0); case -1: perror("fork"); exit(1); break; default: /* parent */ SHOW(ptrace(PTRACE_ATTACH,pid,0)); SHOW(ptrace(PTRACE_POKEDATA,changeme,u.data)); SHOW(ptrace(PTRACE_CONT,0)); wait(NULL); break; } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |