首页
社区
课程
招聘
[原创]GDA:国产反编译器快速上手指南
发表于: 2017-8-4 14:21 57049

[原创]GDA:国产反编译器快速上手指南

gjden 活跃值
14
2017-8-4 14:21
57049



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

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

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

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

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

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

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

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

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


当然反编译器的实现还只是一个开端,要成为一个可用的交互式反编译器,还需要基于反编译器来支持更多的特性。


GDA反编译器特性

c++编写,独立于java和android sdk,无需安装java和android sdk即可使用

有效绕过各种字节码陷阱、类型混淆以及anti-disassembling和anti-decompiling技术

支持dex、odex、apk、oat、jar、class、aar文件的反编译分析

支持multi-dex反编译

支持对strings,class,method,field进行交叉引用和搜索(模糊匹配、精确匹配、正则)

支持class、method、field及变量重命名,java代码注释

分析结果保存,odex、oat转dex

设备内存dump,可用于辅助脱壳

反混淆支持

针对字符串、方法、类、域等关键信息提供了强大的搜索、交叉引用

算法工具提供主流大部分算法,可进行加密和解密

Python和Java自动化插件支持

方法签名支持

基于API链的恶意行为识别

变量及寄存器追踪与溯源分析

漏洞扫描,自定义漏洞规则

隐私泄露检测

精细化的程序路径求解

APK取证分析



打开GDA并且将要分析文件拖拽到软件界面上,你将会得到如下分析界面

以上标注具体含义如下:

目标文件基本信息;

Dex文件所使用的API

查看所有字符串;

查看所有被引用过的字符串;

提取出Dex中的所有URL(pro Version)

查看AndroidManifest文件;

十六进制查看器,可编辑数据;

恶意行为扫描分析;

漏洞扫描(Pro Version);

隐私泄露扫描(Pro Version);

展开权限并查看权限所属模块/方法;

点击进入入口函数(method);

连接android设备进行内存dump;

搜索及访问记录,双击可查看;

目标文件各元素的占比分布图;

Dex头,没点击DexClass可展示相应的头,每个色块代表头部不同的区域,鼠标移动在其上面可以看到提示,每个偏移可右键跳转到偏移所在的数据区;

加固软件识别;

当点击到代码中的相关对象时,显示该对象索引值;

当点击到代码中的相关对象时,显示该对象的包名信息;

当点击到代码中的相关对象时,显示该对象的名称;



快捷键功能说明

快捷键

功能说明

X

交叉引用,定位调用者(支持字符串,类,方法,域,实用于smalijava

Esc//Backspace

退回到上一次访问的方法或者类

下一个访问的方法或者类

跳转到指定偏移地址的方法

光标放在变量/方法/类上,可以修改相关名称

全局搜索

添加注释,仅支持java窗口

光标置于方法处,双击可以进入查看方法或者其他数据

M

光标置于指令行时编辑指令,仅支持smali窗口

把焦点放在左边树形控件上,按下up键可以访问基于内存的上一个方法

把焦点放在左边树形控件上,访问基于内存的下一个方法

Dump方法的二进制数据,仅支持smali窗口

对所有编辑框的输入修改生效

16进制显示窗口

Ctr+H

查看搜索记录

Ctr+A

全选

Ctr+C

拷贝所选内容

Ctr+F

查找当前窗口的字符串

Ctr+S

保存当前修改生成GDA数据库文件,如方法名,类名,指令修改、注释。



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

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

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



2.然后可以通过BaseInfo来了解该样本的一些基本情况,如检查看看该病毒开启了扫描敏感权限,从主界面中我们可以看到该病毒开启了很多敏感权限。



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



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

preview

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



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

preview


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

最后于 2022-9-13 14:44 被gjden编辑 ,原因:
收藏
免费 26
支持
分享
打赏 + 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
最新回复 (137)
雪    币: 3502
活跃值: (1493)
能力值: ( LV15,RANK:1057 )
在线值:
发帖
回帖
粉丝
2
win10  报毒
2017-8-4 14:47
1
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
看着挺不错,后面会支持MAC吗?
2017-8-4 14:56
0
雪    币: 6797
活跃值: (4451)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
4
kkHAIKE win10 报毒
误报,应该是加壳的缘故
2017-8-4 15:03
0
雪    币: 6797
活跃值: (4451)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
5
疯子 看着挺不错,后面会支持MAC吗?
势单力薄,支持Mac估计是遥遥无期
2017-8-4 15:04
0
雪    币: 571
活跃值: (4395)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
顶一个,不错
2017-8-4 15:42
0
雪    币: 1
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
滴滴.只能膜拜了..
2017-8-4 16:00
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
厉害啊,学习了
2017-8-4 18:14
0
雪    币: 2324
活跃值: (5063)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
就是界面不太好看···  不知道用Qt重写如何哈·  还可以跨平台!!
2017-8-4 22:10
0
雪    币: 439
活跃值: (1223)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10

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

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

偶尔点一个类成员,X,列出引用列表,点击其中一个,进去之后,就在当前反编译的java代码中自动搜索不断循环,等一会儿才停下来
方法、变量的交叉引用这块做好就很实用了。
2017-8-5 11:04
0
雪    币: 4553
活跃值: (2181)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
厉害  终于更新了
2017-8-5 11:14
0
雪    币: 79
活跃值: (373)
能力值: ( LV11,RANK:195 )
在线值:
发帖
回帖
粉丝
14
界面丑
2017-8-5 18:00
0
雪    币: 42
活跃值: (201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
太花了
2017-8-5 18:23
0
雪    币: 6797
活跃值: (4451)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
16
破解pj 界面丑
逆向分析工具重在功能,本人不是美工,谢谢你老夸奖!!
2017-8-5 22:54
0
雪    币: 79
活跃值: (373)
能力值: ( LV11,RANK:195 )
在线值:
发帖
回帖
粉丝
17
gjden 逆向分析工具重在功能,本人不是美工,谢谢你老夸奖!!
其实就是想让你修改下界面  。直言建议。
2017-8-6 10:44
0
雪    币: 215
活跃值: (372)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
66666666
2017-8-7 09:55
0
雪    币: 1339
活跃值: (2228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
19
牛叉叉,膜拜
2017-8-7 10:30
0
雪    币: 5855
活跃值: (438)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
20
好强大,膜拜
2017-8-7 10:35
0
雪    币: 7
活跃值: (96)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
顶顶顶
2017-8-7 10:51
0
雪    币: 7
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
支持!!!!
2017-8-7 12:26
0
雪    币: 6797
活跃值: (4451)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
23
sudami 厉害啊,学习了
相互学习
2017-8-7 14:51
0
雪    币: 273
活跃值: (470)
能力值: ( LV15,RANK:848 )
在线值:
发帖
回帖
粉丝
24
大神,实现字节码到伪代码的转变,需要哪些方面的知识,有没有相关的开源项目可以学习?
2017-8-7 15:15
0
雪    币: 199
活跃值: (311)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
不知道能不能加载多个dex
2017-8-7 16:48
0
游客
登录 | 注册 方可回帖
返回
//