大公司怎么做Android代碼混淆的?


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處理前
 Proguard處理后

Proguard混淆器不僅能夠保護代碼,而且能夠精簡編譯后的程序大小,減少內存占用。

 

混淆代碼逆向分析

如果想要反編譯混淆代碼,鍾亞平分享了一個國外的工具DEGUADR,它能夠通過統計的方式來解混淆。雖然這個工具的正確率達不到100%,但是能在一定程度上幫助反編譯代碼。

使用DEGUADR解混淆的示例:

com.xxxxx.common.util.CryptoUtil網站也提供了一種反編譯服務,如下所示:
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的開發者是怎么想的

Android App的破解技術有哪些?如何防止反編譯?

關於網易易盾的加固保護

當前安卓App加固到底該如何做到防篡改?

安卓App逆向保護作為開發工作中的重要內容,一直是網易雲易盾致力於提供的應用服務。

網易雲為您提iOS應用加固 Android應用加固服務,點擊均可免費體驗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM