這段時間在測試.Net Jit的容錯性,為了方便,就直接將代碼插入到Jit中進行測試了。
這個種方式就是我前面介紹DNGuard時提到的第一種增加核心強度防反射脫殼的方法。
這種技術即可用在dotnet代碼的保護上,也可以用在dotnet加密殼的解密上。
目前的加密殼都是將核心插入到ee中提供解密服務。而dotNet的反射功能也是在ee層實現的,
所以才暴露了加密殼之前的反射漏洞。
如果加密殼將核心插入到jit,和jit融合提供解密服務,那麼反射就基本上失效了。在 ee 層就無法擷取到解密的代碼了。
在這種情況下修複反射基本上是不現實的了,jit只是為ee提供編譯服務。當然如果實現了jit層的脫殼,然後反過來再從jit增加一個服務提供ee層調用也是可以修複反射的,但如果實現了jit層的脫殼,再修複反射就有點多此一舉了。
如果直接從Jit層脫目前ee層的加密殼是比較輕鬆的,根本不用考慮修複反射的問題,對.Net 2.0 , 1.1都管用。
這種方法對目前加密殼以及它們的各個版本都有效。只是jit層脫殼有一個問題要解決,因為只有方法被編譯時間才會進入jit,所以要完全脫殼需要讓方法都被編譯。
不過這個問題不大,從ee層或者反射著手都可以解決。之前對付某殼老版本時用過,當時該殼沒有躲過Profile,可以從profile裡面dump到代碼,同樣只有方法在編譯時間才能通過profile得到代碼。
用反射比較簡單,不用瞭解ee都可以,invoke一個方法時這個方法肯定會被編譯的。
Jit層脫殼可以通吃目前的ee層加密殼,加密殼如果還在ee層混就沒什麼前途了。
Jit層脫Jit層的加密殼,就如同目前用反射脫ee層的殼差不多(甚至可能還稍差一籌),沒法做到通吃,只能針對不同的加密殼核心做不同的脫殼核心才行。
Jit加密殼和Jit融合得越複雜,要脫殼難度就越大。不過這樣要保證加密殼的穩定性和相容性,就要做更多的工作了。
就是這個原因,我才做Jit的容錯性測試,DNGuard 2.0的核心使用的就是Jit層,容錯性測試差不多了。
DNGuard目前的核心基調就不會再調整了。
接下來就要著手DNGuard H-VM的實驗和測試了。這個也是純Jit層的。(H = half)
DNGRuntime在運行時動態還原程式集,進行程式集方法的拆分(即一個方法被拆分為兩個或多個),
拆分後的方法差不多是一半走jit,一半走DNG H-VM。
遵循如下約定:
如果方法A走Jit,則被方法A所調用的方法都走 DNG H-VM。