APP加固技術歷程及將來級別方案:虛機源碼保護

傳統App加固技術,先後經歷了四代技術變動,保護級別每一代都有所提高,但其固有的安全缺陷和兼容性問題始終未能獲得解決。而下一代加固技術—虛機源碼保護,適用代碼類型更普遍,App保護級別更高,兼容性更強,堪稱將來級別的保護方案。
7aeeb49f-bfd7-4804-9c96-2391295d882d.jpg
(加固技術發展歷程)java

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

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

其保護流程是:
開發階段中將程序切分紅加載(Loader)與關鍵邏輯(Payload)兩部分,並分別打包;
4d828a0c-c842-4bdf-8dd6-e338fde2b916.png
(開發階段)性能優化

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

78bf2bdb-17e8-4aad-87ac-b8cb5508cc14.png
(核心代碼)ide

備註(multidex組件的加固原理):
Android的DEX文件在設計之初程序廣泛較小,因此在DEX文件設計時,只容許包含65535個函數引用。而隨着Android應用的發展,大量的應用的代碼已經超過了65535的限制,爲了解決這個問題,Android5.0以後原生支持加載多個dex,而爲了對舊版本的兼容,Android提供了multidex組件。該組件的實現原理與上面介紹的是一致的。函數

缺陷與對抗
第一代加固技術的缺陷是依賴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系統進行其餘組件的正常生命週期管理。加密

fc62a6eb-45bf-4849-a792-ab93e726e418.png
(對開發零干擾的加固後啓動流程)

另外一方面,不落地加載技術是在第一代加固技術的基礎上改進,主要解決第一代技術中Payload必須釋放到文件系統(俗稱落地)的缺陷,其主要的技術方案有兩種:
A.攔截系統IO相關的函數(如read、write),在這些函數中提供透明加解密。具體的流程是:
1)關鍵邏輯(Payload)以加密的方式存儲在APK中。
2)運行時加載部分(Loader)將關鍵邏輯釋(Payload)放到文件系統,此時關鍵邏輯(Payload)還處於加密狀態。
3)加載部分攔截對應的系統IO函數(read,write等)。
4)加載部分(Loader)正常調用Java動態加載機制。因爲虛擬機的IO部分被攔截,因此虛擬機讀取到已經解密的關鍵邏輯(Payload)。

59c215d8-970b-467d-8653-b231ec92e145.png
(透明加解密方案流程)
B.直接調用虛擬機提供的函數進行不落地的加載,具體流程是:
1)關鍵邏輯(Payload)以加密的方式存儲在APK中。
2)運行時加載部分(Loader)將關鍵邏輯釋(Payload)放到內存。
3)加載部分調用虛擬機內部接口進行加載。
ade75f1d-c350-4f1a-80f9-8397daabc04b.png
(不落地加載流程)

關鍵的系統函數以下:
e2a67a93-ea91-489a-b204-171bdbe0922e.png

兼容性
方案A透明加密方案因爲其須要攔截系統的IO函數,這部分會使用inline hook或者got hook等技術,其會帶來必定的兼容性問題。

方案B的不落地加載方案因爲其調須要調用系統內部的接口,而這個接口並不導出,各個廠商在實現時又有各自的自定義修改,致使該方案存在兼容性問題。

缺陷與對抗
第二代加固技術在應用啓動時要處理大量的加解密加載操做,會形成應用長時間假死(黑屏),用戶體驗差。

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

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

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

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

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

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

因爲第二代加固技術僅僅對文件級別進行加密,其帶來的問題是內存中的Payload是連續的,能夠被攻擊者輕易獲取。第三代加固技術對這部分進行了改進,將保護級別降到了函數級別。
主要的流程是:發佈階段將原始DEX內的函數內容(Code Item)清除,單獨移除到一個文件中。
29f871c7-88d0-4afe-8bac-d52b265d2051.png
(發佈階段)

運行階段將函數內容從新恢復到對應的函數體。恢復的時間點有幾個方式:
A.加載以後恢復函數內容到DEX殼所在的內存區域
c73d44d7-77b5-41ea-8cba-1f6551e317dd.png
(運行階段)

B.加載以後將函數內容恢復到虛擬機內部的結構體上:虛擬機讀取DEX文件後內部對每個函數有一個結構體,這個結構體上有一個指針指向函數內容(CodeItem),能夠經過修改這個指針修改對應的函數內容。

b2dd9e91-21fc-4b87-9706-9b8e119b7b78.png
C.攔截虛擬機內與查找執行代碼相關的函數,返回函數內容。

兼容性
指令抽離技術使用了大量的虛擬內部結構與未被文檔的特性,再加上Android複雜的廠商定製,帶來大量的兼容性問題。

缺陷與對抗
指令抽離技術的某些方案與虛擬機的JIT性能優化衝突,沒法達到最佳的運行性能。依舊使用了java虛擬機進行函數內容的執行。攻擊者能夠經過自定義Android虛擬機,在解釋器的代碼上作記錄一個函數的內容(CodeItem)。接下來遍歷觸發全部函數,從而獲取到所有的函數內容。最終從新組裝成一個完整的DEX文件。目前已經有自動化工具能夠指令抽離技術中脫殼。
7e249d36-0b50-471d-9771-527febd1c84c.png
(第三代加固DEX文件脫殼流程)

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

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

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

96c77d37-73e2-4974-bda5-c8f754bfe0cf.png

B.DEX文件內的函數被標記爲native,內容被抽離並轉換成自定義的指令格式,該格式使用自定義接收器執行,和A同樣須要使用JNI和Android系統進行調用。

5447059c-ace3-44c1-bcb0-202e506894de.png

兼容性
第四代VMP加固技術通常配合第三代加固技術使用,因此第三代的全部兼容性問題,指令轉換/VMP加固也存在。

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

1be1b184-7813-4574-bef9-a450aa69b1a9.png
(第四代加固DEX文件恢復)
另外,第四代VMP加固技術只實現Java代碼保護,沒有作到使用VMP技術來保護C/C++等代碼,安全保護能力有所欠缺。

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

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

虛機源碼保護爲用戶提供一套完整的工具鏈,首先把用戶待保護的核心代碼編譯成中間的二進制文件,隨後生成獨特的虛機源碼保護執行環境和只能在該環境下執行的運行程序。
虛機源碼保護會在App內部隔離出獨立的執行環境,該核心代碼的運行程序在此獨立的執行環境裏運行。即使App自己被破解,這部分核心代碼仍然不可見。

64e67945-0e11-4ddf-b81e-6f6aa57a487c.png
(虛機源碼保護加固流程)

生成的虛機源碼保護擁有獨特的可變指令集,極大的提升了指令跟蹤、逆向分析的難度。同時,虛機源碼保護還提供了反調試能力和監控能力。虛機源碼保護能夠經過自身的探針感知到環境的變化,實時探測到外界對本環境的調試、注入等非正常執行流程變化,將調試動做引入程序陷阱,併發出警報,進而進行實時更新,提升安全強度。

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

更多安全類技術分享,請訪問頂象官方博客:https://www.dingxiang-inc.com...

相關文章
相關標籤/搜索