c - 如何在没有 ptrace 的情况下将代码注入进程
问题描述
有没有办法在没有 的情况下将代码注入到 ELF 二进制文件ptrace
中,我无法使用它,因为我正在为其编写的程序正在使用 GDB,我不想在注入时停止该进程。我读到它是可能的,/proc/pid/mem
但我找不到任何关于如何做到这一点的信息。我不想使用LD_PRELOAD
任何一个,因为它需要重新启动程序并且我想在运行时执行它。
编辑:我不能使用 ptrace 因为该进程可能已经被 gdb 附加到
解决方案
/proc/pid/mem
表现得像进程内存的图像。要读取/写入进程的内存,只需 open /proc/pid/mem
,然后lseek
到所需的地址和read()
/或write()
您想要的任意多个字节。
例如,要使用 覆盖0x12345
进程中地址处的字节0x90
,您可以这样做
fd = open("/proc/XXX/mem", O_RDWR);
lseek(fd, 0x12345, SEEK_SET);
unsigned char new = 0x90;
write(fd, &new, 1);
在 32 位系统上,lseek64
改为使用(并#define _LARGEFILE64_SOURCE
在标准包含之前添加)。
请注意,访问/proc/XXX/mem
需要与 ptrace 进程相同的权限。特别是,在某些系统上,您可能需要成为 root。
推荐阅读
- jenkins - 当 CPU 使用率高时,Jenkins 使 Kubernetes 节点卡住
- computer-vision - “R-CNN 变体中使用的 BB 回归算法”与“YOLO 中的 BB”定位技术有什么区别?
- mysql - 每周每天每小时的登录次数?
- java - 如何将 cookie 添加到 Undertow 的 ClientRequest?
- bash - 使用 bash 脚本删除特定的行集
- python - 如何将 DataFrame 列的非空条目组合成新列?
- javascript - 使用 intro.js 时几乎看不到 D3 工具提示
- celery - 如何向用户显示预定的 cron - Celery 调度程序?
- flutter - 如何从推送通知导航到 BottomNavigationBar 上的特定选项卡?
- javascript - 如何使用css在顶部导航栏上添加后退按钮?