欢迎光临散文网 会员登陆 & 注册

Obfuscapk:Android APK 混淆利器

2023-04-11 15:43 作者:Snnnotname  | 我要投稿

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 收尾增加两段代码块,但是特征太明显,效果不太好:

ArithmeticBranch 混淆效果

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

DeadCode 混淆效果

我修改过的 Obfuscapk 也放到 github 上了,欢迎 star:

https://github.com/FLZeng/Obfuscapk


Obfuscapk:Android APK 混淆利器的评论 (共 条)

分享到微博请遵守国家法律