3月17日,網易資深安全工程師鍾亞平在安卓巴士全球開發者論壇上做了《安卓APP逆向與保護》的演講。其中就談到了關於代碼混淆的問題。現摘取部分重點介紹如下:
Java代碼是非常容易反編譯的,作為一種跨平台的、解釋型語言,Java 源代碼被編譯成中間“字節碼”存儲於class文件中。由於跨平台的需要,這些字節碼帶有許多的語義信息,很容易被反編譯成Java源代碼。為了很好地保護Java源代碼,開發者往往會對編譯好的class文件進行混淆處理。
混淆就是對發布出去的程序進行重新組織和處理,使得處理后的代碼與處理前代碼完成相同的功能,而混淆后的代碼很難被反編譯,即使反編譯成功也很難得出程序的真正語義。ProGuard就是一個混淆代碼的開源項目,能夠對字節碼進行混淆、縮減體積、優化等處理。
Proguard處理流程圖如下所示,包含壓縮、優化、混淆、預檢四個主要環節:

1. 壓縮(Shrink):檢測並移除代碼中無用的類、字段、方法和特性(Attribute);
2. 優化(Optimize):對字節碼進行優化,移除無用的指令。優化代碼,非入口節點類會加上private/static/final,沒有用到的參數會被刪除,一些方法可能會變成內聯代碼;
3. 混淆(Obfuscate):使用a、b、c、d這樣簡短而無意義的名稱,對類、字段和方法進行重命名;
4. 預檢(Preveirfy):在Java平台上對處理后的代碼進行預檢,確保加載的class文件是可執行的。
在分享中,鍾亞平展示了利用Proguard,對Dex2jar進行反編譯處理后的Apk效果示例:

Proguard混淆器不僅能夠保護代碼,而且能夠精簡編譯后的程序大小,減少內存占用。
混淆代碼逆向分析
如果想要反編譯混淆代碼,鍾亞平分享了一個國外的工具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應用加固服務,點擊均可免費體驗