运行中的进程页面权限可以修改吗?有哪些可行的实现方法?
修改目标进程内存权限的可行方案
原有汇编Stub方案的替代实现
你无需手动编写汇编Stub并手动注入到目标地址空间,现有系统API已经可以直接实现同逻辑的需求:
- Linux/Android 平台:使用
ptrace系统调用附着到目标进程后,直接修改目标进程的寄存器参数,触发mprotect系统调用即可。如果是更复杂的逻辑,也可以先向目标进程内存写入动态库路径,调用dlopen加载自定义so后直接在so内部执行mprotect逻辑,全程不需要手写汇编 - Windows 平台:调用
OpenProcess获取目标进程句柄后,使用CreateRemoteThreadAPI,直接将VirtualProtect作为线程入口函数传入,系统会自动在目标进程地址空间执行该函数完成权限修改
无需注入目标进程的替代方案
如果你的场景允许当前进程持有目标进程的调试权限,可以完全绕开修改目标进程内存权限的步骤:
- Linux 平台下直接调用
process_vm_readv/process_vm_writev系统调用,当前进程只要持有CAP_SYS_PTRACE权限,就可以直接读写目标进程的任意地址内存,不需要修改目标进程的页面权限 - 如果你操作的是当前进程自身的内存,直接调用
mprotect即可,不需要任何注入逻辑,示例代码如下:
#include <sys/mman.h> #include <stdio.h> int main() { // 示例:修改0x400000起始的4KB页面为可读可写可执行权限 int res = mprotect((void*)0x400000, 4096, PROT_READ | PROT_WRITE | PROT_EXEC); if (res == -1) { perror("mprotect执行失败"); return 1; } return 0; }
内容的提问来源于stack exchange,提问作者Aaa Bbb
相关产品推荐
相关产品推荐

