3月17日,網易資深安全工程師鍾亞平在安卓巴士全球開發者論壇上作了《安卓APP逆向與保護》的演講。其中就談到了關於代碼混淆的問題。現摘取部分重點介紹以下:html
Java代碼是很是容易反編譯的,做爲一種跨平臺的、解釋型語言,Java 源代碼被編譯成中間「字節碼」存儲於class文件中。因爲跨平臺的須要,這些字節碼帶有許多的語義信息,很容易被反編譯成Java源代碼。爲了很好地保護Java源代碼,開發者每每會對編譯好的class文件進行混淆處理。java
混淆就是對發佈出去的程序進行從新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能,而混淆後的代碼很難被反編譯,即便反編譯成功也很可貴出程序的真正語義。ProGuard就是一個混淆代碼的開源項目,可以對字節碼進行混淆、縮減體積、優化等處理。android
Proguard處理流程圖以下所示,包含壓縮、優化、混淆、預檢四個主要環節:ios
1. 壓縮(Shrink):檢測並移除代碼中無用的類、字段、方法和特性(Attribute);安全
2. 優化(Optimize):對字節碼進行優化,移除無用的指令。優化代碼,非入口節點類會加上private/static/final,沒有用到的參數會被刪除,一些方法可能會變成內聯代碼;工具
3. 混淆(Obfuscate):使用a、b、c、d這樣簡短而無心義的名稱,對類、字段和方法進行重命名;post
4. 預檢(Preveirfy):在Java平臺上對處理後的代碼進行預檢,確保加載的class文件是可執行的。優化
在分享中,鍾亞平展現了利用Proguard,對Dex2jar進行反編譯處理後的Apk效果示例:網站
Proguard混淆器不只可以保護代碼,並且可以精簡編譯後的程序大小,減小內存佔用。url
混淆代碼逆向分析
若是想要反編譯混淆代碼,鍾亞平分享了一個國外的工具DEGUADR,它可以經過統計的方式來解混淆。雖然這個工具的正確率達不到100%,可是能在必定程度上幫助反編譯代碼。
使用DEGUADR解混淆的示例:
java.lang.String a(byte[]) -> encodeToString
java.lang.String a(byte[],boolean,java.lang.String) -> a
byte[] a(byte[],byte[]) -> encrypt
byte[] b(byte[]) -> getKey
byte[] b(byte[],byte[]) -> decrypt
byte[] d(java.lang.String) -> getKey
java.lang.String a(byte,char[]) -> a
java.lang.String a(java.io.File) -> getHash
java.lang.String a(java.lang.String) -> c
java.lang.String b(java.lang.String) -> encode
完整演講內容請見這裏:一文了解安卓App逆向分析與保護機制
相關閱讀:一文讀懂加固apk的開發者是怎麼想的
安卓App逆向保護做爲開發工做中的重要內容,一直是網易雲易盾致力於提供的應用服務。
網易云爲您提iOS應用加固、 Android應用加固服務,點擊都可免費體驗