Obfuscapk:Android APK 混淆利器

1 背景
由于 Java 字節(jié)碼易于被反編譯的天然特性,Android app 在編譯時(shí)都要進(jìn)行混淆處理,使反編譯的代碼難以閱讀。Android Studio 集成了 ProGuard 混淆工具,可以對(duì)應(yīng)用進(jìn)行:
壓縮(Shrinking):移除未使用的類、變量、方法和屬性;
優(yōu)化(Optimization):字節(jié)碼級(jí)別執(zhí)行優(yōu)化, 刪除未使用的參數(shù);
混淆(Obfuscation):重命名非入口類的類名,變量名,方法名。
另一款混淆工具 DexGuard 是基于 ProGuard 開發(fā)的專用于 Android 應(yīng)用程序的工具,除了 Dalvik 字節(jié)碼,它能還優(yōu)化、混淆和加密 manifest 文件,native 庫,resource 文件和 asset 文件。但它是商用付費(fèi)軟件。
我在網(wǎng)上搜索了一番,發(fā)現(xiàn)了一個(gè) DexGuard 的替代工具 Obfuscapk,可以實(shí)現(xiàn)對(duì)于沒有源碼的 apk 文件的混淆。Obfuscapk 來自于一篇論文:
Obfuscapk: An open-source black-box obfuscation tool for Android apps
但它更偏向于一個(gè)工程項(xiàng)目,github 開源的代碼開箱即用:
https://github.com/ClaudiuGeorgiu/Obfuscapk
2 Obfuscapk 使用
下載 Obfuscapk 源碼
創(chuàng)建 python 虛擬環(huán)境(不是必須)
安裝依賴庫
混淆 apk
其中 -o
選項(xiàng)指定所使用的混淆器,可以指定多個(gè)。Rebuild(重新打包)、NewAlignment(對(duì)齊)和 NewSignature(簽名)是生成最終 apk 必選的,其他的是 smali 代碼和資源的混淆器,分為以下幾類:
Trivial:簡單的操作(不怎么修改原始應(yīng)用程序)。Rebuild、NewAlignment、NewSignature;
Rename:修改類名、字段名和方法名;ClassRename、FieldRename、MethodRename;
Encryption:加密代碼或資源,在應(yīng)用執(zhí)行過程中解密;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 框架做的很好,很容易實(shí)現(xiàn)一個(gè)自定義的 obfuscator。我實(shí)現(xiàn)了一個(gè) DeadCode obfuscator,在不影響程序邏輯的前提下隨機(jī)往 method 中插入 const/4 操作,實(shí)現(xiàn)更細(xì)粒度的混淆,增加辨識(shí)難度:

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