手把手教你使用Ghidra逆向移动应用程序

2021-02-19
309

写在前面的话

众所周知,Ghidra是一个免费的开源软件,可以对包括移动应用程序在内的可执行程序(二进制)进行逆向工程分析。Ghidra支持在多个操作系统平台上安装和使用,包括Windows、Linux和MacOS。

安装Ghidra

提醒:我们的整个测试过程都在Linux平台进行。

首先,点击【这里】下载Ghidra。

下载好之后,打开Linux终端,然后安装依赖组件:

sudo apt install openjdk-11-jdk

解压下载好的Ghidra包,打开Ghidra文件夹然后运行下列命令,此时将会打开Ghidra-GUI:

./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文件中找到。

总结

没错,就是这么简单!希望大家能从中受到一些启发,并应用到日常的逆向工程或安全分析活动中。

转载时必须以链接形式注明原始出处及本声明