首页
社区
课程
招聘
[原创]Android dalvik hook的另外一种实现形式
发表于: 2014-5-8 20:02 30076

[原创]Android dalvik hook的另外一种实现形式

2014-5-8 20:02
30076
几天前,在看雪安卓版块的论坛上,看到有人发表了一份dalvik hook的实现代码,这里小弟果断献丑下,给提供一份dalvik hook的另外一种实现。

首先解释下dalvik虚拟机中的Method结构体,Method结构体声明在源码目录树下的dalvik/vm/oo/Object.h文件内,在dalvik的世界中,每一个java方法都有一个对应的Method对象,
dalvik虚拟机在执行java方法时,就会通过该方法的Method对象调用到方法的具体实现代码,Method结构体内有个成员,名位insns,该字段保存着java方法具体的实现代码。那么我今天提供的这个dalvik hook的实现原理就是通过修改Method对象中的insns字段的值来达到hook java的目的。

这里简短的用文字的形式描述下Hook的实现过程。

现在有一个返回字符串的函数原型声明为:
public String truth()
{
       return "hello from truth";
}
另外声明一个方法为:
public String fake()
{
       return "fake string";
}
之后,该类被加载后,分别获得truth和fake方法的Method对象,并将fake方法的实现代码赋值给truth的Method对象,之后,应用程序调用truth方法时,获得的字符串为"fake string"。

这里简单的总结下 http://bbs.pediy.com/showthread.php?t=186054 这篇帖子中的dalvik hook实现的潜在问题,在该文章中,完成dalvik hook,需要修改Method对象中最多达到6个字段的值,这在hook频繁被调用到的方法时,是不可避免的遇到多线程安全问题的,而且,这个问题是不可避免的,除非能确保在hook例如函数A时,确定A是未被执行过。

这是我在看雪发的第一篇帖子,同时也是人生中的第一篇技术交流贴,以后希望能和大家多多交流,不足之处,请大家帮忙提出。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个能HOOK API 不??!!
2014-5-22 17:12
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持下。。。。。。。
2014-6-3 17:16
0
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
4
思路蛮好玩的,移动到Android安全区~
2014-6-15 20:40
0
雪    币: 17
活跃值: (1892)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这种方法有问题,考虑得太少。
2014-6-15 20:57
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
    把相应API的Method结构体找到,应该就能Hook对应的API了。
2014-6-16 09:21
0
雪    币: 37
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
那个啥加固不就是这样做的吗……
2014-6-16 17:55
0
雪    币: 25
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这种方式对有形参,不同类,方法类型都有限制是吗
2014-6-17 11:07
0
雪    币: 95
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
是的,这个只适用于java方法A1 hook java方法A2、以及native方法N1 hook native方法N2这样的情景。不过这个相对于《xxxhook java中的世界》中提到的那种hook方法,要更加的多线程安全,因为那篇文章中提到的dalvik hook,需要修改Method结构体多达5个左右的字段值,这样的修改对被频繁调用的java方法来说,很容易造成多线程问题。我在发这篇帖子的时候,链接后面是有段这样的总结的,但是发帖后发现这总结莫名的没了。
2014-6-17 13:08
0
雪    币: 95
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个只要是相同的形参和返回值就ok的了。
2014-6-17 13:09
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
更完善的实现就是Xposed框架
2014-6-17 16:47
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
xposed不是通过修改成native的方式来完成的吗
2014-6-18 15:24
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢楼主分享, dalvik没问题, 但是在art上不行, 希望楼主研究一下, 给个答案.
2014-6-20 18:22
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错,学习一下
2014-8-5 16:28
0
雪    币: 98
活跃值: (364)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
如果有形参也可以?我测试有形参就不行勒
2015-8-6 19:48
0
雪    币: 64
活跃值: (134)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark一下,不错的讲解
2015-8-24 17:23
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
17
两个不同env中的method可不可以通过这种方式hook替换呢
2016-6-6 16:07
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
18
要不要这么的犀利,哇哈哈哈谢谢分享,看看
2016-6-6 16:21
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
JNI is currently hijacking "insns" as a function pointer, set after the first call. For internal-native this stays null.
2017-3-2 18:21
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
你这个其实跟andfix原理一样, 都是基于davild 来换method
2017-3-3 14:19
0
游客
登录 | 注册 方可回帖
返回
//