动态注入
- 指将一段程序或一个完整的可执行文件加载到目标程序中
- 和 Hook 的异同
- 同:
- 都会修改目标程序的运行时行为
- 异:
- Hook:用 Hook 框架对程序 Hook 后,会修改原方法或原函数的指针,让其转去执行 Hook 的方法
- 动态注入:通过进程读写技术将一段代码或程序写进目标程序的内存空间,然后修改目标程序的指令指针,让加载的代码执行
- 同:
so 动态库注入
-
指将 so 动态库注入目标 APK,然后执行 so 动态库中的某个函数的技术
-
步骤:
- 编写 Native 代码,定义 so 加载后要执行的函数,将其编译为 so 文件。这一步用 AS 配合 Android NDK 完成
- 编写注入程序,实现远程进程注入。注入程序用 Native 代码编写,要用到 ptrace 系统的进程调试接口函数
- 将 so 文件注入目标进程
- 运行 so 文件中指定的函数
-
以下代码演示了 so 动态库注入的完整过程:
int inject_remote_process(pid_t target_pid, const char* library_path, const char* function_name, void* param, size_t param_size) { ... if (ptrace_attach(target_pid) == -1) return EXIT_SUCCESS; if (ptrace_getregs(target_pid, ®s) == -1) goto exit; // save original registers memcpy(&old_regs, ®s, sizeof(regs)); mmap_addr = get_romete_addr(target_pid, libc_path, (void