问题描述
在尝试使用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 (将#修改为@)