1. 程式人生 > >app可以被反編譯到什麼程度?

app可以被反編譯到什麼程度?

Android APK中的Java程式碼可以被反編譯到什麼程度主要看APK的加密程度。

第一種情況:無混淆無加密無加殼。
直接利用Dex2jar和JD-GUI可把原始碼從APK裡摳出來,程式碼邏輯清晰,基本上做到可複用,只是資原始檔的引用需要計算一下。

第二種情況:混淆。
通常是利用Proguard做的防護。因為是對jar做的不可逆混淆(除非有mapping),因此不能還原成原來的程式碼。但是程式碼結構,程式碼邏輯一致,只要花長時間對程式碼進行梳理一樣可找準核心程式碼,解密方法跟第一種一致。

第三種情況:加密。
這裡以DexGuard為例。對於這種程式碼加密的方法,在程式執行中必定會進行解密,只要抽出它解密的邏輯便可。PS:我自己做過DexGuard的解密,如果用Dex2jar反編譯看的話邏輯是不對的,一定要從Smali程式碼看。後來發現網上已經有人做了。
解密的指令碼:

A look inside Dexguard

第四種情況:加殼。
這種情況跟第三種類似。無論你怎麼加殼,執行的時候必定是Dalvik可識別的Odex程式碼,建議直接在記憶體裡dump出來。這裡推薦Xpose的ZjDroid。
脫殼教程:ZjDroid工具介紹及脫殼詳細示例

通常都是這幾種情況的混合,至於native層的只能說半桶水不敢獻醜。

我開發過有別於以上的基於Java class檔案和dex檔案的混淆。對於Java class檔案,我們可採用打亂package結構和類裡方法合併的方式進行混淆,但這種混淆方式會破壞原始碼裡的欄位和方法的Signatrue,同時也會造成一些很小的效率和記憶體佔用影響,因此尚未商用。有興趣的人可去我的github裡瞭解或改進相關程式碼:
VinceXie/Java-ApkObfuscate · GitHub