VMProtect 是新一代的软件保护系统,将保护后的代码放到虚拟机中运行,这将使分析反编译后的代码和破解变得极为困难。使用 MAP 文件或内建的反编译引擎,您可以快速选择需要保护的代码。
vmprotect_VMProtect -VMProtect
与传统保护方式的比较:
传统的保护软件都有一个共同的弱点,即他们都不修改源代码。保护方式仅仅是通过“信封”原理将软件主体封装起来,然后通过一个装载器解压缩保护的软件主体,解压后的软件在内存中很容易被转储并被非法修改。破解者拥有一系列反编译工具可以破坏这种保护,网络上也有许多文章阐述如何脱壳常规的保护软件。
VMProtect 是新一代的软件保护系统,不像市场上其它常见的保护软件,VMProtect 可以修改软件产品的源代码,转换部分代码为在虚拟机上运行的字节码(bytecode)。您可以将虚拟机想象成为带有不同于Intel 8086处理器系统指令的虚拟处理器。例如,虚拟机没有比较两个操作数的指令,也没有条件跳转和无条件跳转指令等等。这样一来,破解者就需要开发一整套的解析引擎来分析和反编译字节码,以现有的解密理论,破解者想要还原出源代码几乎是不可能的。
支持的编译器:
Delphi
Borland C Builder
Visual C/C++
Visual Basic (native)
Virtual Pascal
支持的文件类型(32 位和 64 位):
EXE
DLL
BPL
OCX
SYS
支持的操作系统:
Windows 95/98
Windows ME
Windows NT
Windows 2000
Windows XP
Windows 2003
Windows Vista
vmprotect_VMProtect -VMProtect 历史更新
Version 1.81
[!] 修复在 Pentium 4 处理器执行变异后的代码可能出现错误的缺陷
[!] 修复在 Athlon 处理器执行虚拟化的代码可能出现错误的缺陷
[!] 修复反汇编和虚拟化 Borland 编译的程序结构时可能出现错误的缺陷
[!] 修复加密 64 位应用程序时可能产生错误的缺陷
[!] 修复诸多缺陷
[*] 重定义加密标记名称(仅限 Visual C)
[*] 减少加密时的内存占用
[*] HTML 资源不再被压缩
[*] 更新俄语帮助文件
[+] 向导模式新增流程列表筛选
[+] 新增高压缩率的压缩模式
[+] 新增对 TLS 回调的支持
[+] SDK 添加新的 API 函数 - VMProtectIsValidImageCRC
Version 1.8
[!] 修复保护驱动文件的输入表可能产生错误的缺陷
[!] 修复保护 DLL/SYS 文件内存时可能产生错误的缺陷
[!] 修复在 DLL/SYS 文件中使用多个 VM 标记可能产生错误的缺陷
[!] 修复带有异常句柄的代码变异时可能产生错误的缺陷
[!] 修复同时使用内存和水印保护可能产生错误的缺陷
[!] 修复其它小缺陷
[*] 改进对标记字符串参考的检测(不需要标记所有的字符串参考)
[*] 改进输入表保护
[*] 改进调试器检测
[*] 更新俄语帮助文件
[+] 项目文件可以保存为不同的名称
[+] 新增项目文件支持
[+] 新增对 Sandboxie 的检测
[+] 新增对带有 /SAFEseh属性编译文件的支持
[+] 新增对CodeGear2009 的支持
[+] 加密标记可以重命名(对于 VMProtectBegin/VMProtectBeginMutation/VMProtectBeginVirtualization/VMProtectBeginUltra 来自 VMProtectSDKxx.dll/VMProtectDDKxx.sys 文件)
[+] SDK 添加新的 API 函数(VMProtectIsDebuggerPresent 和 VMProtectIsVirtualMachinePresent)
[+] SenseLock 版本新增远程更新和授权系统
[+] SenseLock 版本新增固定密钥锁定功能
Version 1.7
[!] 具有 SHAREABLE+WRITABLE 标志的区段不会再被压缩
[!] 修复部分缺陷
[*] 改进驱动文件的输入表保护
[*] 改进驱动文件的压缩(压缩区段不再设置为 WRITABLE 标志)
[*] 改进调试器检测方式
[+] 新增“内存保护”选项(用于程序运行时保护内存不被修改)
[+] 新增“虚拟运行环境检测 (VMware/Virtual PC)”选项
[+] 脚本新增 TPEFile 类的 EntryPoint 属性
Version 1.65
[!] 修复部分缺陷
[*] 改进输入表保护
[*] 改进反调试保护
[+] 支持未闭合的加密标识 (也就是未两两配对的加密标识)
[+] 新增三种明确编译方式的加密标识:VMProtectBeginVirtualization, VMProtectBeginMutation 和 VMProtectBeginUltra
[+] 新增繁体中文语言文件
Version 1.64
[!] 修复处理 "TYPELIB", "REGISTRY" 和 "MUI" 资源时可能导致错误的缺陷
[!] 修复处理 Visual C 程序出现 R6002 错误的缺陷
[!] 修复 64 位 SYS 文件应用“输入表保护”可能导致错误的缺陷
[!] 修复更多的小缺陷
[*] 文件选项现在保存在 %APPDATA%/PolyTech/VMProtect 目录
[*] 改进输入表保护
[+] 新增“虚拟计算机”选项(不同的虚拟代码会由不同体系的虚拟计算机执行)
[+] 新增“VMware/Virtual PC 检测”选项(保护后的程序启动时如果检测到 VMware/Virtual PC 等虚拟运行环境,会弹出提示窗口并自动关闭)
[+] 新增“调试器检测”选项(保护后的程序启动时如果检测到调试器,会弹出提示窗口并自动关闭)
[+] 新增 Lazarus 环境下的加密标识实例
Version 1.63
[!] 修复“输入表保护”选项导致错误的缺陷
[!] 修复部分缺陷
[+] 脚本新增 OnBeforePackFile 事件
[+] 脚本新增 TPEFile 类的 Handle 属性
[+] 新增在Free Pascal使用加密标识的实例
[*] 改进对 VM 对象的完整性控制
Version 1.62
[!] 修复“输入表保护”选项导致错误的缺陷
[!] 修复“超级”编译模式处理 TRY/EXCEPT/END 异常语句时导致错误的缺陷(由 Delphi 和 Borland C++ Builder 编译的程序)
[*] 改进 SYS 驱动文件的输入表保护
[+] 项目中的每一个对象都可以精确选择不同的编译类型(在项目树中配置)
[+] 新增“挪动资源到文件尾”选项
[+] 增加一个使用扩展标记的实例(位于 ExamplesScriptsUseExtMarkers 目录)
Version 1.61
[!] 修复在 Windows 95/98 系统下加载压缩文件可能导致错误的缺陷
[!] 修复部分缺陷
[+] 现在简装版也可以通过命令行传递文件名称
[+] 历史记录添加到“向导模式”窗口
[+] “向导模式”窗口新增语言选择选项
[+] 新增“输入表保护”选项(推荐与“压缩输出文件”一起使用)
[+] 命令行版本新增 "-we" 参数(如果使用此参数,会显示所有的错误消息)
[+] 脚本新增 TPEResourceRecords 类
[+] 脚本新增 TPEFile 类的 ResourceRecords 属性
Version 1.6
[!] 修复部分缺陷
[*] 改进对相同字符串的处理方式(现在相同的字符串显示为一个包含多个记录的对象)
[+] 新增 压缩引擎,可以压缩输出文件
[+] 脚本新增 TPEExportRecords 类
[+] 脚本 TPEFile 类新增 ExportRecords 属性
[+] 脚本新增 OnBeforeSaveFile 事件
[+] 新增简体中文版帮助文件
[+] 载入 MAP 文件时,新增文件修改时间的检测(如果 MAP 文件的修改时间与主文件不符,该 MAP 文件将不会被载入)
Version 1.56
[!] 修复 虚拟 BT, BTC, BTR 和 BTS 时 可能导致错误的缺陷
[!] 修复部分缺陷
[*] 保护选项列表按优先级排序
[*] 对 VC8 改进 SEH 支持
[*] 改进动态创建联机命令
[*] 改进对 VM 对象的完整性控制
[+] 新增 PREFETCH 和 PREFETCHW 命令支持
[+] 新增脚本函数CompareText 和 ANSICompareText
[+] 脚本中 TPEFile 类新增属性 Size
[+] 新增在 MinGW 使用加密标识的实例
[+] 新增简体中文语言文件
[+] “新建流程”对话框新增"*" 和"?" 通配符支持
[+] 编译器消息窗口新增输出文件大小消息
Version 1.55
[!] 修复 处理未对齐映像大小的文件时 可能导致错误的缺陷
[!] 修复 确定 Delphi 程序 TRY 代码块起始位置时 可能导致错误的缺陷
[!] 修复 处理 SYS 文件 Discardable 和 NonDiscardable 节中混合代码时 可能导致错误的缺陷
[!] 修复 虚拟 64 位 DLL/SYS 文件时 可能导致错误的缺陷
[*] 恢复“离开虚拟机时加密寄存器”选项
[+] 脚本新增 TIniFile 类
[+] 脚本中 TPEFile 类新增附加属性和方法
[+] 图形界面版本新增计算地址偏移量的计算器功能
[+] 新增意大利语言文件(由 Gabriele Lanza 提供翻译)
Version 1.54
[!] 修复 变异 PUSH ESP 时 可能导致错误的缺陷
[!] 修复 虚拟 FLDCW [ESP+xxxx] 命令时 可能导致错误的缺陷
[!] 修复 混乱字节码时 可能导致错误的缺陷
[*] 改进图形界面
[+] 新增德国和西班牙语言文件
[+] 新增脚本支持
[+] 命令行版本新增指定脚本文件名称的参数
Version 1.53
[!] 修复 虚拟 DLL/SYS 文件代码时 可能导致错误的缺陷
[*] 改进代码虚拟化功能
[*] 命令行版本移除输出文件重定向到文件时的动态百分比显示
[+] 新增对 x86-64 加密标识的支持
[+] 项目新增创建文件夹功能
[+] 命令行版本新增指定项目文件名称的参数
Version 1.52
[!] 修复 变异 CMOVxx, CMPXCHG 和CMPXCHG8B命令时 可能导致错误的缺陷
[!] 修复 变异 LEA ESP, [ESP+xxxx] 命令时 可能导致错误的缺陷
[*] VM 逻辑新增 RCL 和 RCR 命令
[+] 新增对 x86-64 的支持
[+] “选项”标签新增指定输出文件名称功能
[+] 新增 英文和俄语帮助文件
Version 1.51
[!] 修复 创建 0 大小的重定位表时 可能导致错误的缺陷
[!] 修复 变异 DLL/SYS 文件中 CALL [xxxx] 命令时 可能导致错误的缺陷
[!] Delphi 实例新增阻止 VMProtectBegin 优化命令的 VMProtectBegin 声明(VMProtectBegin 的优化可以从被保护的文件运行时就阻止)
[+] 新增“编译后自动保存项目文件”选项
Version 1.5
[!] 修复 主窗口拖放文件时 可能导致错误的缺陷
[!] 修复 处理具有只读属性的文件时 可能导致错误的缺陷
[!] 修复“超级”编译模式的部分缺陷
[*] 现在保护后的文件与原文件具有相同的属性
[+] 保护流程新增对字符串的支持(字符串必须由加密标识标记)
[+] 发行版新增 Borland C++ Builder, Delphi, MASM, Visual Basic 和 Visual C++ 的加密标识实例
[+] 新增“整合右键菜单”选项
Version 1.4
[!] 修复 变异IMUL, MUL, IDIV, DIV 命令时 可能导致错误的缺陷
[!] 修复 虚拟连续的 CASE 表时 可能导致错误的缺陷
[!] 修复 虚拟 POP word/dword ptr [esp+xxxx] 和 IMUL reg8 命令时 可能导致错误的缺陷
[!] 修复 反编译 MOVNTPS 和 MOVNTPD 命令时 可能导致错误的缺陷
[+] 添加新的编译类型:“超级(变异 + 虚拟)”
[+] 添加/编辑流程 对话框新增“编译类型”选项
[+] 新增 搜索水印 功能(用于在保护后的文件中搜索水印)
[*] 改进对 ASM 编译器兼容性的支持 (TASM, MASM, etc.)
Version 1.3
[!] 修复 模拟fildword ptr [xxxx] 命令时 可能导致错误的缺陷
[+] 现在可以对每个流程指定编译类型(变异 或 虚拟)
Version 1.25
[+] 新增对 VC7-8 SEH 支持
[+] 新增对 Visual Basic 加密标识的支持(加密区间的 开始/结束 分别用 Call VarPtr("VMProtect begin") 和 Call VarPtr("VMProtect end") 标记)
[*] 注册版的 VM 解析引擎已经完全改变(可以有效防止PEID, RDGpackerDetector 之类的探壳工具查明保护方式)
Version 1.24
[+] 新增水印功能
[*] 现在 VM 解析引擎完全支持多线程应用程序(您完全不必再为解析引擎的内存定位烦恼)
[-] 移除 解析引擎内存定位 功能
Version 1.23
[!] 改进部分功能
[+] 新增向导模式
[+] 流程树新增参考
[*] 选项“隐藏常量”,“动态创建联机命令”,“跳转时加密寄存器”,“检查虚拟机对象的完整性”仅注册用户可以使用
Version 1.22.2
[!] 修复 当“解析引擎内存定位”选项激活时编译项目文件 可能导致错误的缺陷
Version 1.22
[!] 修复部分缺陷
[+]新增字节码完整性检查(需要激活“检查虚拟机对象的完整性”选项)
Version 1.21
[!] 修复 如果 EAX 和edX寄存器有操作数时模拟 CMPXCHG8b 可能导致错误的缺陷
[+] 解析引擎只包含那些参与执行字节码的命令
[-] 从 VM 逻辑中移除部分命令(它们的存在使分析和汇编字节码变得很麻烦)
Version 1.2
[!] 修复 移动 Bound Import 时 可能导致错误的缺陷
[+] 新增加密标识功能(加密区间的 开始/结束 分别用 "db $EB,,'VMProtect begin',0" 和 "db $EB,E,'VMProtect end',0" 标记)
[+] 项目文件新增对导出函数的支持
[-] 移除“加密字节码”选项(现在字节码永远都处于加密状态)
Version 1.1
[!] 修复 模拟SBB(部分标志位不正确),模拟 CMOVxx, CMPXCHG 和 CMPXCHG8b (在某些情况下 ESP 寄存器存储地址或 DWORD 值作为第二个变量)时 可能导致错误的缺陷
[+] 新增对 VB6 SEH 的支持 (native)
[+] 新增对 IDA 创建的 MAP 文件的支持
[+] 新增批量添加流程的功能
[+] 流程列表新增命令参考
[+] 新增“跳转时加密寄存器”选项
Version 1.09
[*] 改进对循环流程结尾检测的处理方式
[+] 改进对 UPX 的兼容性,清除可写区段的共享标志(当旧的重定位表需要被虚拟机使用时)
Version 1.08
[*] 增强反编译大段代码的速度
[*] 改进字节码解析引擎变形机制
Version 1.07
[!] 修复 处理 PE 文件(代码段虚拟大小为 0);混乱 FPU 命令(导致不正确结果的错误);反编译(cwdE 命令被认为是 CWD 命令);模拟ROL和ROR命令(如果参数是 1 字节)时 可能导致错误的缺陷
[+] 新增对组命令 SSE2 的支持
Version 1.06
[!] 修复 模拟 SUB, CMP, DEC, NEG, CMPXCHG, SCAS 和cmps命令后导致错误的 A 标志位状态的缺陷
[!] 修复 处理非对齐的文件时 可能导致错误的缺陷
[+] 新增对BSF, BSR 和 CMPXCHG8b 指令的支持
[+] 新增 指定多线程应用程序 VM 解析引擎的内存定位 功能(内存定位流程必须定义为 fastcall)
Version 1.05
[+] 新增对 FUCOMPP 和 FCMOVxx 指令的支持
[+] 结构代码查看新增字符串类型 (ANSI/Unicode/Pascal) 和注释
[+] 新增字节码解析引擎变形处理
[+] 添加新的编译选项:“加密字节码”和“移除可配置元素(仅支持 EXE 文件)”
[-] 移除“混乱字节码”选项(现在字节码总是处于混乱状态)
Version 1.04
[!] 修复 检测 C++ SEH 句柄时 可能导致错误的缺陷
[*] 改进字节码混乱功能
[+] 查看代码时,新增可配置元素的高亮显示
Version 1.03
[+] 新增使用原文件的“自由空间”存储字节码
[+] 新增对 Pascal 格式短字符串的识别(首字节为字符串长度)
Version 1.02
[!] 修复 执行 DLL/SYS 文件联机命令时 可能导致错误的缺陷
[*] 改进计算字节码校验和算法
[+] 新增“检查 VM 解析引擎完整性”选项(当调试器使用 INT 03 中断来调试解析引擎时,此选项可以用作反调试器)
[+] 使用旧的可配置元素来存储字节码
Version 1.01
[!] 修复 创建带有可配置元素的文件时 可能导致错误的缺陷(错误通常是在 Windows 95/98/Me 下运行 DLL/SYS 文件时发生)
[!] 修复反编译器部分缺陷
[+] 新增对 F2XM1,fabs, FCLEX,FCOS, FDECSTP, FINCSTP, FINIT, FLDCW, FLDLN2, FLDLG2, FPREM, FREM1, FPTAN, FRNDINT, FSIN, FSTCW, FTST, FYL2X, FPATAN, FLDZ, FISTP 指令的支持
[+] 新增对 Borland C Builder 创建的 MAP 文件的支持
[+] 新增多语言支持(俄语和英文)
Version 1.0
[!] 修复图形界面的一些缺陷
[+] 新增对 CMOV 和 CMPXCHG 指令的支持
Version 0.97
[!] 修复图形界面的一些缺陷
[+] 新增对 Virtual Pascal 的支持
Version 0.96
[!] 修复编译器的一些缺陷(编译 NEG 和 SBB 指令时 C 标志的错误;修正 POPF 处理方式;处理外部条件跳转时检查字节码 CRC 校验的错误)
[!] 修复 VM 解析引擎中字节码混乱功能的缺陷
[+] 改进对 C/C++ 创建的 MAP 文件的处理方式
Version 0.94
[!] 修复大量缺陷