1. What APK?
APK(Android Application Package 即 Android应用程序包)是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。APK 文件基于 ZIP 文件格式,它与JAR文件的构造方式相似。
将一个APK文件改成ZIP文件,可以看到APK文件的结构如下(详情请参考APK文件结构):
2. Android逆向工具——JEB
吾爱破解的 爱盘 --在线破解工具包
JEB的独特功能是,其Dalvik字节码反编译为Java源代码的能力。无需DEX-JAR转换工具。
DEX文件,能够被DVM识别、加载并执行的文件格式;
JAR 文件,以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。
可全面测试APK文件内容。检查解压缩的资源和资产,证书,字符串和常量等。
JEB的强大的用户界面,使用户可以检查交叉引用,重命名的方法,字段,类,代码和数据之间导航,做笔记,添加注释,以及更多。
3. 分析
首先使用JEB工具打开APK文件(这里可以将APK文件拖入Project Explorer)
Manifest:每个安卓应用程序必须有一个AndroidManifest.xml文件
Certificate:证书类文件
Bytecode:字节码文件
Resources:资源相关文件
然后开始分析APK,首先双击Bytecode,会打开两个窗口,Bytecode/Hierarchy和Bytecode/Disassembly。Bytecode/Hierarchy中以树形结构显示了一个Android程序的结构。而Bytecode/Hierarchy是JEB编译APK以Smali语言展示的文件。在Bytecode/Hierarchy中双击指定文件,则会自动定位到Bytecode/Disassembly中对应的定义中。
鼠标右击Bytecode/Hierarchy树状结构里的类,选择Decompile(反编译),即可弹出JEB反编译的类的源码(也可以使用快捷键Q,注意要大写的Q),本小栗子只需参看反编译的Android程序程序入口类MainActivity。
在分析源码之前,以作CTF题的角度去运行APK(程序界面无从下手,唯一的提示就是无论输入什么都会提示“再接再励,加油~”,而不输入时提示“年轻人不要耍小聪明噢”,因此带着CTF题的思想分析源码)。
观察MainActivity类主要函数方法,发现本题是一个代码逻辑漏洞,分析代码发现核心判断的代码为:
if(v1.charAt(v0) != (v3.charAt(v0) ^ v4))
v1为文本框输入的字符,v3是PackageInfo.versionName ,v4是 PackageInfo.versionCode 而PackageInfo的相关信息在BuildConfig.class能够找到。
反编译VERSION_CODE和VERSION_NAME(右键选择decompile或使用快捷键Q)
最后根据函数逻辑以及变量值编写脚本,破题得到Flag。
a = 'X<cP[?PHNB<P?aj'
b = ''
for i in a:
# print(i)
b += chr(ord(i)^15)
print(b)