You open the file in read-only mode ( O_RDONLY ). I would suggest trying again with O_RDWR instead:
mem_fd = open(mem_file_name, O_RDWR);
However, from man proc it is not clear that this will work:
/proc/[pid]/mem This file can be used to access the pages of a process memory through open(2), read(2), and lseek(2).
EDIT:
I was also curious, so I put together this example using only 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; }
source share