首页
论坛
课程
招聘
[原创]GDA 反编译器简介
2017-8-4 14:21 23902

[原创]GDA 反编译器简介

gjden 活跃值
12
2017-8-4 14:21
23902

GDA简介[官网下载]


GGJoy Dex Analysizer(GDA),国内第一款也是唯一一款全交互式反编译器,并且其不仅只是反编译器,同时也是一款强大、轻便的综合性逆向分析利器,其不依赖任何java库且支持apk,dex,odex,oat文件, 支持python脚本自动化以及方法签名制作与识别。其包含多个由作者独立研究开发的高速分析引擎: 反编译引擎、apk壳检测引擎、 恶意行为检测引擎、污点传播分析引擎、反混淆引擎等等. 此外提供了很多实用工具,如查壳功能、odex转dex、oat转dex、xml二进制解析器、算法工具、android设备内存dump等等功能,在交互式分析上,提供了字符串、方法、类和域交叉引用查询、调用者查询、搜索功能、注释功能、分析结果保存等等功能。

【 GDA反编译器实现原理:】

GDA的反编译器实现采用了7阶段分析的模式,这也是一种类“ 前端 -反编译-后端”的实现方式,但与传统的反编译器实现上有所差别,同时在算法速度和反编译效果上做一些权衡,当然反编译器时刻都在进行优化和提升之中,由于反编译器的实现较为复杂,需要处理的细节比较多,所以此处仅仅是非常简单的介绍GDA的反编译核心实现,实际上也谈不上是实现原理。

1.dex文件解析

dex文件解析主要用于定位类,方法,域以及字符串等等信息,其中反编译器需要用到字节码是直接从method中解析得来,此外GDA还需获取try-catch信息,调试信息等以备后用(主要在代码生成时使用)。

2.指令解码

对方法的字节码进行解码,类似于反汇编,识别出240多条字节码并将其转化为低级中间表式(LIR)和高级中间表式(GDA的中间表式并非如llvm的文本型中间表示,而是内存结构型的表达式),然后对中间表式进行优化,剔除无效语句,然后生成控制流图。GDA中每个低级中间表式都一一对应着字节码指令,高级中间表式的数目小于等于低级中间表式的数目。此外,之后实现的污点传播分析引擎也是基于高级中间表达式进行的。

3.控制流图的生成

扫描每个高级中间表达式,查找分支、跳转指令建立基本块儿(同时把try-catch也考虑进去),进一步建立起控制流图。此外还需要对控制流图进行优化,简化控制流图,去除无意义的基本块,GDA还在这个阶段做一些反混淆的工作,用于对抗一些无用跳转,但是此处作用有限,更进一步的反混淆在数据流分析中实现。

4.数据流分析

有了控制流图,使用DFS遍历控制流图对基本块儿内及块间进行数据流分析,本处GDA并没有采用du(定义使用链)来实现,而是采用了比较快的使用定义计数法来实现数据流分析,对低级中间代码进行优化。此外,数据流分析中,GDA同时实现了类型推断,以给每个低级中间表式的输入输出值确定其类型。同时,反混淆也在数据流分析中实现。

5.高级中间代码生成

优化完成后,就可以生成高级中间代码,按照DFS遍历每个基本块,以基本块为单位进行高级中间代码生成,此处需要应用复制传播来进行低级中间表式的迭代,以生成大幅缩减的代码语句。同时应用调试信息来修改变量符号。

6.结构化分析

GDA到这个阶段实现了多复合条件的分析,并对二路(if-else)、多路(switch-case、try-catch)、环(while、do-while、for)结构进行了结构化分析,为最终代码输出做准备。结构化分析时对于非结构化图,只能采用goto来实现,确保反编译后逻辑正确性。

7.java代码生成

最后按照java的代码格式来生成代码,尤其对于try-catch型的结构,为了防止try块儿于代码的生成以method为单位也可以以类为单位进行代码生成。GDA主要以method为单位,并将类和方法进行了分离。


当然反编译器的实现还只是一个开端,要成为一个可用的交互式反编译器,还需要基于反编译器来支持更多的特性。以下简单贴几张GDA演示图,随后对GDA的使用做一些基本的介绍:





一、主界面


打开GDA并且将要分析apk文件拖拽到软件界面上:



1.查看所有字符串;2.查看所有使用过的字符串;3查看所有API;4.查看AndroidManifest文件;5.十六进制浏览数据;6.可疑(恶意行为分析);7.漏洞静态扫描(尚待实现);8.展开权限并查看权限所属模块(方法);9.类及方法,如果出现多个DexClass*表示apk采用mulitdex技术。10、Dex头,没点击DexClass可展示相应的头,每个色块代表头部不同的区域,鼠标移动在其上面可以看到提示,每个偏移可右键跳转到偏移所在的数据区。11、申请的权限概览;12、搜索/访问记录,双击可查看历史访问;13、点击进入入口函数(method);14、连接android设备进行内存dump。


如果APP被加固处理,GDA会对加固进行自动识别,显示在Dex头和APK权限之间,如图:


点击Entry按钮可以进入到APK的入口函数:


在java代码区,可以按F5查看smali汇编代码。


双击一个方法可以进入该方法,查看其代码,X交叉引用查看调用者。



二、快捷键说明


快捷键功能说明


三、辅助工具


1.二进制XML解码


完全自主实现的解码,可绕过反解码技术,成功解析XML。




2.算法工具


实现加密解密功能,实现了如下算法:

Hash算法: md2 md4 md5 sha sha1 sha224 sha256 sha384 sha512

对称加密:des idea rc2 rc4 rc4-40 rc2-40 rc2-64 bf cast5 aes(128 192 256)及其相应的模式如ecb cbc ofb cfb,其他模式如(cfb1 cfb8)

非对称加密:RSA

编码算法:base62, base64



3.进程模块dump工具


具体使用参考知乎:

https://zhuanlan.zhihu.com/p/26341224



4.搜索工具(S)




四、Android病毒静态分析实例


本节通过一个病毒样本文件来介绍GDA的基本使用方法。

A.概要分析


主要从整体上对APK做一个简单的了解和掌握,以下以一款Android病毒为例来介绍GDA的使用。

1.首先,可以直接将样本拖入GDA,非常快的我们能够看到分析主界面。我们根据主界面判断其是否有加固,如果有加固主界面会显示,如果没有显示代表没有加固。


2.然后可以检查看看该病毒开启了扫描敏感权限,从主界面中我们可以看到该病毒开启了很多敏感权限。


3.我们通过如下红色标记的工具栏看到该APK的签名信息。


4.接下来可以通过树形框中AndroidManifest来分析该病毒所使用的Activity, Service,receive等信息。


5.接下来还可以通过树形框中的MalScan来了解该病毒大致的恶意行为。


可以看出该病毒具有很多恶意的操作。行为描述下面的是产生该种类型的恶意行为的实现方法。双击method@可以进入该方法中查看,比如点击进入第二” #读取联系人、短信等信息:”的[method@0001e5]: com.itcast.cn112.m.a


看smali比较费劲,按F5可以查看反编译的代码。如图


可以看出,这个方法中实现了短信箱的读取,具体方法的分析后面介绍。

6.此外概要分析时,还可以通过查看该APK所使用的字符串和API来做分析。其中AllStrings会获取该APK所有的字符串,而AppStrings只会获取APK有效类会用到的字符串,相对来说AppStrings是更有用的字符串。其中string@区域同样支持交叉引用(X),编辑(右键菜单),双击操作。


AllAPI的method@区域支持交叉引用的功能


B、JAVA伪代码分析


主要从APK的执行逻辑和执行流程上对APK进行全面的分析,以下简单介绍GDA的基本使用那么方法。

1.从入口点分析,点击entry按钮进入APK的执行入口函数,MainActivity的onCreate函数是该APK第一个执行函数。。



为了高效的分析整个APK,我们需要对识别出来的方法或者类进行识别,GDA可以修改方法名称和做注释。

双击a.d();进入该方法


可以看出该方法只是一个做日志的方法,所以我们修改函数名称为log


通过同样的方法,把所有可以识别的方法进行修改。


有时需要进一步描述,因此可以使用注释功能(C)。


很多时候需要看当前方法的调用者,这时可以通过交叉引用来查看。


有时候也需要知道当前字符串在什么地方被使用了,可以把鼠标放在字符串双引号之间,按X查看引用的方法。


做逻辑和流程分析时需要对每个方法进行分析,尽可能覆盖所有方法进行功能识别。



《0day安全 软件漏洞分析技术(第二版)》第三次再版印刷预售开始!

最后于 2019-9-10 14:44 被gjden编辑 ,原因:
收藏
点赞9
打赏
分享
打赏 + 236.00
打赏次数 5 金额 + 236.00
 
赞赏  poppig   +20.00 2018/09/27
赞赏  gotyou   +200.00 2018/07/16
赞赏  无影abc   +5.00 2017/09/07
赞赏  一位没有留下痕迹的看雪读者   +1.00 2017/09/07
赞赏  猫子   +10.00 2017/08/04
最新回复 (102)
雪    币: 2050
活跃值: 活跃值 (53)
能力值: ( LV15,RANK:902 )
在线值:
发帖
回帖
粉丝
kkHAIKE 活跃值 9 2017-8-4 14:47
2
0
win10  报毒
雪    币: 1815
活跃值: 活跃值 (19)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
疯子 活跃值 4 2017-8-4 14:56
3
0
看着挺不错,后面会支持MAC吗?
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-4 15:03
4
0
kkHAIKE win10 报毒
误报,应该是加壳的缘故
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-4 15:04
5
0
疯子 看着挺不错,后面会支持MAC吗?
势单力薄,支持Mac估计是遥遥无期
雪    币: 423
活跃值: 活跃值 (181)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
龙飞雪 活跃值 2017-8-4 15:42
6
0
顶一个,不错
雪    币: 31
活跃值: 活跃值 (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
吴思泉 活跃值 2017-8-4 16:00
7
0
滴滴.只能膜拜了..
雪    币: 466
活跃值: 活跃值 (139)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2017-8-4 18:14
8
0
厉害啊,学习了
雪    币: 80
活跃值: 活跃值 (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 活跃值 2017-8-4 22:10
9
0
就是界面不太好看···  不知道用Qt重写如何哈·  还可以跨平台!!
雪    币: 474
活跃值: 活跃值 (156)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
猫子 活跃值 2017-8-4 22:17
10
0

2.6的很好用,顶一个赞,试一试这个

雪    币: 80
活跃值: 活跃值 (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 活跃值 2017-8-4 22:25
11
0
为啥  双击进入不了函数
雪    币: 196
活跃值: 活跃值 (35)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
netsniffer 活跃值 2017-8-5 11:04
12
0
感谢LZ,工具不错!
把.jar后缀名也支持一下吧(手动改成.apk也可以用);
反编译的smali能切换p命名法么
能把当前类的所有方法反编译到一起,不是每个方法点进去,只  反编译/F5  当前方法;

偶尔点一个类成员,X,列出引用列表,点击其中一个,进去之后,就在当前反编译的java代码中自动搜索不断循环,等一会儿才停下来
方法、变量的交叉引用这块做好就很实用了。
雪    币: 4679
活跃值: 活跃值 (111)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
cqzhou 活跃值 2017-8-5 11:14
13
0
厉害  终于更新了
雪    币: 109
活跃值: 活跃值 (86)
能力值: ( LV11,RANK:195 )
在线值:
发帖
回帖
粉丝
破解pj 活跃值 1 2017-8-5 18:00
14
0
界面丑
雪    币: 32
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小科ken 活跃值 2017-8-5 18:23
15
0
太花了
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-5 22:54
16
0
破解pj 界面丑
逆向分析工具重在功能,本人不是美工,谢谢你老夸奖!!
雪    币: 109
活跃值: 活跃值 (86)
能力值: ( LV11,RANK:195 )
在线值:
发帖
回帖
粉丝
破解pj 活跃值 1 2017-8-6 10:44
17
0
gjden 逆向分析工具重在功能,本人不是美工,谢谢你老夸奖!!
其实就是想让你修改下界面  。直言建议。
雪    币: 221
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
magicxss 活跃值 2017-8-7 09:55
18
0
66666666
雪    币: 1172
活跃值: 活跃值 (109)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
茅山小僧 活跃值 2017-8-7 10:30
19
0
牛叉叉,膜拜
雪    币: 5178
活跃值: 活跃值 (89)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
NightGuard 活跃值 1 2017-8-7 10:35
20
0
好强大,膜拜
雪    币: 7
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
leidianl 活跃值 2017-8-7 10:51
21
0
顶顶顶
雪    币: 7
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mlxdbb 活跃值 2017-8-7 12:26
22
0
支持!!!!
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-7 14:51
23
0
sudami 厉害啊,学习了
相互学习
雪    币: 53
活跃值: 活跃值 (55)
能力值: ( LV15,RANK:843 )
在线值:
发帖
回帖
粉丝
NearJMP 活跃值 5 2017-8-7 15:15
24
0
大神,实现字节码到伪代码的转变,需要哪些方面的知识,有没有相关的开源项目可以学习?
雪    币: 207
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
孤月独明 活跃值 2017-8-7 16:48
25
0
不知道能不能加载多个dex
雪    币: 12
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tershin 活跃值 2017-8-8 17:57
26
0
厉害了
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-8 19:36
27
0
孤月独明 不知道能不能加载多个dex
多个目前还不支持
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-8 19:52
28
0
cqzhou 厉害 终于更新了
雪    币: 42
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xibijj 活跃值 2017-8-9 09:12
29
0

多DEX未支持

雪    币: 7
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
过往烟云 活跃值 2017-8-9 13:33
30
0
大神,这个查壳子是怎么弄的呢,扫描so文件特征词?
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-10 06:03
31
0
NearJMP 大神,实现字节码到伪代码的转变,需要哪些方面的知识,有没有相关的开源项目可以学习?
我最初实现时也寄希望与开源,比如smali2java,但是非常坑人,开源部分反编译效果奇差,而且大量method反编译为空,并且是基于smali文本来做的,于是我完全放弃了smali2java。最后自己研究了一段时间,看了些关于反编译原理相关的论文(基本都是基于intel平台),但是排除与平台相关的,如赋值传递、数据流分析、控制流分析、结构化分析的思想可以直接用。但是Dalvik的程序结构和传统的intel程序结构有很多不一样,所以要做很多的处理。需要解决的新问题主要有循环结构、switch分支、嵌入式try-catch结构的处理(坑爹无极限的结果)等等。
雪    币: 1151
活跃值: 活跃值 (43)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
Ericky 活跃值 6 2017-8-10 12:01
32
0
顶!期待很久了
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-11 11:31
33
0
Ericky 顶!期待很久了
雪    币: 35
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Bruce理 活跃值 2017-8-17 10:30
34
0
厉害呀!!!
雪    币: 3580
活跃值: 活跃值 (126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MsScotch 活跃值 2017-8-17 10:39
35
0
下砸链接?
雪    币: 42
活跃值: 活跃值 (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
windson 活跃值 2017-8-17 10:52
36
0
nice  tool
雪    币: 161
活跃值: 活跃值 (103)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxRea 活跃值 2017-8-17 11:28
37
0
滴滴,nice!
雪    币: 20
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
蓝色炫影 活跃值 2017-8-25 14:10
38
0
gjden 我最初实现时也寄希望与开源,比如smali2java,但是非常坑人,开源部分反编译效果奇差,而且大量method反编译为空,并且是基于smali文本来做的,于是我完全放弃了smali2java。最后自 ...
可以看看java反编译器,cfr和procyon
雪    币: 5
活跃值: 活跃值 (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
影子不寂寞 活跃值 2017-8-25 15:37
39
0
支持了楼主大大。
雪    币: 2848
活跃值: 活跃值 (350)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2017-8-25 15:48
40
0




蓝色炫影

可以看看java反编译器,cfr和procyon

java反编译器更坑人,那是反编译的jar文件,反编译方式完全不同。

雪    币: 197
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
KevinMai 活跃值 2017-8-25 16:08
41
0
Try  it  on,tks!
雪    币: 135
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ntDownload 活跃值 2017-8-28 07:31
42
0
厉害
雪    币: 1172
活跃值: 活跃值 (109)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
茅山小僧 活跃值 2017-8-28 09:15
43
0
怎么没找到在哪下载啊
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
松源兄 活跃值 2017-8-29 09:15
44
0
雪    币: 1
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yippees 活跃值 2017-8-29 13:47
45
0
雪    币: 1205
活跃值: 活跃值 (16)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
elance 活跃值 6 2017-8-30 22:51
46
0
好强大!
雪    币: 5268
活跃值: 活跃值 (74)
能力值: ( LV17,RANK:1145 )
在线值:
发帖
回帖
粉丝
holing 活跃值 15 2017-8-31 00:37
47
0
开源么
雪    币: 11
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
opL 活跃值 2017-8-31 16:27
48
0
大赞
雪    币: 127
活跃值: 活跃值 (110)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
学编程 活跃值 1 2017-9-4 10:36
50
0
啥时候能支持多dex哈
游客
登录 | 注册 方可回帖
返回