現在最流行的App破解技術大多是基於一定相關技術的基礎:如一定閱讀Java代碼的能力、有一些Android基礎、會使用eclipse的一些Android調試的相關工具以及了解一些smali的語法規范和字段的自定范圍,再利用現有的各種工具:如APKtool、dex2jar、jd-gui以及簽名工具。有了這些前基礎和工具,就可以破解很多沒有加反編譯保護措施的App。
一、混淆代碼
Java代碼是非常容易反編譯的,作為一種跨平台的、解釋型語言,Java 源代碼被編譯成中間“字節碼”存儲於class文件中。由於跨平台的需要,這些字節碼帶有許多的語義信息,很容易被反編譯成Java源代碼。為了很好地保護Java源代碼,開發者往往會對編譯好的class文件進行混淆處理。
混淆就是對發布出去的程序進行重新組織和處理,使得處理后的代碼與處理前代碼完成相同的功能,而混淆后的代碼很難被反編譯,即使反編譯成功也很難得出程序的真正語義。ProGuard就是一個混淆代碼的開源項目,能夠對字節碼進行混淆、縮減體積、優化等處理。
Proguard處理流程圖如下所示,包含壓縮、優化、混淆、預檢四個主要環節:

- 壓縮(Shrink):檢測並移除代碼中無用的類、字段、方法和特性(Attribute);
- 優化(Optimize):對字節碼進行優化,移除無用的指令。優化代碼,非入口節點類會加上private/static/final,沒有用到的參數會被刪除,一些方法可能會變成內聯代碼;
- 混淆(Obfuscate):使用a、b、c、d這樣簡短而無意義的名稱,對類、字段和方法進行重命名;
- 預檢(Preveirfy):在Java平台上對處理后的代碼進行預檢,確保加載的class文件是可執行的。
二、整體Dex加固
為了加強Android保護強度,隨着安全技術的發展,又出現了新型的“加固技術”。DEX加固是對DEX文件進行加殼防護,防止被靜態反編譯工具破解而泄露源碼,最剛開始出現的是整體加固技術方案。

三、拆分Dex加固
隨着業務規模發展到一定程度,不斷地加入新功能、添加新的類庫,代碼在急劇膨脹的同時,相應的apk包的大小也急劇增加,那么簡單的整體加固方案就不能很好地滿足安全需求,在整體加固方案之外又出現了拆分加固的技術方案。

Dex文件結構極為復雜,以下圖示選取了其中較為重要的內容。事實上,dex文件是一個以class為核心組裝起來的文件,其中最重要的是classdata和classcode兩部分,有其特定的接口和指令數據,選取這兩部分來拆分的話,即使拆分出來也不會泄露class數據和字節碼數據,反編譯出來也不完整,安全性較高。

四、虛擬機加固
虛擬機加固也屬於dex拆分加固的一種,它是對字節做了一些變化處理。如下所示,這是一個正常安卓系統中的代碼,在其中進行了虛擬機加固操作:

以上是3月17日在重慶舉辦的安卓巴士全球開發者論壇上,網易資深安全工程師鍾亞平《安卓App逆向與保護》演講的重點節選。
完整演講內容請見這里:一文了解安卓App逆向分析與保護機制
相關閱讀:大公司怎么做Android代碼混淆的?
安卓App逆向保護作為開發工作中的重要內容,一直是網易雲易盾致力於提供的應用服務。
網易雲為您提供iOS應用加固 、 Android應用加固服務,點擊均可免費體驗。
