日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
.NetJIT的騷操作DNGuardHVM原理簡析

前言

DNGuard HVM的牛掰之處在于,就算知道了它的原理,但是你依然無法很優(yōu)雅的去破解它。本篇來看下。友情提示,看本篇前,可先預(yù)熱下前一篇:DNGuard HVM是如何加密.Net的

創(chuàng)新互聯(lián)建站擁有十載的建站服務(wù)經(jīng)驗(yàn),在此期間,我們發(fā)現(xiàn)較多的客戶在挑選建站服務(wù)商前都非常的猶豫。主要問題集中:在無法預(yù)知自己的網(wǎng)站呈現(xiàn)的效果是什么樣的?也無法判斷選擇的服務(wù)商設(shè)計(jì)出來的網(wǎng)頁效果自己是否會滿意?創(chuàng)新互聯(lián)建站業(yè)務(wù)涵蓋了互聯(lián)網(wǎng)平臺網(wǎng)站建設(shè)、移動平臺網(wǎng)站制作、網(wǎng)絡(luò)推廣、定制網(wǎng)站設(shè)計(jì)等服務(wù)。創(chuàng)新互聯(lián)建站網(wǎng)站開發(fā)公司本著不拘一格的網(wǎng)站視覺設(shè)計(jì)和網(wǎng)站開發(fā)技術(shù)相結(jié)合,為企業(yè)做網(wǎng)站提供成熟的網(wǎng)站設(shè)計(jì)方案。

概括

1.MSIL保存

DNGuard HVM類庫模式編譯第一步就是把MSIL的原字節(jié)碼(你需要加密的托管DLL)二進(jìn)制代碼保存在HVMRun64.dll里面以匯編的形式呈現(xiàn)。注意這里保存的是原字節(jié)碼二進(jìn)制代碼,而不是保存字節(jié)碼編譯之后的匯編代碼。如果是保存的MSIL編譯后的匯編代碼,可以通過逆向匯編。但保存的字節(jié)碼的二進(jìn)制代碼還需要通過CLR+JIT編譯成機(jī)器碼之后進(jìn)行即時運(yùn)行,RunHVM函數(shù)隨時可以Hook JIT或者CLR的某個地方或者幾個地方,對它進(jìn)行篡改。逆向的難度呈幾何指數(shù)的增加。這里的MSIL的二進(jìn)制代碼可以參考文章:罕見的技術(shù):MSIL的機(jī)器碼簡析舉個例子以下C#代碼:

static void Main(string[] args)
{
  Console.ReadLine();
  Console.WriteLine("Call Main");
}

它的MSIL二進(jìn)制代碼是:

00 28 0e 00 00 0a 26 72 01 00 00 70 28 0f 00 00 0a 00 2a 00 af 93 65 6c 00 13 00 80 00 00 00 00 00 00 00 00  //后面省略

這種二進(jìn)制代碼,DNGuard會把它保存在HVMRun64.dll里面。

2.MSIL加密

當(dāng)它保存好了原MSIL之后,就著手加密托管的DLL里面的MSIL,把它變成了

Dnspy/ILSpy/Dotpeek這種工具無法修改的MSIL。比如以上C#代碼被加密成了如下:

[NullableContext(1)]
[MethodImpl(MethodImplOptions.NoInlining)]
private static void Main(string[] args)
{
    throw new Exception("Error, DNGuard Runtime library not loaded!");
}

實(shí)際上就算是沒有加密MSIL,因?yàn)樗莌ook jit,也無法通過修改MSIL來變更源碼。

3.hook JIT

當(dāng)運(yùn)行被DNGuard修改的托管DLL的時候,RunHVM函數(shù)就會調(diào)用HVMRun64.dll里面的代碼hook即時.Net編譯器JIT里面的invokeCompileMethod函數(shù),因?yàn)镴IT會按照預(yù)定的順序編譯MSIL,而原有的MSIL被保存到了HVMRun64.dll里面去。被JIT執(zhí)行的托管DLL里的MSIL則是被DNGuard加密過的是個錯誤的數(shù)據(jù)或者一堆亂數(shù)據(jù)。它hook這個函數(shù)的目的就是修改這個函數(shù)的參數(shù)里面保存的被DNGuard修改過了的MSIL二進(jìn)制代碼的起始地址,它把這個起始地址Hook成上面第一步存放的MSIL二進(jìn)制代碼的起始地址。此后JIT就會用Hook出來的地址,逐個編譯里面的MSIL二進(jìn)制代碼,把它編譯成機(jī)器碼,然后運(yùn)行。這樣就完成了完整的整個執(zhí)行。以下是HVMRun64.dll對托管主函數(shù)Main進(jìn)行Hook調(diào)用地址的順序,按照堆棧順序從下往調(diào)用。

0000000180497AB8 4C 89 5F 10          mov         qword ptr [rdi+10h],r11
00000001804839DF FF 1A                call        fword ptr [rdx]
0000000180015759 E8 A2 61 FF FF       call        000000018000B900
0000000180040918 E8 43 4B FD FF       call        0000000180015460

這四個地址里面的地址:00000001804839DF進(jìn)行了四字節(jié)位移運(yùn)行。這種加固靜態(tài)逆向的難度。

4.難點(diǎn)

這個過程的難點(diǎn)在于,DNGuard是以何種方式把原MSIL保存到HVMRun64.dll,然后又通過何種方式取出來。MSIL的二進(jìn)制代碼存放在HVMRun64.dll的哪個地方?只要找到了存儲的位置,即可輕松破解DNGuard的加密。難點(diǎn)一:逆向調(diào)試DNGuard的時候,發(fā)現(xiàn)HVMRun64.dll里面的數(shù)據(jù)無法調(diào)試,只要下了斷點(diǎn)或者調(diào)試器進(jìn)去就會導(dǎo)致數(shù)據(jù)更改,更改后的數(shù)據(jù)要么是空的那么就全是0xCCCC這種東西,然后報異常。下斷點(diǎn)導(dǎo)致數(shù)據(jù)更改,這跟.Net7里面的內(nèi)存映射有點(diǎn)相似,這點(diǎn)還待研究。難點(diǎn)二:DNGuard在Hook JIT的時候,它會進(jìn)行字節(jié)位移。比如本來的地址如下:

00000001804839DB: E8 1C F9 DD FF   call   00000001802632FC
00000001804839E0: 1A E8            sbb    ch,al

00000001804839DB這個地址看著沒問題,但是實(shí)際上它是個偽裝地址,在運(yùn)行的過程中,會把這個地址加上4字節(jié),也就是到了地址00000001804839DF這個地址,然后再運(yùn)行。這樣導(dǎo)致了機(jī)器碼也跟著改變,靜態(tài)逆向完全無法展開,而動態(tài)逆向則坑爹的一筆,最新的DNGuard近5M大小,里面的匯編代碼高達(dá)153萬多行?;旧蠈儆跓o法逆向的存在。

5.破除按照以上原理認(rèn)知,以下是個人認(rèn)為 可行的理論上的破解之法

如下代碼:

0000000180497AB8 4C 89 5F 10   mov   qword ptr [rdi+10h],r11

r11里面就是存儲是HVMRun64.dll里面的MSIL二進(jìn)制代碼,rdi寄存器是JIT函數(shù)invokeCompileMethod參數(shù)methodInfo的地址,加上0x10為methodInfo.ILCode也即是混淆的MSIL二進(jìn)制代碼的起始地址,把從HVMRun64.dll里面取出來的MSIL二進(jìn)制代碼起始地址替換掉這個被混淆的MSIL二進(jìn)制代碼的地址,然后運(yùn)行完整流程。

破一:根據(jù)RunHVM函數(shù)的原理,它hook JIT的函數(shù),這里就hook這個JIT函數(shù)后面的一個函數(shù),照樣獲取ILCode,修改后返回運(yùn)行。這里是照貓畫虎,RunHVM怎么玩JIT,這里就怎么玩RunHVM。

破二:這里還有個破綻,因?yàn)?000000180497AB8這個地址則寫死在了HVMRun64.dll里面,再者[rdi+10h]這個地址是否能夠替換成別的地址,獲取MSIL的二進(jìn)制起始地址,進(jìn)行修改然后,也是可以從這里入手的。

可以看到即使知道了RunHVM原理,要想破除它依然有一定的難度。真正的實(shí)現(xiàn)可能比較不優(yōu)雅的方式。

注:以上用于學(xué)習(xí)用途,其它用途均跟本人完全無關(guān)。


本文題目:.NetJIT的騷操作DNGuardHVM原理簡析
分享鏈接:http://www.dlmjj.cn/article/cdpdhji.html