安卓逆向实战:极简APP
引言
今天我们来逆向一个简单的安卓 APP。
appbasic1
appbasic1 地址:https://appbasic1.scrape.center/
appbasic1 说明:
极简 App 案例,只有一个按钮和回调提示框,逻辑在 Java 层实现,适合做 Hook 分析。
一个很简单的 APP,只有一个按钮和很简单的逻辑,先安装看下效果,adb 命令将 APP 传过去。

安装看看,也可以直接使用 adb Install 命令来安装,效果是一样的。

点击按钮,弹窗显示一个数字 3,现在我们来逆向看看它的逻辑。
首先需要安装 jadx-gui 工具,因为我是 MacOS 系统,安装方法是使用 brew 命令:brew Install jadx-gui。

打开 jadx-gui,正常来说打开后是这样的界面。然后打开 appbasic1 对应的 apk 文件。
在左侧的源代码中打开反编译后的源代码,可以看到一大堆类路径,这些一般都是安卓系统的类库,我们要如何找到我们想要找的类呢?一般情况下,默认的程序入口都是 MainActivity 类,我们直接搜索。


双击 MainActivity 类,整个 MainActivity 类的源代码都可以看到了。
从代码中可以看到,只有三个方法,一个是 onCreate 方法,初始化用的,一个 onClickTest 回调方法,是在点击 Test 按钮的时候调用的方法。还有一个就是在点击按钮的时候调用的方法,叫 getMessage,它输入两个整形值,返回一个字符串。
整体的逻辑就是在点击 Test 按钮的时候,调用 getMessage 方法,传入 1 和 2 两个整形值,返回它们的和的字符串,也就是 3。
appbasic2
appbasic2 地址:https://appbasic2.scrape.center/
appbasic2 说明:
极简 App 案例,只有一个按钮和回调提示框,逻辑在 Native 层实现,适合做逆向和 Hook 分析。
和上面的 APP 一样,只有一个按钮和调用提示框,但是实际的逻辑在 Native 层实现的,Native 层就是我们所说的 so 层,也就是使用 C++ 或者 Go 或者其他语言开发的 Linux 系统的动态链接库文件,类似于 Windows 上面的 dll 文件,可以被 Java 程序所调用,一般用来实现性能敏感的逻辑或者比较核心的功能,方便混淆,不易被人逆向出来。
先反编译看看 Java 层的函数调用逻辑:

发现和刚才的 APP 差不多,唯一不同的就是 getMessage 函数被放到了 Native 层去实现,并且通过静态块加载了一个名字叫 native 的 so 文件,只是没有 so 后缀。
APP 就不截图了,我们直接解压 apk 文件。

查看 lib 文件夹,一般 so 文件都会放到这里面,lib 中的四个子文件夹对应的是不同的平台,例如 arm 平台就使用 arm 开头的文件夹中的 so 文件,我们这里随意选择一个就好。
使用 ida 打开,直接将 so 文件拖到 ida 图标上。

默认会识别出来对应的 CPU 架构,一般情况下直接点 OK 就行。

查看左侧的函数列表,可以发现有一个 Java 开头的函数,说明 so 中有一个导出给 Java 使用的函数,它的函数名是有含义的,一般是 Java 关键字加上全限定类名加上对应的函数名。
打开以后,我们按 F5 使用 ida 强大的反编译功能查看汇编对应的 C 语言代码。

发现是一个很简单的 C 语言函数,不过函数看起来怪怪的,a1 变量不知道是在做什么。这个时候,把光标放在 a1 变量上面,按键盘上面的 y 键。

会弹出来一个窗口,下拉选择第二个 JNIEnv* 类型,so 导出给 Java 的函数签名第一个参数都是 JNIEnv 类型的,ida 不能自动识别,我们要手动转换一下。
JNIEnv* 是一个指向 JNI 环境的指针,通过这个指针可以调用 JNI 提供的各种方法和功能。在 Java 层我们看到 getMessage 方法只有两个入参,但是 so 层有四个,除了第一个 JNIEnv 的指针外,还有一个 a2 是做什么的呢?其实它是一个执行调用方的类或者实例的变量,方便从 so 中调用 Java 类对应的方法。

点击确定后,我们看到,现在的代码正常了许多,首先声明了一个 s 数组,然后将 a3 和 a4 变量的值相加,并且格式化成字符串写入 s 数组中,最后通过 a1 变量调用 NewStringUFT 函数创建一个字符串返回。
总结
到这里其实整个逻辑就清除了,其实两个 APP 都是实现了一个加法函数,只是一个在 Java 层实现,另一个在 so 层实现,整体的逻辑也比较简单,方便我们来练习使用相关反编译工具。
本文章首发于个人博客 LLLibra146’s blog
本文作者:LLLibra146
更多文章请关注公众号 (LLLibra146):
版权声明:本博客所有文章除特别声明外,均采用 © BY-NC-ND 许可协议。非商用转载请注明出处!严禁商业转载!
