安卓客戶端移動應用加固技術的演進

傳統App加固技術,前後經歷了四代技術變更,保護級別每一代都有所提升,但其固有的安全缺陷和兼容性問題始終未能得到解決。而下一代加固技術—虛機源碼保護,適用代碼類型更廣泛,App保護級別更高,兼容性更強,堪稱未來級別的保護方案。

安卓客戶端移動應用加固技術的演進

安全加固刻不容緩

第一代加固技術—動態加載

第一代Android加固技術用於保護應用的邏輯不被逆向與分析,最早普遍在惡意軟件中使用,其主要基於Java虛擬機提供的動態加載技術。

其保護流程是:

開發階段中將程序切分成加載(Loader)與關鍵邏輯(Payload)兩部分,並分別打包;

運行時加載部分(Loader)會先運行,釋放出關鍵邏輯(Payload),然後java的動態加載技術進行加載,並轉交控制權。

缺陷與對抗

第一代加固技術的缺陷是依賴Java的動態加載機制,而這個機制要求關鍵邏輯(Payload)部分必須解壓,並且釋放到文件系統,這就給了攻擊機會去獲取對應的文件。雖然可以通過關鍵邏輯(Payload)被加載後,被從文件系統刪除,用於防止被複制,但是攻擊者可以攔截對應的刪除函數,阻止刪除。

而關鍵邏輯(Payload)會被加密後保存,可用於對抗靜態分析,但是攻擊者可以通過自定義虛擬機,攔截動態加載機制所使用的關鍵函數,在這個函數內部,複製文件系統中的關鍵邏輯(Payload)文件。

第二代加固技術—不落地加載

相對第一代加固技術,第二代加固技術在APK修改方面已經完善,能做到對開發的零干擾。開發過程中不需要對應用做特殊處理,只需要在最終發佈前進行保護即可。而為了實現這個零干擾的流程,Loader需要處理好Android的組件的生命週期。

主要流程:

1)Loader被系統加載。

2)系統初始化Loader內的StubApplication。

3)StubApplication解密並且加載原始的DEX文件(Payload)。

4)StubApplication從原始的DEX文件(Payload)中找到原始的Application對象,創建並初始化。

5)將系統內所有對StubApplication對象的引用使用替換成原始Application,此步驟使用JAVA的反射機制實現。6)由Android系統進行其他組件的正常生命週期管理。

缺陷與對抗

第二代加固技術在應用啟動時要處理大量的加解密加載操作,會造成應用長時間假死(黑屏),用戶體驗差。

在加固技術實現上沒有本質區別,雖然能防止第一代加固技術文件必須落地被複制的缺陷,但是也可以從以下方面進行對抗:

例如內存中的DEX文件頭會被清除,用於防止在dump文件中被找到;DEX文件結構被破壞,例如增加了一些錯誤的數據,提高恢復的成本。

但是Payload被加載之後,在內存中是連續的,利用gdb等調試工具dump內存後可以直接找到Payload,進行簡單的處理之後可以恢復出100%的Payload文件。

和第一代加固技術的對抗方法一樣,不落地加載也無法對抗自定義虛擬機。只需對上述的關鍵函數進行攔截然後將對應的內存段寫出去,即可恢復Payload。注意,由於IO相關的函數被攔截,所以無法直接調用read/write等函數進行直接的讀寫,需要使用syscall函數進行繞過。

雖然廠商會自己實現可能上述函數,從而繞過上述函數的攔截。但是Android的類加載器必須能找到對於的結構體才能正常執行,攻擊者可以以類加載器做為起點,找到對應的Payload在內存中的位置。

安卓客戶端移動應用加固技術的演進

第三代加固技術—指令抽離

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

主要的流程是:發佈階段將原始DEX內的函數內容(Code Item)清除,單獨移除到一個文件中。

缺陷與對抗

指令抽離技術的某些方案與虛擬機的JIT性能優化衝突,無法達到最佳的運行性能。依舊使用了java虛擬機進行函數內容的執行。攻擊者可以通過自定義Android虛擬機,在解釋器的代碼上做記錄一個函數的內容(CodeItem)。接下來遍歷觸發所有函數,從而獲取到全部的函數內容。最終重新組裝成一個完整的DEX文件。目前已經有自動化工具可以指令抽離技術中脫殼。

第四代加固技術—指令轉換/VMP

第三代加固技術在函數級別的保護,使用Android虛擬機內的解釋器執行代碼,帶來可能被記錄的缺陷,第四代加固技術使用自己的解釋器來避免第三代的缺陷。而自定義的解釋器無法對Android系統內的其他函數進行直接調用,必須使用JAVA的JNI接口進行調用。其主要實現由兩種:

A.DEX文件內的函數被標記為native,內容被抽離並轉換成一個符合JNI要求的動態庫。 動態庫內通過JNI和Android系統進行交互。

缺陷與對抗

不論使用指令轉換/VMP加固的A方案或者B方案,其必須通過虛擬機提供的JNI接口與虛擬機進行交互,攻擊者可以直接將指令轉換/VMP加固方案當作黑盒,通過自定義的JNI接口對象,對黑盒內部進行探測、記錄和分析,進而得到完整DEX程序。

下一代加固技術—虛機源碼保護

跟第四代的VMP加固技術,虛機源碼保護加固是用虛機技術保護所有的代碼,包括Java,Kotlin,C/C++,Objective-C,Swift等多種代碼,具備極高的兼容性;使App得到更高安全級別的保護,運行更加穩定。

安卓客戶端移動應用加固技術的演進

虛機源碼保護為用戶提供一套完整的工具鏈,首先把用戶待保護的核心代碼編譯成中間的二進制文件,隨後生成獨特的虛機源碼保護執行環境和只能在該環境下執行的運行程序。

虛機源碼保護會在App內部隔離出獨立的執行環境,該核心代碼的運行程序在此獨立的執行環境裡運行。即便App本身被破解,這部分核心代碼仍然不可見。

加固技術發展及其攻防對抗的更迭,伴隨著互聯網技術發展不斷升級,我們深信邪不能勝正,而虛機源碼保護加固作為當前領先的加固技術,在未來很長一段時間,能夠為App提供足夠強度的保護,為企業和開發者的業務發展保駕護航。


分享到:


相關文章: