聊聊java混淆(匯總整理篇)

參考文章:
QuincySx:java混淆那些事系列文章:目錄
QuincySx:java混淆那些事系列文章:keep語法
QuincySx:java混淆那些事系列文章:keep 通配符
java proguard混淆通配符
QuincySx:java混淆那些事系列文章:混淆中常用命令

  1. 混淆的功能
    • 壓縮 (Shrinker):刪除無效的類、字段、方法等。
    • 優(yōu)化 (Optimizer):優(yōu)化字節(jié)碼,合并方法,刪除無用字段等。
    • 混淆 (Obfuscator):將類名、屬性名、方法名以及字段名混淆為難以讀懂的字母,比如a, b, c等。
    • 預校驗 (Preverifier):對 class 文件進行預檢驗,確保虛擬機加載的 class 文件是安全并且可以執(zhí)行的。
    • 混淆的功能流程圖:


      串行執(zhí)行
  2. 混淆的常見命令
命令 解釋
-dontshrink 關閉壓縮功能
-dontoptimize 關閉混淆功能
-dontusemixedcaseclassnames 不使用大小寫混合類名,注意,windows用戶必須為 ProGuard 指定該選項,因為 windows 非大小寫敏感,輸出文件可能將會相互覆蓋\color{#FF0000}{簡單理解區(qū)分大小寫}
-dontskipnonpubliclibraryclasses 處理 library 中非 public 類。從 4.5 版本開始這是默認配置
-verbose 打印log信息盡可能詳細
-useuniqueclassmembernames 把混淆類中的方法名也混淆了
-renamesourcefileattribute SourceFile 將文件來源重命名為“SourceFile”字符串 ,指定一個常量字符串作為 SourceFile 屬性的值。需要被 -keepattributes 選項指定保留。只有開啟混淆時可用
-obfuscationdictionary filename 指定類、方法及字段混淆后時用的混淆字典。默認使用 ‘a(chǎn)’,’b’ 等短名稱作為混淆后的名稱
-classobfuscationdictionary filename 指定類名的混淆字典。
-packageobfuscationdictionary filename 指定包名的混淆字典。
-keeppackagenames [package_filter] 不混淆指定的包名。有多個包名可以用逗號隔開。包名可以包含 ?、* 通配符,還可以在包名前加上 ! 否定符。只有開啟混淆時可用。如果你使用了 mypackage.MyCalss.class.getResource(""); 這些代碼獲取類目錄的代碼,就會出現(xiàn)問題。需要使用 -keeppackagenames 保留包名。
-keepattributes [attribute_filter] 保留任何可選屬性。過濾器是由逗號分隔的 JVM 及 ProGuard 支持的屬性列表。屬性名可以包含 ?、* 通配符,并且可以在屬性名前加上 ! 否定符。例如:處理庫文件時應該加上 Exceptions,InnerClasses,Signature 屬性。同時保留 SourceFile 及 LineNumberTable 屬性使混淆后仍能獲取準確的堆棧信息。同時如果你的代碼有使用注解你可能會保留 annotations 屬性。只有開啟混淆時可用。
-keepparameternames 保留方法參數(shù)名稱和保留的方法類型。
-dontoptimize 關閉優(yōu)化功能
-optimizationpasses n 針對代碼優(yōu)化迭代次數(shù),通常小于10
-assumenosideeffects class_specification 優(yōu)化階段刪除指定代碼,比如: 刪除所有日志 -assumenosideeffects class com.Log { *; }
-assumenoexternalsideeffects class_specification 優(yōu)化階段刪除指定代碼,力度比 -assumenosideeffects 強,因為它可以優(yōu)化參數(shù)或堆。例如,刪除日志記錄代碼時,如果日志包含 String 拼接的字節(jié)碼就可以徹底刪除了。 -assumenosideeffects 是無法在字節(jié)碼層面刪除的。
-dontpreverify 關閉預校驗功能
-dontwarn [class_filter] 指定找不到引用或其他重要問題時不打印警告信息。例如,在某個類的引用中找不到相關類,會有警告提示。使用 dontwarn 就可以忽略提示。
-ignorewarnings 打印找不到引用或其他重要問題的警告信息。

備注:其余一些命令可以參考參考文章中的混淆中的常用命令

  1. 混淆的keep語法
命令 解釋
-keep [,modifier,…] class_specification 匹配類名以及指定的方法或字段,為代碼入口點。可以單獨匹配類或者類和類成員。匹配到的類不會被混淆和刪除,匹配到的類成員不會被混淆和刪除,方法被當作代碼入口點
-keepclassmembers [,modifier,…] class_specification 匹配類名以及規(guī)則指定的方法或字段,為代碼入口點。但是有個前提:就是必須在壓縮階段被保留的類才可以。
-keepclasseswithmembers [,modifier,…] class_specification 它和 -keep 的作用基本一致,但是規(guī)則必須完全匹配類名以及類成員才能匹配成功,寫錯類成員名稱或寫不存在類成員名稱都會導致整條規(guī)則失效。

備注:

  • 第二條和第一條相比區(qū)別是:持有的類和方法參與混淆的刪除清理功能,若過了刪除清理功能則不參與后續(xù)的混淆
  • 第三條和第二條相比區(qū)別是:第三條絕對匹配即和跟定的類規(guī)則完全匹配才不參與對應的混淆,通常情況下此條不經(jīng)常使用。
  1. 混淆的通配符規(guī)則
    • 類過濾器:
符號 功能
? 可以匹配任意一個字符,但是 package 的分隔符(.)除外,例如:com.example.T?st,可以匹配 com.example.Test,com.example.T2st,但是 com.example.T12st 、com.example.Tst 和 com.example.T.st 不可以。
* 可以匹配任意一部分連續(xù)的字符,但是 package 的分隔符(.)除外,例如 com.example.Test,可以匹配 com.example.Test,com.example.AnyTest,但是 com.example.xxx.Test 不可以,還有一個特例 com.example. 只能匹配當前包下的類,com.example.xxx.Test 就匹配不到。
** 可以匹配任意一部分連續(xù)的字符,例如 com**,可以匹配 com.Test,com.example.Test,com.example.java.Test
<num> 在同一匹配規(guī)則中匹配和第 n 個通配符一致的內(nèi)容。例如:*Any<1>,可以匹配到 TestAnyTest ,TestAnytest 不可以。即后面的內(nèi)容和數(shù)字指定的通配符當前的內(nèi)容一致才匹配

備注:* 和 ** 的區(qū)別是:* 通常只能匹配當前文件夾,*則可以當前和子文件夾,即 不能匹配文件夾的分隔符.。
<num>:則是代表當前第num個通配符指向的字符,匹配的時候先去看第num個通配符指向字符,此時占位的字符和其相同則匹配。

  • 字段和方法名過濾器:
符號 功能
<init> 匹配所有構造方法
<fields> 匹配所有字段
<methods> 匹配所有方法
? 匹配單個字符,包名分隔符(.)除外
* 匹配除(.)外的任意字符
<num> 在同一匹配規(guī)則中匹配和第 n 個通配符一致的內(nèi)容。
  • 類型通配符:
符號 功能
[] []表示內(nèi)部內(nèi)容是可選的
% 匹配所有基本類型:int,boolean等
匹配類名中的任何單個字符
* 匹配不包含包分隔符的類名的任何部分。
** 匹配類名的任何部分,可能包含任意數(shù)量的包分隔符
*** 匹配所有任何類型
... 匹配任何類型任何數(shù)量的參數(shù)
<num> 在同一匹配規(guī)則中匹配和第 n 個通配符一致的內(nèi)容
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內(nèi)容