利用IDA Pro静态分析和动态调试so文件

我们已经初步了解了一些逆向相关的知识,通过 jadx-gui 和 JEB 等工具,我们可以成功把 apk 文件中的 Java 代码反编译出来,在此基础上就可以查看实现逻辑了。但这个反编译过程仅仅停留在 Java 层面,这是什么意思呢?本节我们来详细解释一下。

在 Java 中有一个叫作 JNI 的东西,它的全称是 Java Native Interface,即 Java本地接口,这是 Java 调用 Native 语言的一种特性(这里说的Native 语言通常指 C/C++)。有了 JNI,Java 就可以调用由 C/C++ 编写的代码了。

JNI 是 Java 语言里本身就存在的,由于 Android 代码是基于 Java 编写的,因此 Android 自然也能使用 JNI 调用 C/C++ 编写的代码。

使用 JNI 有什么好处呢?对一些 Android App 来说,其中一个很大的好处便是可以提升防护等级,因为使用 C/C++ 编写好某个代码逻辑后,这部分代码会被编译到一个以 so 为名字后缀的文件(例如 libnative.so 文件)中,然后 Java 层需要直接加载该 so 文件并调用 so 文件暴露出来的方法来得到某个结果。重要的是,如果仅通过 jadx-gui 反编译,是无法把这个 so 文件还原成原来的 C/C++ 代码的,因为 jadx-gui 只能处理到 Java 层,对 Native 层则无能为力。换言之,如果某个加密算法是在 Native 层实现的,那么仅依靠反编译是无法知晓其中的真正逻辑的,这就进一步提高了逆向的难度。

那要想还原 so 文件中原本的 C/C++ 代码,有办法吗?有,但不能是反编译了,需要用反汇编。

其实,还原完整的 C/C++ 代码几乎是不可能实现的,但我们可以通过一些反汇编工具得到底层的汇编代码,我们可以通过这些代码的执行逻辑大致还原出对应的 C/C++ 代码。那有什么工具可以做到这一点呢?目前比较流行的就是 IDAPro 工具。

本节我们会以一个实现了 Native 层参数加密的 App 为例,初步分析其基本情况,然后试着用 IDA Pro 逆向它并还原 so 文件中的逻辑。在这个过程中,我们需要用 IDA Pro 工具对 so 文件进行静态分析和动态调试,以便更好地理解 so 文件中隐含的逻辑。

IDA Pro的简介

准备工作

抓包和反编译

静态分析

动态调试

算法还原

总结

本节我们介绍了使用 IDA Pro 工具对 so 文件进行逆向分析的过程,直接还原出了 so 文件中的算法并实现了数据爬取,整个难度其实不小。当然,本节主要介绍的是利用 IDA Pro 逆向分析 Android App 的基本流程,其功能远不止这个,更多强大的功能等待着你的探索。