linux – 编写跟踪进程的内存.

linux – 编写跟踪进程的内存.,第1张

概述我正在玩 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 我正在玩 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来看,目前尚不清楚它是否会起作用:

06001

编辑:

我也很好奇,所以我直接用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 -> %d\n",#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: %s\n",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;}
总结

以上是内存溢出为你收集整理的linux – 编写跟踪进程的内存.全部内容,希望文章能够帮你解决linux – 编写跟踪进程的内存.所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1018835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存