/AndroidGotHook

Simple Android ARM&ARM64 GOT Hook

Primary LanguageC++

Simple Android ARM&ARM64 GOT Hook

基于链接视图和执行视图,解析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.txtlibinject.so作为动态库链接。

nativelib.cppJNI_OnLoad中调用hackBySegment替换getpid函数。

Java层调用stringFromJNI函数通过JNI获取pid并显示。

注释inject.cpphack函数体后,编译生成apk,运行即可。(不注释将查找一次victim-patch,不影响运行)

通过JNI加载

在Java层通过System.loadLibrary加载。最终调用到Native层的LoadNativeLibrary函数。

其中首先调用dlopen加载so(linker调用构造函数)。成功后查找JNI_OnLoad并调用。

原理见andorid linker 解读1----从loadLibrary到dlopen

存在的问题

  1. 未绕过dlopen命名空间限制,在Android 7以上无法打开非公共库
  2. 未hookdlopen,无法实时修改加载模块的GOT表
  3. 基于maps解析,兼容性可能存在一定问题
  4. 基于静态注入,无法绕过完整性检测
  5. 未提供卸载函数,无法恢复GOT表
  6. ...

总结

通过本项目,学习了GOT Hook原理,ELF文件结构和导入符号的查找方式,目的基本达到。虽然功能还不够完善,但短期内应该不会再改动了(这次是真的了)。

实际应用可以考虑使用字节的bhook

参考

android中基于plt/got的hook实现原理

聊聊Linux动态链接中的PLT和GOT(2)——延迟重定位

constructor属性函数在动态库加载中的执行顺序

Android7.0以上命名空间详解(dlopen限制)

Android中GOT表HOOK手动实现

Android GOT Hook

基于Android的ELF PLT/GOT符号和重定向过程ELF Hook实现

ELF文件格式与got表hook简单实现

重定位节 - 链接程序和库指南

符号表节 - 链接程序和库指南

散列表节 - 链接程序和库指南

动态节 - 链接程序和库指南

ELF文件结构详解

PLT HOOK

bhook

xhook