Ptrace允许写入可执行程序段,但process_vm_writev不允许

问题描述

在尝试使用C语言在Linux上编辑运行过程的操作码时,我发现无法使用process_vm_writev通过PID使用ptrace和{{1}来通过PID编辑程序操作码。 } 我能做到。 pwrite返回-1,而process_vm_writev则说“地址错误”。但是,当我将ptrace与相同的地址一起使用时,它会成功。我以root身份运行程序。这是GNU / Linux的问题,我应该在GitHub上打开一个问题吗? errno代码(不包括简短的代码):

process_vm_writev

ssize_t write_pmem(pid_t pid,off_t addr,void* value,size_t size) { struct iovec local[1]; local[0].iov_base = value; local[0].iov_len = size; struct iovec remote[1]; remote[0].iov_base = (void*)addr; remote[0].iov_len = size; return process_vm_writev(pid,local,1,remote,0); } int main() { pid_t pid; off_t opcode_ptr = 0x45B5A7; printf("PID: "); scanf("%d",&pid); char nops[5] = {0x90,0x90,0x90}; ssize_t res = write_pmem(pid,opcode_ptr,&nops,sizeof(nops)); printf("%ld\n%s",res,strerror(errno)); /* and it prints: -1 Bad address */ return 0; } /proc/PID/maps是该过程的0x45B5A7(无写权限),但我认为它对于根目录仍然是可写的。

我想使用新的process_vm Linux API,所以我想修复该代码。有什么想法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)