目录
- 为什么要检测APK是否混淆
- 混淆的优点
- 混淆的缺点
- APK的混淆的分类
- 检测工具
- 检测
- 人工检测
- 自动化检测
为什么要检测APK是否混淆
apk代码混淆就是为了保护代码安全,防止被反编译拿到源码做审计找出危险漏洞,现在大部分的APK都会做混淆。
下面分析混淆APK后的优缺点。
混淆的优点
- 防止被恶意破解逆向分析
- 代码可阅读性降低
- 减少apk体积(也是瘦身的方法)
混淆的缺点
- 调试不方便(可以配置mapping变得方便)
- 测试不充分,可能导致部分功能不能使用(比如注解相关等)
APK的混淆的分类
- 代码混淆
- 资源混淆
检测工具
反编译的工具众多,编译出的源码效果也不太相同,使用自己熟悉的就好;
- Jadx-gui-0.8.0.exe(下载地址:https://github.com/skylot/jadx)
- smali2java(下载地址:http://www.hensence.com/cn/smali2java/#Overview)
- Android逆向助手2.2 (下载地址:http://www.funytao.com/?p=430)
- dex2jar
- apktool
如果你有有更好的工具推荐 请在评论里分享一下 :)
检测
人工检测
- 检测代码是否混淆
使用工具打开APK,查看反编译后的代码如果类名、方法名大部分都为A、B、C字母,那就说明混淆了,反之就说明未混淆。
代码混淆前:
代码混淆后:
- 检测资源是否混淆
资源混淆是可以解决apk瘦身,主要就是压缩了资源文件及修改了文件名字及映射关系。
资源混淆前:
资源混淆后:
有开发源码可以看是否加混淆proguard
有如上两个步骤,基本上不需要代码审计了,不过你有代码的话,可以看看;
在build.gradle文件中是否配置混淆规则:
buildTypes {debug {//加载默认混淆配置文件proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'...}release {// 如果没有提供混淆规则文件,则设置默认的混淆规则文件(SDK/tools/proguard/proguard-android.txt)pseudoLocalesEnabled true...}}
自动化检测
使用程序检测的话,应该检测什么特征呢?
1.下载apktool工具
2.运行apktool.bat d xxx.apk,把apk反编译成smali
3.如果想要进一步查看源码,可下载smali2java
4.使用smali文件的文件名进行分析,如果存在1个或1个以上的资源类的smali文件,就可以证明该apk没有被混淆过。如下图所示
程序遍历 smali文件夹,只有存在1个或1个以上R$~
就判定为未混淆。
备注:是apk的核心代码下的资源文件在混淆后不应该出现上述文件,反之则说明该apk没有进行混淆;使用方案一也是要进入核心代码