基于链接视图和执行视图,解析ELF,查找导入函数偏移值,替换函数地址。
详见:简易Android ARM&ARM64 GOT Hook (一)
简易Android ARM&ARM64 GOT Hook (二)
使用Android Studio
打开项目,点击Make Project
编译完成后,在模块名/build/intermediates/cmake/debug/obj/CPU架构/
目录下,
可以找到生成的可执行文件(victim
)和动态库(libinject.so
)
workdir
文件中包含补丁脚本、adb测试脚本。编译完成后按顺序运行即可
victim_app
模块是一个例子。
通过配置CMakeLists.txt
将libinject.so
作为动态库链接。
在native-lib.cpp
的JNI_OnLoad
中调用hackBySegment
替换gitpid
函数。
Java层调用stringFromJNI
函数通过JNI获取pid并显示。
注释inject.cpp
的hack
函数体后,编译生成apk,运行即可。(不注释将查找一次victim-patch
,不影响运行)
在Java层通过System.loadLibrary
加载。最终调用到Native层的LoadNativeLibrary
函数。
其中首先调用dlopen
加载so(linker
调用构造函数)。成功后查找JNI_OnLoad
并调用。
原理见andorid linker 解读1----从loadLibrary到dlopen
- 未绕过
dlopen
命名空间限制,在Android 7
以上无法打开非公共库 - 未hook
dlopen
,无法实时修改加载模块的GOT表 - 基于maps解析,兼容性可能存在一定问题
- 基于静态注入,无法绕过完整性检测
- 未提供卸载函数,无法恢复GOT表
- ...
通过本项目,学习了GOT Hook
原理,ELF文件结构和导入符号的查找方式,目的基本达到。虽然功能还不够完善,但短期内应该不会再改动了(这次是真的了)。
实际应用可以考虑使用字节的bhook
聊聊Linux动态链接中的PLT和GOT(2)——延迟重定位