5

私は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, 0, 100);
  memset( (void *)buf, 0, 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;

}

しかし、私は常にエラーを受け取ります:書き込み:不正なファイル記述子。

この方法を使用してトレースされたプロセスを作成することは可能ですか?

4

2 に答える 2

4

ファイルを読み取り専用モードで開いています(O_RDONLY)。O_RDWR代わりに、もう一度試してみることをお勧めします。

  mem_fd = open(mem_file_name, O_RDWR);

ただし、man procこれが機能するかどうかは明らかではありません。

   /proc/[pid]/mem
          This  file can be used to access the pages of a process's memory
          through open(2), read(2), and lseek(2).

編集:

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, 0));
    SHOW(ptrace(PTRACE_POKEDATA, pid, changeme, u.data));
    SHOW(ptrace(PTRACE_CONT, pid, 0, 0));
    wait(NULL);
    break;
  }

  return 0;
}
于 2013-03-23T11:15:04.870 に答える
2

ptrace(2)は非常に難解なシステムコールであり、デバッガーなどでのみ使用されます。

確かに、文書化されたPTRACE_POKEDATA要求ptrace は機能するはずであり(トレースされたプロセスが停止している場合)、トレースされたプロセスのメモリに書き込むことができます。mmaptoへの書き込み(または-ing)が機能するかどうかはわかり/proc/$pid/memません。

グーグルで検索すると、これlinux write /proc /memは特に読み取り専用に設計されていることを示唆して いますが、最近のカーネルでは書き込み可能になっている可能性があります。しかし、カーネルソースツリーからの最近のDocumentation / filenames / proc.txtは、多くを語っていません。/proc/$pid/mem

私は書くことに注意するでしょう/proc/$pid/mem; それが機能する場合(そして機能しない場合もあります)、おそらくカーネルバージョン固有です。

おそらくmmap、そのファイルの一部のセグメントを-ingすることは機能し/proc/$pid/memます(しかし、私にはわかりません)。あなたはそれを試しましたか?

対照的に、PTRACE_POKEDATA動作するはずです(Linuxが存在する前にSunOSや他の多くのUnixに存在していました)。もちろん、かなり遅いです。

于 2013-03-23T11:41:27.777 に答える