下一步:我们可以在 Python 和 C++侧加入对内存的监控,以解决跨语言内存泄漏难以调试
的问题
动态代码注入 overview
动态代码注入,针对是进程,比如修改进程的寄存器、内存值等等;动态跟静态最大的区别
是,动态不需要改动源文件,但需要高权限(通常是
root
权限)
动态注入技术,本质上就是一种调度技术。功能:查看变量值,修改变量值,跟踪进程跳转,
查看进程调用堆栈等等。动态注入相比于普通的调试,最大的区别就是动态注入是一个
”
自
动化调试并达到加载自定义动态链接库
“
的过程。所谓自动化,其实就是通过代码实现,在
Linux
上通过
Ptrace
就可以完成上面所有功能,当然
Ptrace
功能是比较原始的,平时调试
中的功能还需要很多高层逻辑封装才可以实现
过程:
如下图所示,进程 A 注入到进程 B 后,通过修改寄存器和内存,让进程 B 加载自定义的动态
库 a,当 a 被加载后,a 会尝试加载其他模块,比如加载 dex 文件等等,具体的注入过程如
下:
ATTATCH,指定目标进程,开始调试;
GETREGS,获取目标进程的寄存器,保存现场;
SETREGS,修改 PC 等相关寄存器,使其指向 mmap;
POPETEXT,把 so path 写入 mmap 申请的地址空间;
SETRESG,修改 PC 等相关寄存器,使其指向 dlopen;
SETREGS,恢复现场;DETACH,解除调试,使其恢复;
代码:
https://github.com/boyliang/Poison
感谢
https://blog.csdn.net/l173864930/article/details/38456313
在 Linux 上动态代码注入
利用 linux-inject:一个注入程序,可以注入一个.so 文件到一个运行中的应用程序进程中。
类似于 LD_PRELOAD 环境变量所实现的功能,但它可以在程序运行过程中进行动态注入,而
LD_PRELOAD 是定义在程序运行前优先加载的动态链接库
实例教程:https://blog.csdn.net/hpp24/article/details/52125568
评论0