前面我們介紹了目前主流的雙層加密殼核心實現原理,
以及應對相容性,同時考慮安全性的前提下對加密殼核心進行簡化。
並就加密殼核心的相容性以及安全性進行了討論 ,提到了加密殼核心相容性和安全性共贏的實現模式,純Jit層核心。
今回我們將介紹這種加密殼核心的實現。
前面我們已經將加密殼核心簡化為只Hook架構核心的兩個函數,mscorwks.dll中一個,mscorjit.dll中一個。
同時在相容性方面我們瞭解到mscorwks.dll是一個瓶頸問題,所以我們將要拋棄核心對mscorwks.dll的Hook。只保留對mscorjit.dll的一個Hook。
不少朋友可能已經瞭解到了DNGuard HVM試用版的核心模式,它就是純Jit層實現,今回就以此為例介紹。
首先取消對EE層的依賴
即加密殼不在EE層安裝任何服務。這樣在相容性方面就完全拋開了mscorwks.dll這個瓶頸問題。
在安全方面也有改善,避免了可能被EE層攔截泄漏方法體局部變數簽名和異常處理表的弱點。
參考:http://www.cnblogs.com/rick/archive/2007/08/13/852999.html
在加密殼運行庫中實現方法體的預先處理
因為加密殼沒有在EE層Hook完成方法體的預先處理,所以我們需要在Jit層完成對當前編譯方法的預先處理。
程式運行到加密殼運行庫中時的相關結構體包含的內容並不是當前方法體的正確內容,我們需要在此對結構內容進行重建。
至於怎麼實現方法體的預先處理,我們可以通過逆向mscorwks.dll,分析其虛擬機器預先處理層的相關實現代碼,自己類比實現。
必須要把實現代碼全部移植到加密殼運行庫中,不然將仍然無法擺脫對mscorwks.dll的依賴。
方法體的預先處理可以處理哪些東西
1、可以把方法體的局部變數簽名以及異常處理表直接轉化為Jit層中的相應對象實體。
2、對IL位元組碼進行還原。
註:IL位元組碼是直接在Jit層中傳遞的,有被Jit層攔截的風險。
Jit層Hook位置的選取
DNGuard HVM試用版 使用了直接Hook編譯的入口函數的方式。加密殼核心只直接攔截了Jit中一個位置。
這種模式是DNGuard HVM 標準版以及專業版的基礎模式。
在加密殼提供的新編譯入口函數裡面,我們首先要做的就是方法體的判斷,如果是加密的方法體,則進行方法體的編譯預先處理操作(DNGuard 標準在預先處理完成後對中間資料進行銷毀)。
然後將控制權傳遞給Jit。
“方法體加密對應資訊” 的改善,應對靜態脫殼者
在前面 .Net 加密原理,方法體加密資訊對應關係的實現 介紹了 “方法體加密對應資訊”的實現。
我們前面一直採用的直接儲存在中繼資料中的方式,主要是為了方便EE層中的操作。
現在採用純Jit層核心,可以順便對這個進行改進。
這個改進後採用自訂的結構表來儲存這些資訊,同時可以對結構表進行加密。這種方式可以增加抗靜態脫殼的強度。當然對動態攔截者沒有多少影響。
針對Jit層架構的局部檢測,應對Jit層動態攔截
目前的加密殼核心,還無法保證IL位元組碼在Jit層中的安全,即可能被攔截導致IL位元組碼泄漏。
所以對於純Jit層加密殼,我們至少要保證它在這方面不比雙層殼差。在雙層核心中因同時攔截了3個函數,所以破解者需要攔截這三個函數下級的函數才可能實現攔截。
而在這裡,因為核心只攔截了入口函數,破解者可以直接攔截這些函數來截獲IL位元組碼。
解決方案也簡單,就是在加密殼運行庫中對這三個函數進行檢測即可。
當然,你可以擴大檢測範圍。
另外如果注重相容性可以完全不檢測任何函數,如DNGuard HVM的試用版就是這樣的。
DNGuard HVM標準版對部分架構函數進行了檢測。
這種核心仍然無法保證IL位元組碼,其保護意義何在?
這種核心在目前的加密殼核心模式來說已經是一種進步。當前市面上的加密殼核心模式都存在可通過直接攔截架構函數擷取完整方法體的弱點,而這種模式已經能夠保障方法體局部變數簽名以及異常處理表不能從加密殼運行庫以外的地區攔截擷取了。也即破解者如果直接從架構入手,將無法擷取這兩部分。
無法保障IL位元組碼,其它的保護還有什麼意義?
首先,IL位元組碼只是方法體的其中一部分。保護了其它部分,就能有效阻止破解者完成完全脫殼。
這樣破解者將無法擷取到一個完整的脫殼後的程式集,就跟不能對程式集進行整體的分析、最佳化、反混淆等相關處理。
破解者就只能得到單個方法體獨立的IL'位元組碼。這樣已經可以基本保護代碼著作權了,也大大增加了破解分析的難度,配合代碼流程混淆,效果更佳。
局部變數簽名對程式流程沒有影響,應該對IL代碼的分析影響較少。異常處理表會影響代碼流程(如final塊fault塊)。 再有一點就是沒有 異常處理表,進行流程反混淆將會更加困難。
不過,總歸是不完美,所以在DNGuard 專業版中增加了HVM功能,以實現保護Jit層中的IL位元組碼,讓破解者不能截獲正確完整的IL位元組碼。
下一回我們將介紹一下HVM核心的工作原理。