準(zhǔn)備項(xiàng)目
VMProtect 是保護(hù)應(yīng)用程序代碼免遭分析和破解的可靠工具,但只有在正確構(gòu)建應(yīng)用程序內(nèi)保護(hù)機(jī)制并且沒(méi)有可能破壞整個(gè)保護(hù)的典型錯(cuò)誤的情況下才能最有效地使用。
VMProtect 是保護(hù)應(yīng)用程序代碼免遭分析和破解的可靠工具,但只有在正確構(gòu)建應(yīng)用程序內(nèi)保護(hù)機(jī)制并且沒(méi)有可能破壞整個(gè)保護(hù)的典型錯(cuò)誤的情況下才能最有效地使用。
讓我們一起來(lái)看一個(gè)非常簡(jiǎn)單的應(yīng)用程序,它只包含一個(gè)表單(Form1),一個(gè)文本元素(Edit1)和一個(gè)按鈕(Button1)。該應(yīng)用程序的工作方式如下:?jiǎn)螕鬊utton1時(shí),應(yīng)用程序會(huì)檢查輸入的密碼是否正確并顯示相應(yīng)的消息。
我們使用非常簡(jiǎn)單的算法檢查密碼:第一步,我們將其轉(zhuǎn)換為數(shù)字形式,然后計(jì)算除以 17 的余數(shù)。如果輸入的密碼的數(shù)字表示除以余數(shù),則密碼正確17 等于 13。Delphi 上的密碼檢查程序?qū)崿F(xiàn)如下所示:
function TForm1.CheckPassword: Boolean; begin Result:=(StrToIntDef(Edit1.Text, 0) mod 17=13); end; procedure TForm1.Button1Click(Sender: TObject); begin if CheckPassword then MessageDlg('Correct password', mtInformation, [mbOK], 0) else begin MessageDlg('Incorrect password', mtError, [mbOK], 0); Edit1.SetFocus; end; end;
選擇要保護(hù)的過(guò)程和函數(shù)可以通過(guò)三種方式完成:
- 使用編譯器創(chuàng)建的 MAP 文件以及程序的可執(zhí)行文件。MAP 文件包含有關(guān)應(yīng)用程序所有過(guò)程和功能的名稱和地址的所有必要信息。如果使用 MAP 文件,您可以選擇要通過(guò)名稱保護(hù)的過(guò)程和函數(shù)。使用 MAP 文件,每次重新編譯項(xiàng)目時(shí),VMProtect 都會(huì)自動(dòng)確定過(guò)程和函數(shù)的新地址。
- 使用插入到應(yīng)用程序源代碼中的標(biāo)記。標(biāo)記是 VMProtect 用來(lái)確定受保護(hù)片段邊界的特殊標(biāo)記。此外,VMProtect 支持具有預(yù)定義編譯類型的標(biāo)記。當(dāng)您只想保護(hù)函數(shù)或過(guò)程的一部分時(shí),使用標(biāo)記是有意義的。使用標(biāo)記允許您指定要保護(hù)的字符串常量的代碼部分。
- 通過(guò)可執(zhí)行文件中受保護(hù)過(guò)程的地址。與上述兩種方式相比,這種方式使用起來(lái)不太方便。每次修改和重新編譯應(yīng)用程序時(shí),您都必須重新指定所有地址。對(duì)于沒(méi)有可用源代碼的應(yīng)用程序,建議使用這種類型的保護(hù)。
使用 MAP 文件定義受保護(hù)代碼的邊界還有一個(gè)更重要的優(yōu)勢(shì)。幾乎所有具有局部變量或使用堆棧保存寄存器和/或中間計(jì)算結(jié)果的過(guò)程或函數(shù)都有所謂的序言和結(jié)語(yǔ),它們相應(yīng)地位于已編譯過(guò)程或函數(shù)的開(kāi)頭和結(jié)尾:
push ebp \ mov ebp, esp \ prologue push 00 / push ebx / ... pop ebx \ pop ecx \ epilogue pop ebp / ret /
由于現(xiàn)代編譯器的工作方式,代碼標(biāo)記從不包含函數(shù)的序言和結(jié)尾。即使開(kāi)始和結(jié)束之間的 CheckPassword 函數(shù)的整個(gè)代碼都包含在標(biāo)記中。黑客修改函數(shù)的序言就足以使虛擬化代碼永遠(yuǎn)不會(huì)被執(zhí)行。對(duì)于 CheckPassword 函數(shù),這可以按如下方式完成:
mov eax, 1 ret
重要提示:
如果使用 MAP 文件來(lái)選擇用于虛擬化的代碼片段,則序言和結(jié)尾也會(huì)被虛擬化,從而提高受保護(hù)程序的防黑客攻擊能力。此外,如果一個(gè)虛擬化函數(shù)被另一個(gè)虛擬化函數(shù)調(diào)用,則控制權(quán)在它們之間轉(zhuǎn)移而不實(shí)際跳轉(zhuǎn)到被調(diào)用函數(shù)的地址(在這種情況下,調(diào)用是簡(jiǎn)單地跳轉(zhuǎn)到虛擬機(jī)解釋器字節(jié)碼中的另一個(gè)地址)。這也加強(qiáng)了對(duì)程序的保護(hù),因?yàn)楹诳蛯?duì)入口點(diǎn)所做的所有修改都變得毫無(wú)用處。使用虛擬化函數(shù)時(shí),僅當(dāng)從未受保護(hù)或變異的代碼片段調(diào)用受保護(hù)函數(shù)時(shí),才會(huì)將控制權(quán)轉(zhuǎn)移到虛擬化函數(shù)的入口點(diǎn)。
以上便是本篇文章的分享,如果您有任何疑問(wèn)或者想獲取更多產(chǎn)品試用/授權(quán)/價(jià)格信息,請(qǐng)點(diǎn)擊VMProtect了解。