VMProtect 是一種很可靠的工具,能夠保護應用程序代碼免受分析和破解,但只有在應用程序內保護機制正確構建且沒有可能破壞整個保護的嚴重錯誤的狀況下,才能實現最好的效果。算法
【VMProtect最新試用版下載】bash
接下來咱們一塊兒來看一個很是簡單的應用程序,它只包含一個表單(Form1),一個文本元素(Edit1)和一個按鈕(Button1)。該應用程序的工做方式以下:單擊Button1時,應用程序會檢查輸入的密碼是否正確並顯示相應的消息。函數
這裏使用的是一種很是簡單的算法來檢查密碼:第一步,咱們將其轉換爲數字形式,而後咱們經過除以17來計算餘數。若是輸入密碼的數字表示除以17的餘數等於13,則密碼正確。Delphi上的密碼檢查程序實現以下:工具
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;複製代碼
保護程序和功能的選擇能夠經過三種方式完成:post
使用MAP文件來定義受保護代碼的邊界有一個很重要的優勢。幾乎全部具備局部變量或使用堆棧來保存寄存器和/或中間計算結果的過程或函數都有所謂的序言(prologue)和結尾(epilogue),它們相應地位於編譯過程或函數的開頭和結尾:spa
push ebp \
mov ebp, esp \ prologue
push 00 /
push ebx /
...
pop ebx \
pop ecx \ epilogue
pop ebp /
ret /複製代碼
因爲現代編譯器的工做方式,代碼標記從不包含功能的序言和結尾。即便開始和結束之間的 CheckPassword 函數的整個代碼都包含在標記中。對於黑客來講,只須要修改函數的序言讓程序不執行虛擬化代碼可能就足夠了。 對於CheckPassword 函數,能夠按以下方式完成:code
mov eax, 1
ret複製代碼
注意:orm
若是使用MAP文件來選擇用於虛擬化的代碼片斷,則序言和結尾也被虛擬化,從而顯着提升受保護程序的防黑客能力。此外,一個虛擬化函數是從另外一個虛擬化函數調用的,控件在它們之間傳輸而不實際跳轉到被調用函數的地址(在這種狀況下,調用是一個簡單的跳轉到虛擬機解釋器的字節碼內的另外一個地址)。 這也增強了對程序的保護,由於黑客對入口點的全部修改都沒有用。使用虛擬化函數時,只有在從未受保護或變異的代碼片斷調用受保護函數時,纔會將控制權轉移到虛擬化函數的入口點。cdn
下篇文章將給你們介紹 VMProtect 準備項目之使用MAP文件,敬請期待~ 若是你有任何問題或建議,請在下方留言噢。blog