外部地址
VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C++、Visual Basic(本机)、Virtual Pascal和XCode编译器。
在保护应用程序时,VMProtect 会利用在编译期间释放的空间来满足自身需求,包括存储各种数据(虚拟化或变异代码、VM 解释器等)。因此,当从程序的其他部分跳转到受保护代码“内部”时,可能会发生某些情况。执行此类跳转的地址称为外部地址。当使用代码标记并且在标记内执行从程序的非保护部分跳转时,可能会发生上述情况:
VMProtectBegin(无);
因为我:=0 到 10 做
开始
公司(J);
VM保护结束;
结尾;
在汇编代码中,这个循环看起来像:
-------------- 标记开始 --------------
0044D12C 移动 eax,0000000B
0044D131 公司 ebx
--------------标记结束----------------
0044D132 dec eax
0044D133 jnz 0044D131
显然,当0044D12C和0044D131地址的命令被虚拟化,并在0044D133执行非虚拟化条件跳转时,会出错,因为0044D131地址包含各种数据或只是垃圾而不是原始代码。在这个例子中,0044D131 是一个外部地址。
启用“调试模式”选项后,INT 03 命令将替换原始代码。这是一个简单的断点和调试器命令。当受保护的应用程序在调试器下执行并且控制被传递到 0044D131 地址时,断点被激活,并且调试器窗口显示给定跳转的起始地址。
当检测到此类跳转时,我们建议检查所有代码标记,看它们是否设置正确。如果未标记受保护代码,或者无法更改程序逻辑以避免在受保护代码内部传递控制权,则应在 GUI 中将此类地址标记为外部地址。