Obfuscapk:Android APK 混淆利器

1 背景
由于 Java 字节码易于被反编译的天然特性,Android app 在编译时都要进行混淆处理,使反编译的代码难以阅读。Android Studio 集成了 ProGuard 混淆工具,可以对应用进行:
压缩(Shrinking):移除未使用的类、变量、方法和属性;
优化(Optimization):字节码级别执行优化, 删除未使用的参数;
混淆(Obfuscation):重命名非入口类的类名,变量名,方法名。
另一款混淆工具 DexGuard 是基于 ProGuard 开发的专用于 Android 应用程序的工具,除了 Dalvik 字节码,它能还优化、混淆和加密 manifest 文件,native 库,resource 文件和 asset 文件。但它是商用付费软件。
我在网上搜索了一番,发现了一个 DexGuard 的替代工具 Obfuscapk,可以实现对于没有源码的 apk 文件的混淆。Obfuscapk 来自于一篇论文:
Obfuscapk: An open-source black-box obfuscation tool for Android apps
但它更偏向于一个工程项目,github 开源的代码开箱即用:
https://github.com/ClaudiuGeorgiu/Obfuscapk
2 Obfuscapk 使用
下载 Obfuscapk 源码
创建 python 虚拟环境(不是必须)
安装依赖库
混淆 apk
其中 -o
选项指定所使用的混淆器,可以指定多个。Rebuild(重新打包)、NewAlignment(对齐)和 NewSignature(签名)是生成最终 apk 必选的,其他的是 smali 代码和资源的混淆器,分为以下几类:
Trivial:简单的操作(不怎么修改原始应用程序)。Rebuild、NewAlignment、NewSignature;
Rename:修改类名、字段名和方法名;ClassRename、FieldRename、MethodRename;
Encryption:加密代码或资源,在应用执行过程中解密;AssetEncryption、ConstStringEncryption、LibEncryption、ResStringEncryption;
Code:混淆 smali 代码;AdvancedReflection、ArithmeticBranch、CallIndirection、DebugRemoval、Goto、MethodOverload、Nop、Reflection、Reorder;
Resource:混淆资源文件;RandomManifest;
Other:VirusTotal。
3 自定义 Obfuscator
ArithmeticBranch obfuscator 在 method 收尾增加两段代码块,但是特征太明显,效果不太好:

好在 Obfuscapk 框架做的很好,很容易实现一个自定义的 obfuscator。我实现了一个 DeadCode obfuscator,在不影响程序逻辑的前提下随机往 method 中插入 const/4 操作,实现更细粒度的混淆,增加辨识难度:

我修改过的 Obfuscapk 也放到 github 上了,欢迎 star:
https://github.com/FLZeng/Obfuscapk