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