写在前面的话
众所周知,Ghidra是一个免费的开源软件,可以对包括移动应用程序在内的可执行程序(二进制)进行逆向工程分析。Ghidra支持在多个操作系统平台上安装和使用,包括Windows、Linux和MacOS。
安装Ghidra
提醒:我们的整个测试过程都在Linux平台进行。
首先,点击底部【阅读原文】下载Ghidra。
下载好之后,打开Linux终端,然后安装依赖组件:
代码语言:javascript复制sudo apt install openjdk-11-jdk
解压下载好的Ghidra包,打开Ghidra文件夹然后运行下列命令,此时将会打开Ghidra-GUI:
代码语言:javascript复制./ghidraRun
打开Ghidra之后,我们就可以开始了!
使用Ghidra对Android APK文件进行逆向工程分析
接下来,我们将反编译一个APK文件,并拿到Java源码。
下图显示的是整个反编译流程:
此时需要考虑的事情如下:
大多数编程语言都可以有解释器和编译器,比如说,Python既可以作为编译程序执行,也可以作为解释语言执行。 大多数命令行工具、PowerShell和Unix Shell也是一种解释语言。 高级语言翻译(解释器/编译器)通常将源代码直接翻译成机器代码。然而,翻译器和反汇编程序可以将代码生成为汇编语言。
在Ghidra中导入APK
第一步:在Ghidra-GUI中,创建一个项目目录,选择file > new project > non-shared project,然后输入项目目录路径和项目名称。
第二步:导入一个APK文件,文件名为diva-beta.apk。选择File > Import File > diva-beta.apk,然后选择Batch来引入所有文件和目录,或者点击File > Batch Import也可以。然后将Depth Limit设置为一个较高的值,点击rescan来搜索类文件:
注意,diva-beta.apk会被提取为两个文件:cleasses.dex和lib。
Ghidra会解压这两个文件为其已编译的java文件(.class),并编译动态连接共享对象库(.so文件)。
反汇编和反编译导入的Batch批处理文件
双击任意一个编译文件或共享库文件,将会弹出分析选项,我们选择所有并执行分析。
这里,我打开的是hardcode2Activity.class文件,并分析其反汇编和反编译数据。
Decompiler — 显示源代码; Disassembler — 显示汇编代码; Program Trees —突出显示代码部分; Symbol Trees — 按以下类别显示程序中的符号:外部、函数、标签、类和命名空间; Data Type Manager — 显示3种数据类型:“内置”、“用户定义”和“派生”。它允许用户定位、组织和应用程序的数据类型; Console Scripting — 显示脚本的输出;
分析导入的Batch文件
在Program Trees中,可以双击任何源代码来以反编译和反汇编模式查看和分析它们。尽管对于反编译代码,我还是会使用jadx-gui(一个“dex-to-JAVA”反编译工具)来查看源代码,但在这里我们可以看到DivaJni类的对象引用已经创建(实例化),接下来它会用来判断是授予访问权限还是拒绝访问权限。
注意,在Ghidra的“Data Type Manager”下,我们可以看到HardcodeActivity.class包含两个类文件。这也就意味着,hardcode2activity使用了两个类文件来执行一个活动。我们还可以从反编译源码中发现,它实例化了Divajni类。
接下来,我们打开Divajni.class,下面的反编译源码表明,这里加载了一个名为divajni的库:
现在,是时候打开lib目录下的libdivajni.so了。
在菜单栏,选择Search > For Strings > check pascal strings。我们可以在底部发现两个可疑的字符串:
双击其中一个字符串,工具将引导你找到它的位置。关键之处在于,我被授权了可访问olsdfgad;lh。
这个硬编码的供应商密钥可以在libdivajni.so/.rodata文件中找到。
总结
没错,就是这么简单!希望大家能从中受到一些启发,并应用到日常的逆向工程或安全分析活动中。