首页
社区
课程
招聘
[原创]不一样的玩法儿:基于反编译器的Frida支持
2021-7-14 15:35 32364

[原创]不一样的玩法儿:基于反编译器的Frida支持

gjden 活跃值
14
2021-7-14 15:35
32364

一、前言


最近花了些时间来考虑如何结合Frida, 让我们可以在反编译代码上直接对方法或者类进行hook或者调用,初想感觉挺简单,但是实现过程中也有不少坑,比如:1).自动生成js代码,除了定义代码模板外还得考虑静态方法,构造函数,内部类,匿名类,以及混淆后的不可见字符的类或者方法等等问题,以及调用一个方法时参数确定与实例化问题,可能还需要用户介入编辑代码,因此需要提供代码编辑能力;2)独立于命令行窗口,需要自己写一个shell窗口来显示Frida的输出以及命令输入或者其他的交互。

最后花了一些时间来实现这样的一种支持,好在这些问题都得到了解决。结合Frida框架,新的GDA反编译器能够解决如下几个问题:


    1. 如果当前反编译的APK未安装在设备中,则自动安装并启动APP

    2. 自动处理静态方法、构造函数、内部类、匿名类、以及混淆后的不可见字符的类或者方法。

    3. 在反编译代码的基础上,想HOOK那儿就HOOK那儿,无需写任何JS代码便可以看到方法的参数值和返回值。

    4. 在反编译代码的基础上,想执行那儿就执行那儿,GDA自动完成适当地做自动代码生成,最小化代码编写。

    5. 可以实现基于Frida的“带壳HOOK/方法调用”功能,反编译DUMP出的DEX文件,只要android设备中安装有原APP即可自动关联。

    6. 完全自定义JS脚本,自动生成建议代码,满足类似需要修改参数,修改返回值或者其他的需求。


解决了这几个问题,基本能覆盖大部分的工作需求,比如常常遇到设置HOOKHOOK点无法执行;漏洞验证时,无法触发上层调用者等等问题。当然如果代码分析清楚了,也可以写JS代码实现,但在反编译器中操作会方便很多。先上一个效果图:


感谢Mobile Security, GDA 对Frida 的支持得到了Frida 官方的关注和转发,感谢@漏网之鱼同学给予的支持和建议



二、准备工作


下载GDA:


https://github.com/charles2gan/GDA-android-reversing-Tool/releases


       http://www.gda.wiki:9090/


安装python+Frida(网上很多安装教程),确保Frida能够正常使用,。


pip3 install frida

pip3 install frida-tools


验证Frida是否安装成功:Frida --version


三、如何上手



GDA中,你可以实现“指哪儿打哪儿”、“所见即所得”的动态分析效果。因为Fridajava层的HOOK是以方法为单位的,所以对于如下反编译代码:



你只需要右键单击便可进行HOOK或者执行你所点击的方法,同时能够看到动态执行的结果。

上图的反编译代码中1,2,3分别代表三种可以进行操作的点,鼠标单击右键可以对目标做HOOK、执行等操作:右键点击1可以HOOK或者执行当前反编译的方法;2是当前方法调用的方法;3是类对象。1,2既可以做方法的HOOK也可以做类的HOOK3只能做类的HOOK

代码中任何被调用的类和方法都可以直接进行HOOK.



上图是右键菜单中对Frida支持的功能,其中:


1)方法HOOK:第一次HOOK时自动安装并启动当前分析的APK文件,此后做HOOK时不重启APP.

2)方法重启HOOK:每次执行HOOK时都会重启APP.

    


3)执行方法:自己实例化类并执行选定方法,GDA自动生成代码,如果执行方法参数和类构造函数的参数不确定,需要你手动完善后执行(F5),如果当前方法和该方法所属类的构造方法的参数都确定,GDA不弹出代码编辑框直接执行。

4)内存执行:通过搜索设备内存中已存在的类实例来执行当前选择的方法。

    


5)HOOKHOOK当前选中的类的所有方法,如果选中的是方法,HOOK的这是该方法所属的类,除第一次会安装并启动APK外,此后所有HOOK都不会重启APP

6)类重启HOOK:每次执行HOOK时都会重启APP.

    

    

7)自定义JS代码:GDA会提供一个代码模板,你可以完全用自己的代码来覆盖建议代码。




四、代码编辑窗口说明


代码编辑窗口主要用于支持JS代码补全或者自定义代码编写。当我们在执行一个方法时,如果参数的值不能确定,GDA会启用代码编辑窗口并向你展示自动生成的代码,我们手动填写参数,有的参数常常还需要自己实例化,所以我提供了一个代码编辑窗口。当你执行一个方法时,这个方法所属的类还需要进行实例化,因此,需要我们填写两类参数,一类是实例化参数,一类是方法参数。当当前所选方法参数为常数时,GDA会自动补全。如下图所示:



在图中,1是需要你填写的实例化参数,如果是你选的方法是静态方法,此处代码将不会生成。2是需要你填写的方法参数,如果反编译代码中该方法的参数确定,则会自动补充。如下图,填好后,我们可以按F5或者右键Run3)执行代码,执行结果会显示在右侧窗口中。


五、日志窗口


该窗口用来显示Frida的运行结果,你也可以输入Frida的命令执行。其他交互可以通过右键实现,如退出Frida,清屏,重加载,恢复等等。


六、带壳调试



带壳调试需要你先从设备中dumpAPPDex文件,然后将DEX文件拖入GDA反编译,当你第一次HOOK/调用方法时,需要输入APP的包名,之后就可以正常使用了。

关于包名的获取,你可以将原APK拖入GDA,然后在BaseInfo中找到。


但是对于某些壳,该包名会发生变化,那么你可以通过如下命令找到包名:


adb shell pm list packages -f



然后拖入dumpDEXGDA中进行反编译,选择其中一个方法右键Frida Support>Hook  method。会弹出如下输入框,你将前面得到包名填入即可进行HOOK和执行任意方法。




七、对于混淆方法/类的使用说明



在使用过程中常常会遇到一些方法名或者类被混淆后,变得不可见,而在js代码中不允许这样字符串存在,因此需要进行编码。在GDA反编译的代码中的不可见字符表示成了\xXX的形式,因此我在GDA中进行了自动转换,省去了不必要的工作。

另外如果我们选择了反混淆,则看到的当前方法和类都不是原始类,这种情况也不用担心,我也做了自动处理。

演示情况如下:


        目前就做这些支持吧,后需要有空再考虑做更多支持,若有不足之处,还望各位海涵,也请到github上做反馈。



[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-7-17 08:54 被gjden编辑 ,原因:
收藏
点赞56
打赏
分享
最新回复 (97)
雪    币: 5233
活跃值: (3250)
能力值: ( LV10,RANK:175 )
在线值:
发帖
回帖
粉丝
挤蹭菌衣 1 2021-7-14 15:46
2
1
卧槽  这个牛逼  大佬强
雪    币: 5348
活跃值: (5349)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 3 2021-7-14 15:49
3
0
卧槽,牛逼
雪    币: 986
活跃值: (6012)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
Ssssone 2 2021-7-14 15:53
4
0
太强了
雪    币: 17842
活跃值: (59788)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2021-7-14 15:54
5
1
感谢分享!
雪    币: 1445
活跃值: (2044)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
tobeabel 1 2021-7-14 15:59
6
0
太强了
雪    币: 12040
活跃值: (15364)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2021-7-14 16:01
7
0
感谢分享
雪    币: 1040
活跃值: (202)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
bksaro 1 2021-7-14 16:06
8
0
卧槽,牛逼
雪    币: 4339
活跃值: (27067)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
梦幻的彼岸 2 2021-7-14 16:09
9
0
老哥给力,动静结合,分析的时候更方便了,又降低了分析的难度
雪    币: 1028
活跃值: (468)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yikuaiyingbi 2021-7-14 16:21
10
0
6666666666太强了
雪    币: 1148
活跃值: (1179)
能力值: ( LV5,RANK:63 )
在线值:
发帖
回帖
粉丝
Minhal 2021-7-14 16:37
11
1
强啊,
雪    币: 2956
活跃值: (4826)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
舒默哦 1 2021-7-14 18:41
12
0
强,拜读
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kakasasa 2021-7-14 19:10
13
0
mark,感谢分享
雪    币: 146
活跃值: (1155)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
曹无咎 1 2021-7-14 20:10
14
0
niubility!
雪    币: 233
活跃值: (209)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
jindaxia 2021-7-14 20:36
15
0
挖槽,太牛逼了,已经下载试用。
雪    币: 1223
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fuckzg 2021-7-14 22:03
16
0
太强大了,最牛群主啊!马上去更新新版本。
雪    币: 7
活跃值: (223)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bluth 2021-7-14 22:19
17
0
这个着实很牛B
雪    币: 4016
活跃值: (5833)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
fjqisba 2021-7-14 22:56
18
0

太强了,我只想说这真是小母牛敲门,牛逼到家了。

最后于 2021-7-14 22:58 被fjqisba编辑 ,原因:
雪    币: 185
活跃值: (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fireworld 2021-7-14 23:13
19
0
牛逼的功能 明天更新试试
雪    币: 286
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
MrSean 2021-7-15 02:27
20
0
太强了
雪    币: 6569
活跃值: (3823)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
LowRebSwrd 4 2021-7-15 07:22
21
0
不错的功能
雪    币: 481
活跃值: (2163)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
Zard_ 2021-7-15 09:02
22
0
tql 
雪    币: 172
活跃值: (3646)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
TUGOhost 2021-7-15 10:49
23
0
niubi
雪    币: 123
活跃值: (1242)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
胡家二少 2021-7-15 10:54
24
0
nice
雪    币: 7803
活跃值: (21241)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
随风而行aa 10 2021-7-15 12:16
25
0
太强了
游客
登录 | 注册 方可回帖
返回