本帖最后由 gjden 于 2019-9-24 16:44 编辑
GDA3简介(下载链接: www.gda.wiki:9090)
GDA是一款由本人对反编译理论的长期研究和实践而形成的全交互式反编译器。GDA是国内第一款也是为一款全交互式反编译器,一款简洁、轻便、快速的交互式Android反编译分析工具,无需安装,也无需java和android sdk环境支持,目前支持apk、dex、multi-dex 、odex、oat类型的android文件反编译分析。
在Android可执行文件反编译分析上,GDA摆脱了使用java速度慢的问题,完全采用C++完成核心反编译引擎的编写,并且使用了字节码直接转java伪代码的解析方式,无需转换成smali汇编后在做反编译,大大提升了解析速度。
此工具提供了很多实用工具,如查壳功能、odex转dex、oat转dex、xml二进制解析器、算法工具、android设备内存dump等等功能,在交互式分析上,提供了( multi-dex的跨dex的 )字符串、方法、类和域交叉引用查询、调用者查询、搜索功能、注释功能、分析结果保存等等功能。
在GDA3中我重写了所有反编译器代码,从反汇编、数据流分析、中间语言优化、结构化分析等都做了重大算法改变,同时极大的优化DEX解析引擎、恶意行为检测引擎、查壳引擎,相比GDA1、GDA2,在分析速度、稳定性、使用体验方面都有极大的改善和提升。
运行环境:win7,xp,win8,win10(注意由于加壳的缘故使得win10或者杀毒软件报毒,请自行甄别)
【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为单位,并将类和方法进行了分离。
当然反编译器的实现还只是一个开端,要成为一个可用的交互式反编译器,还需要基于反编译器来支持更多的特性。
111.gif (833.38 KB, 下载次数: 9)
gda界面
2018-5-29 11:31 上传
222.gif (934.74 KB, 下载次数: 5)
search
2018-5-29 11:45 上传
333.gif (786.93 KB, 下载次数: 7)
hunxiao
2018-5-29 15:13 上传
GDA3.66
1.(需root)设备dump功能支持android 5以上,支持64位arm系统
2.修复内部类名称在package显示过程中的不一致问题
3.删除了反编译代码中的多余label
4.优化数组初始化的反编译显示
5.加强了URL搜索的特征
6.类成员名称自动重命名
7.import支持超链接
8.重写设计了代码着色器的着色算法,大大提高了超大方法作色速度
9.修复了在multi-dex分析中速度会明显变慢的问题
10.修复了误入HexView,再后退(esc)时的一些问题
GDA3.65
1.修复反编译结构化分析的一些问题
2.修复易语言编写的apk出现乱码的问题
3.修复了按“下箭头键”出现鼠标跟随的问题
4.优化了反编译代码
5.调整gda分析保存结果的文件处理,支持了multidex的分析保存。
6.按光标位置对相应的小括号高亮
GDA3.63
1.优化反编译器
2.纠正字体配置时,重启丢失问题
3.调整了反编译代码输出策略
GDA3.62更新
1.为反编译器编写了污点传播分析引擎,实现了正向污点传播识别sinks,以及反向污点传播识别source。加入大量source特征和sink特征,可以用于寄存器变量追踪、数据流分析、自动分析隐私泄露、恶意行为等。
2.对内容搜索(ctr+f)添加了搜索列表功能,以及双击列表项自动定位功能。
3.对反编译引擎进行了变量处理。
4.优化了一些操做细节。
5.添加了双击goto偏移的页内跳转功能,对于smali代码点击goto或者if后面偏移地址,对于java则点击goto之后label即可。
GDA3.60 更新
1.添加URLs字符串功能,DexClass右键->UrlStrings
2.为了支持后续污点传播分析以及模拟执行支持,重构了数据流分析部分,以方便后续功能扩展。
3.为了方便使用python的库进行自动化分析,添加了对python脚本的支持,需要安装32位的python2.7。
4.改善了反编译效果,对于方法中存在非结构化控制流图时,我采取return归约的方法降低jmp语句出现的概率,此外还修复了多处比较少见的bug。
5.对于空方法自动命名为Null_*
6.对get和set方法进行自动识别
7.添加了字节码签名功能,方便后续进行恶意代码特征库的构建,同时可以用于反混淆,以及库函数的识别。
8.添加了中文和英文动态切换的功能,默认为英文界面,菜单view->chinese
9.添加了get和set方法自动命名功能。
10.进一步加强了反编译器的稳定性和容错能力
11.修复了符合条件下,反编译会出现条件反转的问题。
12.分析MultiDex时,修复了在跨Dex交叉引用过程中,部分特殊方法无法交叉引用到的问题。
13.修复了快速频繁按下小盘的上下箭头键时的崩溃问题。
14.添加更多的加固和打包器特征,可识别国外主流加固或者打包厂商,识别标识里添加了加固链接。
15.重新优化了分析引擎,为后续的批量apk分析提供支持。
GDA3.54 更新
1.添加了数字类型的转化功能,点击数字右键可以实现十进制、八进制、16进制以及字符之间相互转化。
2.对于存在操作历史的文件时,默认显示操作历史窗口
3.优化AllString操作,原来分析速度较慢,容易出现界面假死,目前速度得到较大提升。
4.微调了配色窗口
5.对反编译器做进一步优化和bug修复,如修复了条件反转问题。
6.修复对.gda文件加载后无法显示权限的问题
7.修复了跨Dex进行部分method访问时,无法发现method的问题。
8.对每个方法添加了package标注和返回方法查看。
9.增加了对查找记录管理,可右键进行删除和清理操作。10.对MultiDex增加了字符串、方法、APIS、可疑行为扫描等功能,点击DexClass{2,3,...}右键可用
GDA3.53 更新
1.修复了一些Bug
2.添加了显示色彩的配置,可导入导出颜色方案文件
3.界面做了些微调。
GDA3.51 更新记录
1.支持MultiDex,并且实现多个Dex之间的自动跳转、交叉引用。本人采用的方法有别于其他任何分析工具,主流的如JEB、apktool通过将多个Dex组合成为单个Dex之后再进行分析,失败概率很大,而GDA采用了Dex分组解析以及跨Dex关联技术,可完美解析。
2.修复了3.45版本的多处二笔Bug,并做了相关优化。
3.对已分析的方法进行作色标记。
4.对每个方法添加了package标注和返回方法查看。
5.修正了class、field被混淆成为特殊字符后无法进行交叉引用、修改等问题。
6.增强了OAT转dex功能,提高了稳定性和兼容性。
7.为了兼容MultiDex,修改了头部的显示。
GDA3.4更新
bug修复:
1.修复算法工具bug
2.修复n操作重命名操作大小写不敏感的问题。
3.修改了类和字符串点击阴影作色的策略
4.修复了编译器引擎的几处Bug
5.修复了高版本DEX文件无法打开的问题
6.修正了反编译超大函数时出现畸形代码问题。
7.修正了对称加密算法加解密时出错的问题。
8.修正方法参数类型为根类时,无法显示参数类型问题。
9.修正了在进行两个相同文件名的APK文件分析时出现当前文件未分析到的问题。功能更新
1.对优化后DEX的反编译做了兼容,使其能够正确反编译(之前会出现崩溃)
2.添加了交叉引用的method与string在调用者方法中的定位着色功能。
3.进一步优化了扫描引擎,大大提升了扫描的速度。
4.修改了类的显示方式,之前的类显示过于简单。
5.增加了申请访问权限与模块(method)的关联功能。
6.区分了类(对象)和方法的重命名操作,当光标在点号之前时,按n可以对对象变量进行从命名,点号之后为method重命名。
7.增加了java伪代码中的双击类变量(对象)/域时跳转到类的功能,类的交叉引用。
8.增加了java伪代码中field和类(对象)的识别,其中field支持双击后在类中查看,交叉引用,重命名。类/对象双击可查看类,以及类的交叉引用。
9.增加了父类的查看定位功能
10.增加了子类的查看定位功能
11.增加了树形框下类的实时搜索功能,鼠标移动到树形框,搜索框会自动显示并获得焦点。
12.增加近期文件的打开历史记录,点击文件可以直接加载分析。
13.增加了历史分析文件的搜索记录,CTR+H可以调出搜索历史,双击搜索历史项可以弹出搜索内容,双击右边的搜索项,可以自动弹出搜索结果。
14.最大化时取消了任务栏覆盖功能
15.增加了java伪代码的显示模式的选择,可以选择try-catch模式与非try-catch模式,默认设置为了不显示try-catch。
16.增加了对屏幕的适配,防止小分辨率下窗口无法显示完全。细节:1.对优化后DEX的反编译做了兼容,使其能够正确反编译(之前会出现崩溃)
2.添加了交叉引用的method与string在调用者方法中的定位着色功能。
3.进一步优化了扫描引擎,大大提升了扫描的速度。
4.修改了类的显示方式,之前的类显示过于简单。
5.增加了申请访问权限与模块(method)的关联功能。
6.区分了类(对象)和方法的重命名操作,当光标在点号之前时,按n可以对对象变量进行从命名,点号之后为method重命名。
7.增加了java伪代码中的双击类变量(对象)/域时跳转到类的功能,类的交叉引用。
8.增加了java伪代码中field和类(对象)的识别,其中field支持双击后在类中查看,交叉引用,重命名。类/对象双击可查看类,以及类的交叉引用。
9.增加了父类的查看定位功能10.增加了子类的查看定位功能
11.增加了树形框下类的实时搜索功能,鼠标移动到树形框,搜索框会自动显示并获得焦点。
12.增加近期文件的打开历史记录,点击文件可以直接加载分析。
13.增加了历史分析文件的搜索记录,CTR+H可以调出搜索历史,双击搜索历史项可以弹出搜索内容,双击右边的搜索项,可以自动弹出搜索结果。
14.最大化时取消了任务栏覆盖功能
15.增加了java伪代码的显示模式的选择,可以选择try-catch模式与非try-catch模式,默认设置为了不显示try-catch。16.增加了对屏幕的适配,防止小分辨率下窗口无法显示完全。/历史更新
3.0更新
1.对恶意行为扫描引擎,极大的提高了恶意行为扫描速度,比以前扫描速度提升了2倍以上。
2.增加全局导入API扫描功能,可查看该APK所使用的所有有效API功能(其中包含所使用的native函数)
3.优化了点击字符自动背景作色算法,大大改善了作色的速度,尤其是在大函数中,体验会比较明显。
4.完全重写了反编译引擎,本次花费了大量精力深入研究反编译理论技术并且实现了Android字节码的反编译,反编译效果已经非常接近JEB。
5.修复S/s快捷键搜索类时,双击类无法显示类的bug.6.对GDA文件做了文件关联(需要开启注册表HKEY_CLASSES_ROOT的读写权限)
一、主界面说明
打开GDA并且将你所要分析apk文件拖拽到软件界面上:
【图片已被删除】
如果APP被加固处理,GDA会对加固进行自动识别,显示在Dex头和APK权限之间,如图
:
【图片已被删除】
点击OPTLoad可以进入到APK的入口函数:
在汇编代码区,可以按F5反编译当前方法。
双击进入被调用函数,X交叉引用查看调用者。
二、快捷键说明
快捷键功能说明GDA快捷键功能说明
快捷键功能说明
X交叉引用,定位调用者(支持字符串,类,方法,域,实用于smali和java)
Esc/
->下一个访问的方法或者类
G跳转到指定偏移地址的方法
N光标放在变量/方法/类上,可以修改相关名称
S全局搜索
C添加注释,仅支持java窗口
鼠标双击光标置于方法处,双击可以进入查看方法或者其他数据。
M光标置于指令行时编辑指令,仅支持smali窗口
UP把焦点放在左边树形控件上,按下up键可以访问基于内存的上一个方法
Down把焦点放在左边树形控件上,访问基于内存的下一个方法
DDump方法的二进制数据,仅支持smali窗口
Enter对所有编辑框的输入修改生效
H16进制显示窗口
Ctr+A全选
Ctr+C拷贝
Ctr+V粘贴仅适用可剪切的控件)
Ctr+X剪切(仅适用可剪切的控件)
Ctr+F查找当前窗口的字符串
Ctr+S保持当前修改生成GDA数据库文件,如方法名,类名,指令修改、注释。
三、辅助工具
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@000067]: com.phone.stop.b.b.run
看smali比较费劲,按F5可以查看反编译的代码。如图
可以看出,这个方法中实现了短信箱的读取,具体方法的分析后面介绍。
6.此外概要分析时,还可以通过查看该APK所使用的字符串和API来做分析。其中AllStrings会获取该APK所有的字符串,而AppStrings只会获取APK有效类会用到的字符串,相对来说AppStrings是更有用的字符串。
其中string@区域同样支持交叉引用(X),编辑(右键菜单),双击操作。
AllAPI的method@区域支持交叉引用的功能
B、JAVA伪代码分析
主要从APK的执行逻辑和执行流程上对APK进行全面的分析,以下简单介绍GDA的基本使用那么方法。
1. 从入口点分析,点击OPTLoad进入APK的执行入口函数,MainActivity的onCreate函数是该APK第一个执行函数。
为了高效的分析整个APK,我们需要对识别出来的方法或者类进行识别,GDA可以修改方法名称和做注释。双击h.a();进入该方法
可以看出只是做一个初始化,所以我们修改函数名称为initStr
通过同样的方法,把所有可以识别的方法进行修改。
有时需要进一步描述,因此可以使用注释功能(C)
。
很多时候需要看当前方法的调用者,这时可以通过交叉引用来查看。
有时候也需要知道当前字符串在什么地方被使用了,可以把鼠标放在字符串双引号之间,按X查看引用的方法。
做逻辑和流程分析时需要对每个方法进行分析,尽可能覆盖所有方法进行功能识别。
下载:http://www.gda.wiki:9090/down.php