2020年1月20日 星期一

Android 動態解殼研究(二) - 加殼研究

接下來是探討Android平台上有那些加殼(Packer)的方式,藉此知道它們的加殼原理,以便我們能夠透過自動化的方式將它解殼回來。

加殼方式


大部分的加殼(Packer)防護必定會伴隨著混淆程式碼,使資安人員困難找出解密的程式碼,那如果知道加殼原理,也可以透過其他方式來獲取解殼(Unpacker)後的程式碼,主要的加殼方式如下:

1. Dex(Dalvik Executable)加密:將主要Dex檔案加密,並存放在assets目錄,運行時會透過解密程式將它還原成原本的程式碼,然後再透過DexClassLoader運行到記憶體上。

2. Dex(Dalvik Executable) header修改:利用修改header欄位中的dex_magic、xxx_ids_off或xxx_ids_size,都可以有效的防護反編譯軟體。

3. Dex(Dalvik Executable) data加密:透過加密data欄位部份的資訊,使反編譯軟體不能解析主要的程式碼。

4. 方法(Method)動態加密:將主要的Method加密,要運行它時,在將它解密,執行結束後,在加密回來。

5. VMP (Virtual Machine Protect ):這種方法是將Android Java程式碼轉譯成JNI(Java Native Interface)程式碼,由於JNI是透過C++所撰寫的,因此只透過Android Framework層解殼是不可能的,所以此篇無法將它動態解殼。

一、混淆程式碼

如果程式碼有被混淆,它的Method和Field都會是無意義的名稱,除了Android定義的標準API,像是getSharedPreferences和getString都會是原本的名稱,並不會被混淆,因此透過這種特性,還是能知道程式的運作行為。



二、Dex(Dalvik Executable)加密

把已加密的Dex檔,放置到packer.apk中的assets目錄,等到程式運行時,會將它提取出來,並解密還原。



三、Dex(Dalvik Executable) header修改

透過修改header裡面的數值,讓反編譯軟體解析錯誤,例如將dex_magic的035改成000或xxx_ids_size、xxx_ids_off改成其他數值,都能讓反編譯軟體解析失敗。



四、Dex data 加密

透過加密data欄位的關鍵程式碼資訊,讓主要程式碼不被反編譯軟體解譯出來,也是能有效防護靜態分析,運行時再利用解密程式(Decrypt_apk-lib)將主程式碼解密回來。



五、方法(Method)動態加密

通常Method動態加密,只會在運行程式之前,利用解密程式(A.decrypt)將它還原成原來的程式碼,然後運行完再將它加密(A.earse)回來。



六、VMP (Virtual Machine Protect )

將原本的Android Java程式碼轉譯成JNI程式碼,因此它是不透過interpC-portable去解析程式碼,所以動態解殼會比較困難實現。