OneHook
目前比较流行的几个安卓HOOK方案,都有功能上的欠缺,有的不支持art模式,有的不支持jni层,有的不支持侵入HOOK。
所以OneHook诞生了!
这是一个同时支持ART和Dalvik两种模式,理论上支持安卓4.0.3以上所有版本,同时支持JAVA和NATIVE层,使用全局注入技术的侵入式HOOK框架。
本框架不需要额外的安装,可以静态编译到自己的APP中。
首先感谢看雪论坛中很多大牛提供的技术资料,没有你们的分享,就没有目前的这个OneHook的诞生。
感谢ele7enxxh提供的Android Inline Hook模块
项目地址:0b7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8r3f1%4k6h3&6^5P5r3S2Q4x3V1k6m8L8X3c8J5L8$3W2V1i4K6u0V1d9h3&6D9K9h3&6W2i4K6u0V1d9r3!0G2K9H3`.`.
项目博客: 545K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3g2D9k6e0N6W2L8Y4S2^5K9q4)9J5k6h3y4G2L8g2)9J5c8V1q4F1k6s2u0G2K9h3c8Q4x3X3c8m8M7X3#2Q4x3X3c8u0L8X3I4A6L8X3g2Q4x3X3c8t1L8$3!0C8i4K6u0W2K9s2c8E0L8l9`.`.
讨论帖: http://bbs.pediy.com/thread-205741.htm
感谢asLody提供的Legend模块
项目地址:d4cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7$3I4G2k6s2W2Q4x3V1k6D9k6h3N6W2L8X3b7`.
还感谢其他贡献知识的同学们。
功能实现:
0x01
首先考虑如何进入系统,如何在合适的位置和时间启动我的模块。之前做WIN32的时候就有人说过,如果在WINDOWS启动前前运行我的代码,那么我无所不能。理论上,这句话是成立的。
所以在安卓系统,我也需要找一个相对足够早的位置来启动我的模块,这个位置我没有选择init进程,而是libc.so。
为什么?
因为安卓的底层是LINUX构建的,LINUX的底层就是C语言,而libc.so就是C语言的具体实现库,在这个位置上插入代码显然是合适的。而且在libc.so中去执行我们的代码,就不需要去考虑如何注入模块,因为安卓的所有进程都会主动加载libc.so。这是一个一举两得的方案,首先解决了启动代码,其次解决了注入问题。
原理/过程:
so文件的初始化工作 是在init_array段中定义的

.init_array段的起始位置为:0X000683C0

初始化时 会按照顺序去执行初始化函数
_ZL14....
_ZL30....
_ZL29....
_ZL31....
那么如果把_ZL14__libc_preinitv的指针重定向到一个物理地址,使之dlopen我们自己的so,就可以实现我们想要的功能。

修改init_array的段的第一个指针 _ZL14__libc_preinitv ---> 0x55D24

指向位置的机器码
机器码对应的C语言代码
这样就可以顺利的在每个进程中加载libckis.so文件
关于如何修改libc.so文件使之加载自定义库文件的方法 可以参考我的另外一篇文章
http://bbs.pediy.com/thread-213043.htm
需要注意的是
1 在不同安卓版本中,libc.so是不一样的。
2 自定义的代码位置不一定必须在.text段中,在很多情况下.text段没有足够的空间让你去插入代码,我的解决方案是把这段代码放在.rodata段,如果放在rodata段,在运算地址偏移时,需要+0x10000
3 libc.so修改后需要妥善的push到手机的/system/lib目录下,要注意权限问题,否则手机会死机
0x02
现在我们已经进入了安卓的Native层,在这里,我们可以做很多事情,比如HOOK fopen来控制底层文件的访问 也可以HOOK __system_property_get来修改ro属性 等等....
文档可以参考 4fdK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8r3f1%4k6h3&6^5P5r3S2Q4x3V1k6m8L8X3c8J5L8$3W2V1i4K6u0V1d9h3&6D9K9h3&6W2i4K6u0V1d9r3!0G2K9H3`.`.
附一个简单的例子
那么,我们现在已经可以完整的实现Native/JNI层的HOOK了。
在adb shell下 输入getprop ro.serialno 会得到返回值 AABBCC 如图:

[培训]科锐逆向工程师培训第53期2025年7月8日开班!