【GDA简介】
GDA是一款由本人对反编译理论的长期研究和实践而形成的全交互式反编译器,世界上唯一一款用c++写的android-java反编译器,中国第一款也是唯一一款全交互式反编译器。其简洁、轻便、快速,无需安装,也无需java和android sdk环境支持。支持apk、dex、odex、oat、jar、aar、class文件的反编译分析,GDA中包含多个由本人独立研究的高速分析引擎: 反编译引擎、漏洞检测引擎、恶意行为检测引擎、污点传播分析引擎、反混淆引擎、apk壳检测引擎等。
在Android可执行文件反编译分析上,GDA摆脱了使用java速度慢的问题,完全采用C++完成核心反编译引擎的编写,并且使用了字节码直接转java伪代码的解析方式,无需转换成smali汇编后在做反编译,大大提升了解析速度。
此外,在反编译引擎的基础上,我做了一些更加实用的功能,如路径求解、 漏洞检测、隐私泄露检测、查壳、odex转dex、oat转dex、加解密算法工具、android设备内存dump等等功能,在交互式分析上,提供了( multi-dex的跨dex的 )字符串、方法、类和域交叉引用查询、调用者查询、搜索功能、注释功能、分析结果保存等等功能。
快速上手:https://bbs.pediy.com/thread-220111.htm
新版下载:官网 或者github
运行环境:win7,xp,win8,win10(注意由于加壳的缘故使得win10或者杀毒软件报毒,请自行甄别)
【GDA反编译器实现原理】
GDA的反编译器实现采用了7阶段分析的模式,这也是一种类“ 前端 -反编译-后端”的实现方式,但与传统的反编译器实现上有所差别,同时在算法速度和反编译效果上做一些权衡,当然反编译器时刻都在进行优化和提升之中,由于反编译器的实现较为复杂,需要处理的细节比较多,所以此处仅仅是非常简单的介绍GDA的反编译核心实现,实际上也谈不上是实现原理。
1.dex文件解析
dex文件解析主要用于定位类,方法,域以及字符串等等信息,其中反编译器需要用到字节码是直接从method中解析得来,此外GDA还需获取try-catch信息,调试信息等以备后用(主要在代码生成时使用)。
2.指令解码
对方法的字节码进行解码,类似于反汇编,识别出240多条字节码并将其转化为LIR(低级中间表式)和HIR(高级中间表式)(注释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辅助分析】
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文件中的类和方法的相关信息,其中分别以列表和字典的方式 来组织类和方法,提高类和方法的访问速度。使用方法
GDA3.88更新
1.搜索支持精确匹配("string")、模糊匹配(string)、正则匹配(~"string")。
2.修复CTR+C,CTR+A未生效的问题。
3.修复选择dx.bat后的崩溃问题。
4.修复漏洞扫描过程中的崩溃问题。
5.修复multi-dex下交叉引用丢失一部分调用者的问题。
6.修复指令编辑的一处bug。
7.优化整数最小值最大值显示。
8.修复无法发现父类和接口的问题。
9.添加接口与实现类,父类与子类的方法连接。
10.修复频繁快速返回操作导致卡顿的问题。
11.更换了进度显示方式。
阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开
发者可享99元/年,续费同价!
最后于 2021-2-16 18:35
被gjden编辑
,原因: