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