1.前言
之前研究過dnguard_hvm,這個東西的強度是可以的。但是破綻也很明顯。料想vmp也是如此,不過研究下來。vmp的強度可能更高點,它需要涉及到內核驅動的反調試。本篇來看下。
2.概括
一:托管的困擾
vmp貌似只能加密exe,但是托管的exe只是一個啟動程序(這點可以參考這篇文章:Exe和托管DLL區別是什么),也就是啟動clr讓clr加載托管dll。所以托管的代碼實際上都在dll里面。vmp加密了exe,但是托管dll里面原封不動,所以導致了很容易破解。幾乎不費吹灰之力,這里不贅述。只是看下AOT預編譯之后的加密。
二.高強度AOT加密
托管的AOT實際上被預編譯成了本機機器碼,這種東西本身如果不加密的話,就需要非常熟知AOT編譯器ILC的運作模式,以及C++引導文件Bootstrap的運作模式。才能夠非常容易的逆向和破解它。這點依然不是難點。難點就在于,如果用vmp加密AOT的exe程序。除了上述之外,首先就需要面對的一點就是反調試,而且類似于dnguard_hvm那種補丁式樣的破解,是無效果的,不知道vmp是何種機制造成的。
這里用vmp3.7.3版本,它加密全部選擇上,比如以下:
內存保護
導入信息保護
資源保護
壓縮輸出文件保護
輸出文件保護
檢測調試器
檢測虛擬工具
移除調試信息
移除重定位信息
把以上保護全部勾選上,讓其最強加密。
三.破除方法
這里有一個比較粗暴的破除方式就是,先把調試標志給禁掉
BegingDebugged
NtGlobalFlags
然后hook以下幾個驅動函數
NtQueryInformationProcess
NtSetInformationThread
NtClose
NtQuerySystemInformation
NtQueryInformationThread
把涉及到調試的信息驅動層面能hook掉的全hook掉。
四.做法
通過在ntoskrnl.exe里面搜索特征碼,找到回調函數。封裝一個函數,通過__readgsqword獲取到進程環境塊,通過當前進程棧頂和棧底的循環找到回調函數的兩個參數索引,和函數地址,傳入進去。把封裝的函數賦值給回調函數。就可以hook了。
以上也僅為第一步,可以調試了。而后面的分析應該相對于簡單些,但是也不容忽視。
以上方法來自于網路,后面驗證下這個方法。
結尾