備忘録

備忘録

Linuxで他プロセスのメモリを読み書きする方法

Ⅰ. はじめに

タイトルの通り「Linuxで他プロセスのメモリを読み書きする方法」です。
Windowsの場合はOpenProcessしてプロセスのハンドルを取得した後にReadProcessMemory, WriteProcessMemoryすればOKです。

Ⅱ. サンプルプログラム

メモリを読み書き「される」側(a.cpp)
#include <stdio.h>
#include <unistd.h>

int main(void) {
  auto x = 100;

  while(true) {
    printf("%p = %d\n", &x, x);
    sleep(1);
  }

  return 0;
}
メモリを読み書き「する」側(b.cpp)
#include <sys/uio.h>
#include <stdio.h>

int main(void) {
  pid_t pid = 397;
  int buffer;
  struct iovec local, remote;

  local.iov_base = &buffer;
  local.iov_len = sizeof(int);
  remote.iov_base = reinterpret_cast<void*>(0x7ffff09c81d4);
  remote.iov_len = sizeof(int);

  // 他プロセスのメモリを読む
  process_vm_readv(pid, &local, 1, &remote, 1, 0);
  printf("%d\n", buffer);

  // 他プロセスのメモリに書き込む
  buffer = 200;
  process_vm_writev(pid, &local, 1, &remote, 1, 0);

  // 他プロセスのメモリを読む(2回目)
  process_vm_readv(pid, &local, 1, &remote, 1, 0);
  printf("%d\n", buffer);

  return 0;
}

Ⅲ. 実行結果

f:id:kagasu:20180122233654p:plain