1. 程式人生 > >Android 加固技術調研

Android 加固技術調研

第一代加固

第一代加固原理是基於 Dex 載入器的加固技術。

基本步驟

1、從 Apk 檔案中獲取原始的 dex 檔案。

2、對原始的 dex 檔案進行加密,並將加密後的 dex 檔案存放在 asset 目錄。

3、用脫殼 dex 檔案替換原始 apk 檔案的 dex 檔案。脫殼 dex 檔案的作用主要有兩個:一是解密加密後的 dex 檔案,二是動態載入解密後的 dex 檔案。

4、修改清單檔案,將程式入口改為殼程式。

5、打包簽名。

缺陷

依賴 Java 的動態載入機制,解密後的 dex 檔案必須解壓到檔案系統,即使是應用的私有目錄,攻擊者很容易獲取檔案。

第二代加固–不落地載入

相對於第一代加固,第二代加固在載入原始 dex 檔案時採用的是記憶體載入方案。

即在解密原始 dex 檔案後,不需要將 dex 寫入檔案系統,系統直接讀取 dex 位元組進行載入。

Android 底層支援記憶體載入 dex,但是 java 層未實現記憶體夾雜的介面,可以通過 jni 層呼叫底層的記憶體載入 dex 的函式。

市面上絕大多數第三方加固廠商的加密方案都是基於第二代加固技術。

缺陷

第二代加固方案能夠防止第一代加固技術檔案必須落地易被複制的缺陷,但是解密後的 dex 檔案載入到記憶體後,在記憶體中是連續的 ,利用 gdb 等除錯工具 dump 記憶體後可以直接找到原始 dex。

第三代加固–指令抽離

由於第二代加固技術僅僅對檔案級別進行加密,其帶來的問題是記憶體中的 Payload 是連續的,可以被攻擊者輕易獲取。第三代加固技術對這部分進行了改進,將保護級別降到了函式級別。

基本步驟

1、打包階段將 Dex 檔案中要保護的核心函式抽離出來生成另外一個檔案。

2、執行階段將函式內容重新恢復到對應的函式體。恢復的時間點有如下幾種方式。

  • 載入之後恢復函式內容到 dex 殼所在的記憶體區域
  • 載入之後將函式內容恢復到虛擬機器內部的結構體上:虛擬機器讀取 dex 檔案後內部對每一個函式有一個結構體,這個結構體上有一個指標指向函式內容,可以通過修改這個指標修改對應的函式內容。
  • 攔截虛擬機器與查詢執行程式碼相關的函式,返回函式內容。

缺陷

攻擊者可以通過自定義 Android 虛擬機器,在直譯器的程式碼上做記錄一個函式的內容。接下來遍歷所有函式,從而獲取全部的函式內容。最終重組成一個完整的 dex 檔案。

第四代加固–指令轉換/VMP

第三代加固技術是函式級別的保護,使用 Android 虛擬機器內的直譯器執行程式碼,帶來可能被記錄的缺陷。

第四代加固技術使用自己的直譯器來避免第三代的缺陷。

在編譯打包的時候將 dex 的核心函式抽離,抽離後,翻譯成一種自己定義的指令,用自己的一種編譯指令進行翻譯,把這個指令變一個種,變成其他的指令,這個時候執行的時候通過自己的直譯器來解釋執行,是自己定義的相關指令。在記憶體中執行的指令,在某些保護的函式裡面就一定不是谷歌的標準指令了,這點能夠很有效的防止記憶體直接拷貝等破解方案。

缺陷

其必須通過虛擬機器提供的JNI介面與虛擬機器進行互動,攻擊者可以直接將指令轉換/VMP 加固方案當作黑盒,通過自定義的 JNI 介面物件,對黑盒內部進行探測、記錄和分析,進而得到完整 dex程式。

參考