利用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 文件中隐含的逻辑。