首页
社区
课程
招聘
[原创]全能HOOK框架 JNI NATIVE JAVA ART DALVIK
发表于: 2017-5-13 12:48 39600

[原创]全能HOOK框架 JNI NATIVE JAVA ART DALVIK

2017-5-13 12:48
39600

OneHook

目前比较流行的几个安卓HOOK方案,都有功能上的欠缺,有的不支持art模式,有的不支持jni层,有的不支持侵入HOOK。

所以OneHook诞生了!

这是一个同时支持ART和Dalvik两种模式,理论上支持安卓4.0.3以上所有版本,同时支持JAVA和NATIVE层,使用全局注入技术的侵入式HOOK框架。

本框架不需要额外的安装,可以静态编译到自己的APP中。



首先感谢看雪论坛中很多大牛提供的技术资料,没有你们的分享,就没有目前的这个OneHook的诞生。

感谢ele7enxxh提供的Android Inline Hook模块

项目地址:https://github.com/ele7enxxh/Android-Inline-Hook

项目博客: http://ele7enxxh.com/Android-Arm-Inline-Hook.html

讨论帖: http://bbs.pediy.com/thread-205741.htm

感谢asLody提供的Legend模块

项目地址:https://github.com/aslody/legend

还感谢其他贡献知识的同学们。


功能实现:

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属性 等等....

文档可以参考 https://github.com/ele7enxxh/Android-Inline-Hook

附一个简单的例子

那么,我们现在已经可以完整的实现Native/JNI层的HOOK了。

在adb shell下 输入getprop ro.serialno 会得到返回值 AABBCC 如图:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (50)
雪    币: 1745
活跃值: (2342)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持支持
2017-5-13 13:08
0
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了,修改系统库  elf  文件,  需要  root  手机了吧,  thanks  分享
2017-5-13 17:26
0
雪    币: 275
活跃值: (320)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
不错了,不知道支持的api有多少
2017-5-13 19:43
0
雪    币: 7127
活跃值: (4387)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢  分享
2017-5-13 22:19
0
雪    币: 1339
活跃值: (2228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
6
不错,感谢分享。
2017-5-14 00:03
0
雪    币: 32
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark
2017-5-14 00:50
0
雪    币: 111
活跃值: (239)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
OneHook源码不开放的?
2017-5-15 10:38
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
肯定不是无偿
2017-5-16 00:25
0
雪    币: 93
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark
2017-5-16 10:07
0
雪    币: 241
活跃值: (231)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11

全局HOOK方案理论上是支持7.0的
但目前JAVA层的HOOK框架使用了Legend方案  其支持的最高版本是6.0.1
所以后期可能会考虑使用阿里的AndFix  热补丁方案用来支持7.0


所以目前框架还在开发完善中,还需要做大量的工作来完善。

2017-5-16 14:01
0
雪    币: 267
活跃值: (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
ckis 全局HOOK方案理论上是支持7.0的但目前JAVA层的HOOK框架使用了Legend方案  其支持的最高版本是6.0.1所以后期可能会考虑使用阿里的AndFix ...
想问下,legend对非系统级api的hook效果如何,即对应用自身的类下方法hook
2017-5-17 02:13
0
雪    币: 240
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
期待啊  ,都找不到5.0后  都找不到好的hook框架了
2017-5-17 08:56
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
赞一个
2017-5-17 11:12
0
雪    币: 241
活跃值: (231)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
我对legend框架不是很熟悉  只是使用了其中JAVA  HOOK的模块  具体最终版是否会使用该模块还没有确定
2017-5-22 23:11
0
雪    币: 192
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
adbi  和ddi  hook只支持DALVIK,不支持art的啊,hook支持art是怎么解决的了
2017-5-23 14:45
0
雪    币: 241
活跃值: (231)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
ojlong adbi 和ddi hook只支持DALVIK,不支持art的啊,hook支持art是怎么解决的了
legend框架支持art
2017-5-25 11:00
0
雪    币: 3549
活跃值: (941)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
18
期待源码
2017-5-25 11:48
0
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
厉害,不过7.0以上还是问题
2017-5-25 12:19
0
雪    币: 1037
活跃值: (1780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看qq号就知道是豪
2017-5-25 13:52
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
问下各位,0x02中的程序已经编译好生成libhook.a,下一步该如何操作才可以在adb  shell下  输入getprop  ro.serialno  会得到返回值  AABBCC?   
2017-5-26 17:10
0
雪    币: 7
活跃值: (268)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
mark      楼主是讲了下原理吧      没有开源只好自己实现了
2017-5-27 09:27
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼主,具体怎么push  libc.so文件的,我用的push命令,手机死机了
2017-6-7 15:08
0
雪    币: 241
活跃值: (231)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
24

其实已经有几个朋友按照我提供的方法实现了libc.so的修改  并成功加载了自己的so
证明这套方案是可行的
另外  大家关心的开源问题  暂时不考虑了  虽然理论上是可以实现的  但是距离可以使用的版本  要做的工作太多  而且最近工作也比较忙
剩下的工作大家自己实现吧 

2017-6-20 17:50
0
雪    币: 1844
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
2  自定义的代码位置不一定必须在.text段中,在很多情况下.text段没有足够的空间让你去插入代码,我的解决方案是把这段代码放在.rodata段,如果放在rodata段,在运算地址偏移时,需要+0x10000

lz,这什么意思?asmAddr  +  0x10000?
2017-7-21 00:46
0
游客
登录 | 注册 方可回帖
返回
//