VMProtect 是新一代的软件保护系统,将保护后的代码放到虚拟机中运行,这将使分析反编译后的代码和破解变得极为困难。使用 MAP 文件或内建的反编译引擎,您可以快速选择需要保护的代码。
VMProtect 是新一代的软件保护系统,将保护后的代码放到虚拟机中运行,这将使分析反编译后的代码和破解变得极为困难。使用 MAP 文件或内建的反编译引擎,您可以快速选择需要保护的代码。
VMProtect是一个软件保护软件。通过这个软件保护的代码部分在虚拟机上执行,这使得被保护的程序很难被分析与破解。反汇编程序与MAP文件的运用使您能快速选择需要保护从而避免破解的代码。
与其它大部分的保护程序不同,VMProtect可修改程序的源代码。VMProtect可将被保护文件中的部分代码转化到在虚拟机(以下称作VM)上运行的程序(以下称作bytecode)中。您同样可把VM想象为具备命令系统的虚拟处理器,该命令系统与Intel 8086处理器所使用的完全不同。例 如,VM没有负责比较2个操作数的命令,也没有有条件与无条件的移转等。就象您看到的,黑客必须开发一款特定的工具以分析与反编译bytecode, 而且还相当地耗时。可是,我们知道没有无法破解的保护程序,这也是我们为什么会将保护级别达到破解费用与购买费用相当(或破解费用甚至超过购买费用)的程度。不管怎么样,请记住VMProtect是唯一一款能帮助您“隐藏”主要软件保护机制的工具。
如何使用VMProtect使用"File"-"Open"菜单项加载工程。添加负责检查工程密码是否正确的程序:
VMProtect能根据所选的编译类型以不同的方式处理被保护的代码。
VMP功能
在处理器命令的程度上修改了执行文件(修改了现有的命令,添加了所有类型的垃圾命令等)。该编译类型无法充分地保护代码。它只能避免破解、解析以及避免进行中的功能由签名解析器确定(PEiD+KANAL、IDA+FLIRT等)。作为固定规则,我们并不需要保护库功能不受破解以及解析,只需要更改它们的签名就足够保护在您应用程序中应用的库(对破解与解析的保护程度不高,代码的执行率很高)。
可执行代码被转化为由虚拟机执行的bytecode。该编译类型应该应用到所有执行率非常重要的代码的关键部分以防止破解与解析(对破解与解析的保护程度中等,代码的执行率中等)。
以处理器命令的程度修改可执行代码,然后将它转化为由虚拟机执行的bytecode。该编译类型应该应用到执行率不重要的代码(对破解与解析的保护程度高,代码的执行率低)。
用来确认外部地址,寻找外部代码参考的地址。
如果启用该选项,就不能在打开的表格中找到变量地址或调用的功能。
VM解释程序不能执行所有的Intel 8086命令,这就是为什么这些命令会以它们在保护部分中展现的形式执行的原因。动态创建在线命令同样让针对bytecode的破解变得艰难。
当执行程序的时候,VM解释程序会自动读取当执行命令时被运用的程序、bytecode以及水印中任意部分的检查结果。VM对象的完整性检查可保护解释程序、bytecode以及水印免遭修改。
选择您希望内置到被保护文件中的水印。
能为即将被写入VM解释程序与bytecode的新项目指定名称
移除fixup元素(只针对EXE文件
编译程序(尤其象Delphi)会为EXE文件创建一个fixup元素列表。当加载EXE文件时,操作系统不会使用这些元素。如果您启用该选项,VM将使用被fixup元素列表所包含的部分。
在指定完所有必要的选项后,开始编译工程。在编译完成后,在工程文件(例如,TEST.EXE)旁边会创建一个新文件(例如,TEST.VMP.EXE)。指定的程序将在虚拟机的该文件中运行。
该软件为付费软件,网上流传的多为试用版的破解版和公开的正式版,
如需商业加密建议购买正版
虚拟机保护特征:
将由编译器生成的本机代码(Native Code)转换成字节码(Bytecode)将控制权交由虚拟机,由虚拟机来控制执行转换后的字节码非常难以阅读,增加了破解的复杂性虚拟机其实就是一个字节码解释器,它循环的读取指令并执行,并且它只有一个入口和一个出口(vm_exit)。通过静态分析,我们可以分析出整个执行引擎的完整代码。
将所有选项全部开启后的结果如图3:
这时大量的fakejcc(虚假跳转)和垃圾指令使原来十分简单的代码变得非常复杂。
如果要对加了壳的程序做一些处理,比如设定一些规则,将虚假分支清除后,流程图就会和未加壳时一样清晰了。如果再清除掉垃圾指令,那就会更清晰了。经过处理后,新的流程图分析起来难度就会降低很多。如图4:
VMP的Handler
VMP是基于堆栈的虚拟机(Stack-based VirtualMachine),然而虚拟机指令并不显式的使用某个参数,而是先将参数压入堆栈,然后直接从堆栈中读取。例如:
表达式:
Add eax,ecx
可以翻译为:
Push ecx
Push eax
Add
Pop eax
无论push进来的是谁,Add指令总是读取并弹出堆栈中存放的值。
VMP指令分类
汇编指令在转换到虚拟机的指令体系的过程中,被最大限度的化简和归类了,VMP中的指令大体分五类:
算术运算和移位运算堆栈操作内存操作系统相关(无法模拟指令)逻辑运算逻辑运算指令
Vmp中的逻辑运算只有一条指令:nor。这个指令在电路门中叫NOR门,它由三条指令组成,即not not and,与NAND门一样,用它可以模拟not and xor or这四条逻辑运算指令。
转换公式 :
P(a,b) = ~a & ~b
not(a) = P(a,a)
and(a,b)= P(P(a,a),P(b,b))
or(a,b) = P(P(a,b),P(a,b))
xor(a,b)= P(P(P(a,a),P(b,b)),P(a,b))
寄存器轮转
VMP将所有寄存器都存放在了堆栈的结构中(VM_CONTEXT),结构中的每一项代表一个寄存器或者临时变量。但在运行过程中,其中的项所映射的真实寄存器都是不固定的,可以把它比作一个齿轮,每做完一个动作,部分项的映射就互换了一下位置,或者执行完一段指令,齿轮就按不固定的方向和度数转动一下,然后全部的项映射就改变了。VMP在生成字节码的过程中,维护了一份结构中每一项所映射的真实寄存器,但这只存在于编译过程,而在运行时是没有明确的信息的。这直接导致了分析和识别的难度。
字节码加密和随机效验
VMP把解码算法分布到了Dispatch和每个Handler中,只有在取指令和取数据时才会解密,而每个解码的算法也都是不同的,并且它的Seed每次解密都会变化的。
要写出字节码的逆算法不是不可以,但是复杂度太高,有些得不偿失。所以如果想要修改数据,还是使用HOOK的方式比较轻松。
但是HOOK的方式得解决代码检测的问题,VMP注册版除了会加密字节码以外,还会随机对一段代码做检测,如果有错将无法运行。 VMP注册版中有一条叫指令( calchash),就是用来做检测的。VMP会在编译好的字节码中加一些自己的指令,每次执行都会随机对一段代码生成一个Hash结果,然后与另一个随机的数相加,结果必须为0,否则就会出错。如果要爆破或者修改VMP的代码,还需要处理这个过程。