原文参考链接:https://crifan.github.io/android_app_security_crack/website/
上述网址讲解的非常详细,这里只粗略的整理用到的比较多的工具以及一些安卓逆向工程的知识点。
全文中提到的各种工具都可以csdn下载https://download.csdn.net/download/wozaipermanent/11958306在中下载得到,但是现在csdn下载不能自己设置积分了,积分会动态改变,所以下文对于每一种工具都提供了一个下载网址,或者自行搜索下载。
1 APK文件
APK = android Application PacKage
- APK文件:是安卓app的安装文件,其实就是一个zip或rar压缩包,把apk后缀改为zip,即可解压得到一堆安卓相关文件
1.1 APK内容结构
内容入口 | 含义解释 |
---|---|
AndroidManifest.xml | 二进制xml文件,提供设备运行应用程序所需的各种信息 |
classes.dex | 以dex格式编译的应用程序代码 |
resources.arsc | 包含预编译应用程序资源的二进制XML文件 |
res/ | 此文件夹中包含未编译到resources.arsc文件中的资源 |
assets/ | 此文件夹包含应用程序的原始资源,由AssetManager提供对这些资产文件的访问 |
META-INF/ | 它包含MANIFEST.MF文件,该文件存储有关JAR内容的元数据。APK签名也存储在此文件夹中 |
lib/ | 此文件夹包含已编译的代码,例如本地代码库 |
1.2 dex文件
-
dex = Dalvik Executable format
-
dex文件:逻辑类似于
java
的class
文件。
注:
- java的class文件内部是java的字节码(Java ByteCode)
- 安卓系统中,用**Dalvik虚拟机(DVM = Dalvik Virtual Machine)**去把java源代码编译为dex可执行文件(Dalvik Executable)
2 安卓加密技术
2.1 代码混淆
最常用的做法是,用ProGuard去实现代码混淆。
2.1.1 ProGuard的作用
- 压缩 = Shrinking:移除未被使用的类、属性、方法等,并且会在优化动作执行之后再次执行(因为优化后可能会暴露一些未被使用的类和成员)
- 优化 = Optimization: 优化字节码,并删除未使用的结构
- 混淆 = Obfuscation: 将类名、属性名、方法名混淆为难以读懂的字母,比如a,b,c等,增大反编译难度
2.1.2 ProGuard的输出文件说明
dump.txt
:说明APK中所有类文件的内部结构mapping.txt
:提供原始与混淆过的类、方法和字段名称之间的转换和对应关系seeds.txt
:列出未进行混淆的类和成员usage.txt
:列出从APK移除的代码
2.2 加固
市面上有很多公司和厂商提供免费或收费的加固方案。
3 安卓破解技术
3.1 反混淆
使用反编译工具只能看到混淆之后的代码结构,看不到混淆之前的原始代码。
- 如果有mapping.txt文件:有机会反混淆,恢复和还原出原始代码。但一般只有安卓项目的开发者,在使用ProGuard时才会生成mapping.txt文件,实际上作为要破解的人,往往没有。
- 如果有源文件和行号文件:有机会反混淆,恢复和还原出原始代码。许多APK开发者为了在崩溃时保存源文件类名、行号等信息会在APK混淆时添加规则(keepattributes SourceFile,LineNumberTable)保留源文件信息,实际上作为要破解的人,往往没有。
3.1.1 反混淆工具
3.2 去壳脱壳
不是所有加固的安卓apk都可以成功脱壳的。
总结:
-
没有加固的:直接用jadx即可导出源码
-
部分加密不强的:可以脱壳
- 老一代或免费的360加固保、爱加密、娜迦加固等
- 用FDex2可以脱壳:可以hook导出dex,再dex转jar,jar转java源码
-
腾讯乐固,新一代的360加固保等:没法脱壳(或许未来可以使用art+dex2oat相关机制去破解)
3.2.1 如何判断是哪家加固方案
通过反编译工具后,从dex或jar包的目录结构,以及相关的文件(比如AndroidManifest.xml)的内容,往往可以看出是哪家的加密方案。
腾讯乐固加密后的目录
腾讯乐固legu加密加壳后的apk,用apktool反编译后,得到的jar包目录结构是:
-
com.tencent.bugly
-
com.tencent.bugly.legu
crashreport
proguard
-
com.tencent.StubShell
TxAppEntry
截图举例:
另外反编译出的AndroidManifest.xml内容:
<application android:allowBackup="true" android:icon="@drawable/app_logo" android:label="@string/app_name" android:name="com.tencent.StubShell.TxAppEntry" android:supportsRtl="true" android:theme="@style/AppTheme">
<meta-data android:name="TxAppEntry" android:value="com.huili.readingclub.MyApplication"/>
中有:
android:name="com.tencent.StubShell.TxAppEntry"
<meta-data android:name="TxAppEntry"/>
也是典型的腾讯乐固的内容。
360加固保加固的目录结构
360加固后的apk经过dex2jar反编译后的目录结构是:
com.qihoo.util
com.qihoo360.replugin
com.stub
这种结构就说明是360加固保加固的。
3.3 从apk破解出java源码
- 没有加固的:用jadx从apk导出java源码
- 加固了的:apk -> dex -> jar -> java,前提是后续的hook能够导出dex文件
3.3.1 AndroidManifest.xml
安卓中有个AndroidManifest.xml文件,是保存了相关项目的类,资源等配置信息。
而对于apk文件:
- 直接改名为zip或rar后再解压:得到二进制的AndroidManifest.xml文件
- 用apktool等工具去反编译:得到文本格式的AndroidManifest.xml
apktool下载:apktool下载官网
命令apktool d -f inputFile.apk -o outputFile
注:即使apk加固了,也可以用apktool反编译
比如,网上随便找了一个机器人塔防的apk(robotDefense.apk),用apktool对其进行反编译,得到AndroidManifest.xml文件信息如下:
<?xml version="1.0"