ProGuard是一個壓縮、優化和混淆Java字節碼文件的免費的工具,是Android平臺重要的防禦手段之一。java
ProGuard主要功能及執行流程以下圖所示: android
重點介紹一下上述流程的工做機制安全
-keepattributes *Annotation*
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
複製代碼
看到這裏是否是忽然明白,在proguard文件中都是輸入到ProGuard庫中的參數集合,全部添加keep標籤的類、方法以及屬性都是ROOT,被認爲調用入口。bash
目前在Android中主要使用ProGuard庫中的混淆功能,經過混淆壓縮字節碼大小而且進行防禦,以前分析一個樣本,經過JADX打開後以下: app
使用JADX打開ProGuard.jar而且找到入口類: 工具
private String newName(int i) {
int i2 = this.generateMixedCaseNames ? 52 : CHARACTER_COUNT;
int i3 = i / i2;
char charAt = charAt(i % i2);
if (i3 != 0) {
return new StringBuffer().append(name(i3 - 1)).append(charAt).toString();
}
return new String(new char[]{charAt});
}
複製代碼
其中CHARACTER_COUNT值爲26,這裏的意思爲是否只使用a-z共26字符仍是使用a-z和A-Z共52字符,生成名字的邏輯也很簡單:如如今使用26字符集合且生成的名字爲z,則下一個名字爲aa,依次類推當字符用到最後則增長一位。
上面SimpleNameFactory分析完成,再分析一下另外一個分支DictionaryNameFactory中生成名字的方法:
測試
看下DictionaryNameFactory的構造方法:
優化
public static final String OBFUSCATION_DICTIONARY_OPTION = "-obfuscationdictionary";
public static final String CLASS_OBFUSCATION_DICTIONARY_OPTION = "-classobfuscationdictionary";
public static final String PACKAGE_OBFUSCATION_DICTIONARY_OPTION = "-packageobfuscationdictionary";
複製代碼
看到這裏應該明白了,能夠經過設置字符集配置完成包名,類名,方法名以及屬性名配置。
這裏總結一下:ui
上面介紹了混淆的機制以及設置自定義混淆字符集的方法,這裏介紹兩種設置字符集的方法而且對比優缺點。this
在DEMO工程中的proguard-rules.pro中添加以下信息:
-obfuscationdictionary ./dictionary
-classobfuscationdictionary ./dictionary
-packageobfuscationdictionary ./dictionary
複製代碼
而後再在同級目錄建立dictionary文件,裏面設置測試字符集:
_
__
___
____
_____
______
複製代碼
這裏是下劃線,看下最後的效果:
修改ProGuard.jar方案我沒有親自試,修改也比較簡單。
這裏對比一下上述兩種方案:
方案 | 優勢 | 缺點 |
---|---|---|
配置中設置字典 | 方便配置 | 當字符集使用完會使用默認的a-z |
修改ProGuard.jar | 可以徹底掌握字符集使用 | 須要修改庫 |
本篇主要介紹ProGaurd庫的功能,重點講解了一下混淆相關,以及如何利用混淆功能提升應用安全防禦, 這裏提醒一下:設置字符集的時候也要注意包大小,原生a-z都是佔用1個字節,若是設置中文或者其餘字符就要衡量一下了。