一、前言
最近花了些时间来考虑如何结合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脚本,自动生成建议代码,满足类似需要修改参数,修改返回值或者其他的需求。
解决了这几个问题,基本能覆盖大部分的工作需求,比如常常遇到设置HOOK后HOOK点无法执行;漏洞验证时,无法触发上层调用者等等问题。当然如果代码分析清楚了,也可以写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中,你可以实现“指哪儿打哪儿”、“所见即所得”的动态分析效果。因为Frida对java层的HOOK是以方法为单位的,所以对于如下反编译代码:
你只需要右键单击便可进行HOOK或者执行你所点击的方法,同时能够看到动态执行的结果。
上图的反编译代码中1,2,3分别代表三种可以进行操作的点,鼠标单击右键可以对目标做HOOK、执行等操作:右键点击1可以HOOK或者执行当前反编译的方法;2是当前方法调用的方法;3是类对象。1,2既可以做方法的HOOK也可以做类的HOOK,3只能做类的HOOK。
代码中任何被调用的类和方法都可以直接进行HOOK.
上图是右键菜单中对Frida支持的功能,其中:
1)方法HOOK:第一次HOOK时自动安装并启动当前分析的APK文件,此后做HOOK时不重启APP.
2)方法重启HOOK:每次执行HOOK时都会重启APP.
3)执行方法:自己实例化类并执行选定方法,GDA自动生成代码,如果执行方法参数和类构造函数的参数不确定,需要你手动完善后执行(F5),如果当前方法和该方法所属类的构造方法的参数都确定,GDA不弹出代码编辑框直接执行。
4)内存执行:通过搜索设备内存中已存在的类实例来执行当前选择的方法。
5)类HOOK:HOOK当前选中的类的所有方法,如果选中的是方法,HOOK的这是该方法所属的类,除第一次会安装并启动APK外,此后所有HOOK都不会重启APP。
6)类重启HOOK:每次执行HOOK时都会重启APP.
7)自定义JS代码:GDA会提供一个代码模板,你可以完全用自己的代码来覆盖建议代码。
四、代码编辑窗口说明
代码编辑窗口主要用于支持JS代码补全或者自定义代码编写。当我们在执行一个方法时,如果参数的值不能确定,GDA会启用代码编辑窗口并向你展示自动生成的代码,我们手动填写参数,有的参数常常还需要自己实例化,所以我提供了一个代码编辑窗口。当你执行一个方法时,这个方法所属的类还需要进行实例化,因此,需要我们填写两类参数,一类是实例化参数,一类是方法参数。当当前所选方法参数为常数时,GDA会自动补全。如下图所示:
在图中,1是需要你填写的实例化参数,如果是你选的方法是静态方法,此处代码将不会生成。2是需要你填写的方法参数,如果反编译代码中该方法的参数确定,则会自动补充。如下图,填好后,我们可以按F5或者右键Run(3)执行代码,执行结果会显示在右侧窗口中。
五、日志窗口
该窗口用来显示Frida的运行结果,你也可以输入Frida的命令执行。其他交互可以通过右键实现,如退出Frida,清屏,重加载,恢复等等。
六、带壳调试
带壳调试需要你先从设备中dump出APP的Dex文件,然后将DEX文件拖入GDA反编译,当你第一次HOOK/调用方法时,需要输入APP的包名,之后就可以正常使用了。
关于包名的获取,你可以将原APK拖入GDA,然后在BaseInfo中找到。
但是对于某些壳,该包名会发生变化,那么你可以通过如下命令找到包名:
adb shell pm list packages -f
然后拖入dump后DEX到GDA中进行反编译,选择其中一个方法右键Frida Support>Hook method。会弹出如下输入框,你将前面得到包名填入即可进行HOOK和执行任意方法。
七、对于混淆方法/类的使用说明
在使用过程中常常会遇到一些方法名或者类被混淆后,变得不可见,而在js代码中不允许这样字符串存在,因此需要进行编码。在GDA反编译的代码中的不可见字符表示成了\xXX的形式,因此我在GDA中进行了自动转换,省去了不必要的工作。
另外如果我们选择了反混淆,则看到的当前方法和类都不是原始类,这种情况也不用担心,我也做了自动处理。
演示情况如下:
目前就做这些支持吧,后需要有空再考虑做更多支持,若有不足之处,还望各位海涵,也请到github上做反馈。
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
最后于 2021-7-17 08:54
被gjden编辑
,原因: