·学习逆向分析技术,了解 Android 平台静态分析和动态分析原理;
·通过 Android 平台逆向分析实战,加深对 AndroidKiller、GDA 等工具使用方法的了解;
·理解 Android 静态分析破解概念;
·掌握 Android 平台基础知识如:系统架构、组件、Binder 机制、Intend 机制、smali 语法等。
实验:利用 Android 静态分析工具分析 AddNumber.apk 文件,并找到 flag。
本电脑操作系统:Win10
Android 模拟器:夜神模拟器
JDK 版本:本机安装有 jdk-1.8.0 及 jdk-14,须修改环境变量配置路径为前者
分析工具:AndroidKiller_v1.3、GDA3.68(两者均为 APK 综合分析工具、集成了了解包、
反编译、重打包等功能)
实验:利用 Android 静态分析工具分析 AddNumber.apk 文件,并找到 flag。
打开 Android 模拟器并尝试安装初始版本 APK,报错 1007:安装应用程序失败。
可能是因为这个 APK 文件有损坏、缺少签名、打包方式有问题等、或者此应用/游戏厂商出安装包的时候没对模拟器做兼容。
图 1 初始 APK 安装失败
打开 AndroidKiller 并加载 AddNumber.apk,对源码进行提取和反编译:
图 2 成功提取源码并反编译
直接尝试重新编译 apk 文件,提示 APK 编译失败,无法继续下一步签名:
图 3 原始 APK 编译失败
使用 GDA 工具查看一下该 APK,加载后如下所示:
图 4 GDA 加载原始 APK 文件
( 附加说明:主界面以不同颜色展示了 Dex 头,右边栏自上而下依次含义为:1.查看所有字符
串;2.查看所有使用过的字符串;3 查看所有 API;4.查看 AndroidManifest 文件;5.十六进制浏览
数据;6.可疑(恶意行为分析);7.类及方法,如果出现多个 DexClass 表示 apk 采用 mulitdex 技术:)
点击选项栏中的查看签名按钮,查看该 APK 的签名信息,发现内容为空,所以该 APK 无法成功安装在模拟器上以及无法重新编译的原因应该是未签名:
图 5 利用 GDA 查看原始 APK 的签名
使用 AndroidKiller 对原文件进行签名,这里的签名方式有 Default 和 AndroidKiller,我两种都进行了尝试,发现只有后者能成功:
图 6 AndroidKiller 对原始 APK 签名
再次用 GDA 查看被签名后新生成的文件,查看该 APK 的签名信息,出现如下内容:
图 7 利用 GDA 查看签名后的新 APK
在 Android 模拟器中安装签名后新生成的 APK 文件,成功安装。同时我们可以发现,初始环节是一个数字累加的关卡,显然手动点击通关不现实:
图 8 成功安装 APK 后程序的首界面
使用 AndroidKiller 查看 smali 文件夹下的文件,并 Java 反编译,找到 MainActivity.class文件,了解主要功能。
图 9 利用 AndroidKiller 查看 MainActivity.class
查看点击监听函数部分的内容,可知每点一次按钮,mynumber 加一,而当当前数目大于某一数值的情况下,跳出循环,使用显示 Intent(意图,描述的是应用的动作及其对应的数据;起到通信载体作用)的方式启动 succcess.class;
图 10 查看监听函数内容
参考模拟器中 APK 的内容可知,设置的数比较大,人工点击效率过低,因而我们首先应该跳出点击按钮的循环。通过在对应 smali 文件中查找条件判断语句,定位跳出循环的判断,进而修改判断逻辑,使得能够在点击一次后跳出循环。
图 11 在 smali 文件定位判断语句
(if-eq等于(equal);-ne不等于(no equal);-gt大于(greater than);-ge大于等于;-lt小于(less than);-le小于等于)
修改后点击编译,编译成功后在 Android 模拟器上安装新编译好的 apk 文件,得到提示:
图 12 跳出循环后的提示界面
尝试回退到上一页面,得到 True Flag:0218d33b334a0a15260d149db58a6e50:
图 13 得到flag
可以查看一下 success.class 对应的操作逻辑,能与我们获取 flag 的操作对应起来。跳出循环后,程序首先执行 onCreate 函数跳转到新页面,只有在用户点击返回上一页面后才会出现 flag:
图 14 success.class 对应操作逻辑分析
1、重编译前注意查看 APK 版本与本机 JDK 是否一致,如果不一致可能是无法编译的;
2、安卓静态分析破解的大致思路大致如下:
·安装 apk 后进行使用和观察;
·使用工具反编译 apk,了解主程序大概逻辑,查看关键词含义,并定位对应 smali 文件;
·在对应 smali 文件找逻辑判断语句及跳转等关键内容,分析代码后手动修改逻辑,从而控制我们想要执行的语句;
·完成后保存,再编译,运行破解后的 app 应用,查看是否成功。
3、对抗 Android 静态分析方法:
·使用代码混淆技术,例如 google 提供了 ProGuard 代码混淆工具,开发人员可以对自己的代码进行混淆;
·加壳,目前市面上常见的有爱加密,360 的壳;
·调试检测,如安卓调试检测函数、IDA 调试端口检测等。