加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

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 -> %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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读