外部地址
VMProtect是新一代軟件保護(hù)實(shí)用程序。VMProtect支持德?tīng)柗?、Borland C Builder、Visual C/C++、Visual Basic(本機(jī))、Virtual Pascal和XCode編譯器。
在保護(hù)應(yīng)用程序時(shí),VMProtect 會(huì)利用在編譯期間釋放的空間來(lái)滿(mǎn)足自身需求,包括存儲(chǔ)各種數(shù)據(jù)(虛擬化或變異代碼、VM 解釋器等)。因此,當(dāng)從程序的其他部分跳轉(zhuǎn)到受保護(hù)代碼“內(nèi)部”時(shí),可能會(huì)發(fā)生某些情況。執(zhí)行此類(lèi)跳轉(zhuǎn)的地址稱(chēng)為外部地址。當(dāng)使用代碼標(biāo)記并且在標(biāo)記內(nèi)執(zhí)行從程序的非保護(hù)部分跳轉(zhuǎn)時(shí),可能會(huì)發(fā)生上述情況:
VMProtectBegin(無(wú));
因?yàn)槲遥?0 到 10 做
開(kāi)始
公司(J);
VM保護(hù)結(jié)束;
結(jié)尾;
在匯編代碼中,這個(gè)循環(huán)看起來(lái)像:
-------------- 標(biāo)記開(kāi)始 --------------
0044D12C 移動(dòng) eax,0000000B
0044D131 公司 ebx
--------------標(biāo)記結(jié)束----------------
0044D132 dec eax
0044D133 jnz 0044D131
顯然,當(dāng)0044D12C和0044D131地址的命令被虛擬化,并在0044D133執(zhí)行非虛擬化條件跳轉(zhuǎn)時(shí),會(huì)出錯(cuò),因?yàn)?044D131地址包含各種數(shù)據(jù)或只是垃圾而不是原始代碼。在這個(gè)例子中,0044D131 是一個(gè)外部地址。
啟用“調(diào)試模式”選項(xiàng)后,INT 03 命令將替換原始代碼。這是一個(gè)簡(jiǎn)單的斷點(diǎn)和調(diào)試器命令。當(dāng)受保護(hù)的應(yīng)用程序在調(diào)試器下執(zhí)行并且控制被傳遞到 0044D131 地址時(shí),斷點(diǎn)被激活,并且調(diào)試器窗口顯示給定跳轉(zhuǎn)的起始地址。
當(dāng)檢測(cè)到此類(lèi)跳轉(zhuǎn)時(shí),我們建議檢查所有代碼標(biāo)記,看它們是否設(shè)置正確。如果未標(biāo)記受保護(hù)代碼,或者無(wú)法更改程序邏輯以避免在受保護(hù)代碼內(nèi)部傳遞控制權(quán),則應(yīng)在 GUI 中將此類(lèi)地址標(biāo)記為外部地址。