Java代碼混淆

在分析一個程序的Java層邏輯,進行反編譯時,偶爾會發現代碼中全部的函數名、變量名、類名等都變成了一些雜亂無章的名字,它們沒有任何規律可言,這就是程序的混淆。android

Java代碼混淆就是爲了保護Java源代碼,對編譯好的class文件進行混淆處理。混淆就是對發佈出去的程序進行從新組織和處理,經過一些工具,對函數名、變量名、類名、字段進行批量重命名。使得處理後的代碼與處理前代碼完成相同的功能,而混淆後的代碼很難被反編譯,即便反編譯成功也很可貴出程序的真正語義。ide

一: 混淆的例子及做用

在學習混淆以前,先來看一下沒有被混淆的例子,下面是程序的反編譯,以下圖所示。函數

Java代碼混淆

從圖中能夠發現,這裏的反編譯邏輯很是清楚,反編譯以後的源碼和當時寫的代碼徹底相同。工具

保護Java源代碼的第一步就是混淆,對代碼進行修改,讓反編譯出來的代碼不容易被看懂,具體的操做流程以下所示。學習

1.打開androidkiller工具,以下圖所示。優化

Java代碼混淆

2.打開其中一個smali文件夾,以下圖所示。ui

Java代碼混淆

打開後,發現裏面內容已被修改,正常開發中不會存在這種命名,以下圖所示。3d

Java代碼混淆

3.任意打開其中一個文件,會發現代碼也發生了相應的變化,以下圖所示。blog

Java代碼混淆
4.此時須要藉助jdax-gui工具,將代碼進行還原處理,以下圖所示。開發

Java代碼混淆
5.還能夠藉助一些工具,達到簡單混淆的目的,點擊面層菜單中的圖標,它會將把代碼從新混淆,以下圖所示。

Java代碼混淆
6.再次打開,則會對代碼從新反編譯而且重命名,更加方便咱們進行區分,以下圖所示。

Java代碼混淆

注意:混淆只是增長逆向的時間,但總體的邏輯不會混淆。也就是說,代碼混淆並不能一勞永逸地解決代碼保護的問題,它只是把讀代碼的時間變得比開發代碼的時間還要長。

二:ProGuard介紹以及混淆特色

ProGuard就是一個混淆代碼的開源項目,可以對字節碼進行混淆、縮減體積、優化等處理。ProGuard還包括如下4個功能:

  • 壓縮(Shrink):檢測並移除代碼中無用的類、字段、方法和特性(Attribute)。

  • 優化(Optimize):對字節碼進行優化,移除無用的指令。

  • 混淆(Obfuscate):使用a,b,c,d這樣簡短而無心義的名稱,對類、字段和方法進行重命名。

  • 預檢(Preveirfy):在Java平臺上對處理後的代碼進行預檢,確保加載的class文件是可執行的。

總而言之,Proguard是一個Java類文件壓縮器、優化器、混淆器、預校驗器。壓縮環節會檢測以及移除沒有用到的類、字段、方法以及屬性。優化環節會分析以及優化方法的字節碼。混淆環節會用無心義的短變量去重命名類、變量、方法。這些步驟讓代碼更精簡,更高效,也更難被逆向(破解)。

ProGuard工做原理

ProGuard由shrink、optimize、obfuscate和preveirfy四個步驟組成,每一個步驟都是可選的,咱們能夠經過配置腳原本決定執行其中的哪幾個步驟。

小結

知道了混淆的概念是指經過一些工具,對函數名、變量名、類名,字段進行重命名。同時,對混淆和非混淆例子之間的區別以及混淆的特色也有了必定的瞭解。

相關文章
相關標籤/搜索