GDA简介[官网下载]
GGJoy Dex Analysizer(GDA),国内第一款也是唯一一款全交互式反编译器,并且其不仅只是反编译器,同时也是一款强大、轻便的综合性逆向分析利器,其不依赖任何java库且支持apk,dex,odex,oat,aar,jar,class文件, 支持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反编译器特性】
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可展示相应的头,每个色块代表头部不同的区域,鼠标移动在其上面可以看到提示,每个偏移可右键跳转到偏移所在的数据区;
加固软件识别;
当点击到代码中的相关对象时,显示该对象索引值;
当点击到代码中的相关对象时,显示该对象的包名信息;
当点击到代码中的相关对象时,显示该对象的名称;
二、快捷键说明
快捷键功能说明
快捷键 | 功能说明 |
F5 | 在反编译代码与smali代码之间切换 |
X | 交叉引用,定位调用者(支持字符串,类,方法,域,实用于smali和java) |
Esc/◄/Backspace | 退回到上一次访问的方法或者类 |
► | 下一个访问的方法或者类 |
G | 跳转到指定偏移地址的方法 |
N | 光标放在变量/方法/类上,可以修改相关名称 |
S | 全局搜索 |
C | 添加注释,仅支持java窗口 |
鼠标双击 | 光标置于方法处,双击可以进入查看方法或者其他数据 |
M | 光标置于指令行时编辑指令,仅支持smali窗口 |
▲ UP | 把焦点放在左边树形控件上,按下up键可以访问基于内存的上一个方法 |
▼ Down | 把焦点放在左边树形控件上,访问基于内存的下一个方法 |
D | Dump方法的二进制数据,仅支持smali窗口 |
Enter | 对所有编辑框的输入修改生效 |
H | 16进制显示窗口 |
Ctr+H | 查看搜索记录 |
Ctr+A | 全选 |
Ctr+C | 拷贝所选内容 |
Ctr+F | 查找当前窗口的字符串 |
Ctr+S | 保存当前修改生成GDA数据库文件,如方法名,类名,指令修改、注释。 |
三、Android病毒静态分析实例
本节通过一个病毒样本文件来介绍GDA的基本使用方法。
A.概要分析
主要从整体上对APK做一个简单的了解和掌握,以下以一款Android病毒为例来介绍GDA的使用。
1.首先,可以直接将样本拖入GDA,非常快的我们能够看到分析主界面。我们根据主界面判断其是否有加固,如果有加固主界面会显示,如果没有显示代表没有加固。
2.然后可以通过BaseInfo来了解该样本的一些基本情况,如检查看看该病毒开启了扫描敏感权限,从主界面中我们可以看到该病毒开启了很多敏感权限。
3.我们通过如下红色标记的工具栏看到该APK的签名信息。
4.接下来可以通过树形框中AndroidManifest来分析该病毒所使用的Activity, Service,receive等信息。
5.接下来还可以通过树形框中的MalScan来了解该病毒大致的恶意行为。
可以看出该病毒具有很多恶意的操作。行为描述下面的是产生该种类型的恶意行为的实现方法。双击method@可以进入该方法中查看,比如点击进入第二” #读取联系人、短信等信息:”的[method@0001e5]: com.itcast.cn112.a.a
如果对反编译结果有疑问,可以按F5查看smali代码。如图
可以看出,这个方法中将相关的信息以短信的方式发送出去,具体方法的分析后面介绍。
6.此外概要分析时,还可以通过查看该APK所使用的字符串和API来做分析。其中AllStrings会获取该APK所有的字符串,而AppStrings只会获取APK有效类会用到的字符串,相对来说AppStrings是更有用的字符串。其中string@区域同样支持交叉引用(X),编辑(右键菜单),双击操作。
AllAPI的method@区域支持交叉引用的功能
B、JAVA伪代码分析
主要从APK的执行逻辑和执行流程上对APK进行全面的分析,以下简单介绍GDA的基本使用那么方法。
1.从入口点分析,点击entry按钮进入APK的执行入口函数,MainActivity的onCreate函数是该APK第一个执行函数。。
如果代码内容太多,我们需要做页内代码搜索,这种情况下,可以按CTR+F启动页内搜索对话框。如下图:
为了高效的分析整个APK,我们需要对识别出来的方法或者类进行识别,GDA可以修改方法名称和做注释。
双击a.d()进入该方法,可以看出该方法只是一个做日志的方法,所以我们修改函数名称为log
通过同样的方法,把所有可以识别的方法进行修改。
有时需要进一步描述,因此可以使用注释功能(C)。
很多时候需要看当前方法的调用者,这时可以通过交叉引用来查看。
有时候也需要知道当前字符串在什么地方被使用了,可以把鼠标放在字符串双引号之间,按X查看引用的方法。
做逻辑和流程分析时需要对每个方法进行分析,尽可能覆盖所有方法进行功能识别。
四、辅助分析
1、隐私泄露检测
GDA的隐私泄露检测引擎是基于GDA反编译器的低级中间表示做寄存器追踪来实现的,其检测内核以轻量级高速污点传播引擎FlashFlow为基础, 通过扫描APP中的所有可能的敏感数据生成点(DataPin)做污点传播分析来确定泄露点。同时记录有效泄露点与敏感数据生成点之间的路径, 以方便做路劲回溯,并且输出隐私泄露报告。使用方法
2、漏洞扫描
GDA漏洞扫描引擎由漏洞检测引擎和规则解释引擎构成:漏洞检测引擎采用两级HASH TABLE来存储method,以实现method的快速定位, 同时结合GDA独有高速反编译内核、HIRA(高级中间表示分析器)、API链检测器等底层分析模块构建而成的一个高效漏洞检测引擎。 规则解释引擎采用基于堆栈状态机的规则判定法,同时采用了一种以动态执行的方式进行规则解释(动态规则解释器)。 其中规则表达式通过词法分析器和语法分析器将规则表达式存入堆栈,规则解释器是基于堆栈做规则表达式的解释执行。 这里之所以是动态的,体现在两个方面:1、词法分析器和语法分析器从左到右扫描规则,一旦检查出一条完整表达式后或者检测到算符优先级下降时, 就会调用解释器做堆栈执行,这里不会将整条规则解析到堆栈后再调用解释器执行;2、动态解释执行后的结果是一种布尔状态的值(结果中常常还会携带有更复杂的参数), 同样GDA的规则解释引擎也不会等到所有表达式执行完后再做规则判定,而是采用效率更高的动态判定方法。使用方法
3、GDA-路径求解
程序路径求解问题的应用方向, 漏洞挖掘:当我们确定程序的攻击面后,需要知道攻击面上的点是否与脆弱函数存在一条可以联通的路径。 隐私泄露:对于程序中的任意敏感数据获取函数,需要知道这些数据是否被泄露出去。 恶意代码分析:对于恶意代码中的敏感函数,需要确定这些敏感函数是否被触发。 其他:闭源代码审计,程序半自动化分析等。 使用方法
4、GDA-APK取证
当我们在做android APK取证分析或者恶意代码分析时,会想知道一个APK中各个文件的原始时间以确定该代码项目的最早产生时间, 最后一次签名的时间等等信息,以及对apk内的所有文件进行全局检索,收集相关线索和证据:如IP地址,域名,URL,DB文件名,apikey等等信息。 于是便在GDA反编译器中加入该工具,以应对一些特殊的使用场景。使用方法
5、GDA脚本批量解密APP字符串向导
一些APK尤其是Android恶意代码会将自身的一些重要的字符串进行加密,加大逆向分析的 难度,这类字符串往往数量比较大,很难一个一个进行处理。本文将介绍一种方法来解密这 种字符串,并将解密的字符串应用于反编译器中。使用方法
6、GDA数据流追踪分析
FlashFlow采用上下文无关的数据流分析算法,可实现任意位置任意变量或寄存器的追踪, 并且无需对环境进行初始化,无需做任何配置。这样使得FlashFlow可以GDA反编译器进行 很好的结合,成为一个极为简单易用的辅助功能。该功能可对单个变量和寄存器进行分析 (隐私扫描功能目前仅用于测试,没有开放在GDA反编译器中),目前支持smali代码下的任 意寄存器的值数据流分析,以及java代码中对一个method的参数和返回值进行数据流分析。使用方法
7、GDA python脚本自动化分析
为了能够更加灵活的提供分析和信息交互,GDA从3.6版本开始提供了对python脚本的支持。 GDA为分析人员提供了整个APK文件中的类和方法的相关信息,其中分别以列表和字典的方式 来组织类和方法,提高类和方法的访问速度。使用方法
8、二进制XML解码
9、算法工具
实现加密解密功能,支持如下算法:
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
10、进程模块dump
具体使用参考知乎:
https://zhuanlan.zhihu.com/p/26341224
11、搜索工具(S)