在网上经常找不到VMProtect的使用说明,导致不清楚怎么设置VMProtect比较好,下面就将自己使用VMProtect的收获与大家分享一下。

首先介绍一下在代码中如何使用VMProtect。

示例程序(这个程序将在后会使用VMProtect设置中用到)

使用Marks标记的
此种方式是将 VMProtectBegin(nil);和 VMProtectEnd;之间的内容进行保护 
procedure TForm1.Button1Click(Sender: TObject);
begin
 VMProtectBegin('Test marker');
 if StrToIntDef(Edit1.Text, 0) mod 17 = 13 then
  MessageDlg(VMProtectDecryptStringA('Correct password'), mtInformation, [mbOK], 0)
 else begin
   MessageDlg(VMProtectDecryptStringA('Incorrect password'), mtError, [mbOK], 0);
   Edit1.SetFocus;
  end;
 VMProtectEnd;
end;
使用Inc文件标记的保护
此种方式是将{$I VMProtectBegin.inc}和{$I VMProtectEnd.inc}之间的内容进行保护 
procedure TForm1.Button1Click(Sender: TObject);
begin
 {$I VMProtectBegin.inc}
  if StrToIntDef(Edit1.Text, 0) mod 17 = 13 then
    MessageDlg('Correct password', mtInformation, [mbOK], 0)
  else begin
    MessageDlg('Incorrect password', mtError, [mbOK], 0);
    Edit1.SetFocus;
  end;
 {$I VMProtectEnd.inc}
end;

VMProtect提供了专家模式和向导模式,默认情况下会进入“向导模式”,但是“向导模式”不够直观并且提供的功能有限,建议使用“专家模式”进行操作。

向导模式

由于“向导模式”不够直观并且提供的功能有限,建议使用“专家模式”进行操作,所以本文不对向导模式进行讲解,具体请参考帮助文档

专家模式

(1)如何进入专家模式

打开VMProtect,进入界面,如下图所示(此界面默认为向导模式)

点击查看按钮,选择“专家模式”,切换到“专家模式”界面进行编辑,此时将进入专家模式界面

(2)专家模式介绍

在专家模式中,VMProtect提供了四个面板——“要保护的流程”、“脚本”、“选项”和“转储”,来对您的程序进行保护。

将刚刚的示例程序中使用第二种方式编译生成的exe拖入,或使用“文件”—“打开”选择要保护的程序,便可以开始设置

可以看到,VMProtect提供了四个面板——“要保护的流程”、“脚本”、“选项”和“转储” 

  • 要保护的流程

        刚刚的示例中包含一个需要VMProtect保护的方法和两个字符串,在VMProtect中可以看到,已经将这些内容添加到了需要保护的范围, 在这里可以选择是否要将这些内容进行保护,建议将程序中添加了保护标记的内容和字符串都进行处理。

       添加程序

        如果您觉得这些保护还不够,需要增加其他内容,可以使用,添加流程的方式,进行添加,选择程序支持ctrl的多选,和shift的多选,可根据需要使用,如图所示:

        选择“新建流程”, 切换到所有流程面板,进行选择。

        在这里要强调一下,如果确认自己要将没有添加“保护”标记的程序添加进来,进行处理,最好在编译时生成map文件,这样当程序有变化时,VMProtect可以根据map文 件进行调整,如果方法比较多,也可以使用“搜索”面板进行搜索,搜索中支持“*”和“?”,*代表任意多字符,?代表一个未知字符。

        新建节点

         为了方便操作,VMProtect还提供了“新建节点”的功能,可以通过这个选项增加一个“Folder”,将需要保护的内容进行分组,便于整体操作,需要注意的是:如果将节点删除,里面受保护的内容将全部取消。分别增加了“程序”和“字符串”两个节点,并作了相应的分类将要保护的内容全部添加完毕后,便可进入“脚本”编辑面板。

  • 脚本

进入脚本编辑界面,可以在右侧的面板中,添加需要的脚本,推荐脚本为:

procedure OnBeforeSaveFile;
var
  I: Integer;
  RCDataRecord: TPEResourceRecord;
begin
  with VMProtector.OutputFile do
  begin
   I := ResourceRecords.IndexOfResType(rtRCData);
   if I > -1 then
   begin
    RCDataRecord:=ResourceRecords[I];
    I := RCDataRecord.IndexOfName('PACKAGEINFO');
    if I > -1 then
    begin
     RCDataRecord.Delete(I);
     Writeln(Format('Resource "%s" is deleted',['PACKAGEINFO']));
    end;
   end;
  end;
end;
  • 选项

其中各项的解释:(具体参见使用说明,这里只做粗略的解释)

(1)内存保护:检测实体的完整性,如果运行时发现不完整,将停止运行
(2)输入表保护:这个选项将把程序中使用的API隐藏起来。
(3)压缩输出文件:如果只是用VMProtect进行保护,可以将这项勾选,如果还会使用ASProtect进行保护,可以将这项去掉。(注意:如果ASProtect和  VMProtect一同使用,先使用VMProtect在使用ASProtect保护)
(4)检测调试器:这个选项将组织调试器对程序的监控,在进入保护段的程序时,如果检测到调试器将显示信息并结束程序运行
(5)虚拟工具:当程序运行在虚拟环境总是,将显示ixnxi并结束程序运行
(6)VM区段,是在用PE Explore查看资源时的显示,将默认的“.vmp”更改为“.upx”是为了迷惑一下使用的保护工具。
(7)调试模式:在VMProtect执行保护程序的编译时,会检查程序中保护段的添加是够正确,如果存在问题,会给出提示。
(8)检查虚拟机对象:在程序运行时,将检测虚拟区段表的完整性和VMProtect的插入点,的完整性,如果不完整也不会给出提示,但是会将程序引入到错误的地址,从而导致程序错误甚至崩溃。
(9)离开虚拟机时加密寄存器:将把VMProtect的输出结果进行加密。
(10)隐藏常量:将阻止通过地址去查询变量或者通过地址去找到一个call方法的地址,但是此选项对于字符串没有作用。
(11)移除固定元素:像delphi这样的编译器,将会产生一个固定元素的列表,但是这些元素对于操作系统执行程序来说是不会用到的,VMProtect将根据这个列表进行处理,只把在保护过程中需要的列表保存下来。
(12)挪动资源到文件尾部:将资源文件放到尾部,例如图片资源。

  • 转储——如果在VMProtect的使用中存在嵌套使用的情况,在这个面板中,可以通过查找“Unpaire”来定位。
  • 完成编译——点击编译按钮,完成编译。之后会在*.exe旁边生成*.vmp和*.vms文件,(如果添加了脚本才会生成*.vms文件)