请输入您要查询的百科知识:

 

词条 VMProtect
释义

VMProtect 是新一代的软件保护系统,将保护后的代码放到虚拟机中运行,这将使分析反编译后的代码和破解变得极为困难。使用 MAP 文件或内建的反编译引擎,您可以快速选择需要保护的代码。

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使用虚拟一个不同于x86的CPU来执行转化后的程序,这个CPU只支持简单运算以及最简单的无条件跳转指令,因此为了实现x86一条指令同样的功能,Vmp的CPU需要执行多条指令。这样令代码的阅读者需要阅读大量的代码才能知道其中的程序逻辑。

转化成Vmp Cpu 指令数据(bytecode)使用了简单的数据加密,阅读者不解密是无法了解bytecode的指令意义

VMP的 CPU 解释模拟程序,有用代码只有大概500条x86指令,但是使用了大量的垃圾指令,将其解释程序塞满了2000多条x86指令,同时将程序的正常逻辑打乱,不借助代码优化工具,人类的眼睛看起来会非常的费力。

Vmp cpu 为Stack based 的RISC CPU, 内部嵌入 64byte 的暂存器

Vmprotect cpu 的指令集

Vmprotect cpu 指令集分为以下几类, 其中.x 是表示会区分操作码的位宽(byte, word, dword), pushi.x 是为了传输立即数

1) 数据传输指令 pushi.x, push.x, pop.x load.x, store.x

2) 栈指针操作 pushsp.x, popsp.x

3) 运算指令 vm_has, add.x, nor.x, mul.x, div.x, shl.x shr.x, shld, shrd

4) 分支指令 branch, branch_machine

5) 系统指令, rdtsc, cpuid, vm_exit, callapi,

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 属性编译文件的支持

[+] 新增对 CodeGear 2009 的支持

[+] 加密标记可以重命名(对于 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 驱动文件的输入表保护

[+] 项目中的每一个对象都可以精确选择不同的编译类型(在项目树中配置)

[+] 新增“挪动资源到文件尾”选项

[+] 增加一个使用扩展标记的实例(位于 Examples\\Scripts\\UseExtMarkers 目录)

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

[!] 修复 模拟 FILD word ptr [xxxx] 命令时 可能导致错误的缺陷

[+] 现在可以对每个流程指定编译类型(变异 或 虚拟)

Version 1.25

[+] 新增对 VC7-8 SEH 支持

[+] 新增对 Visual Basic 加密标识的支持(加密区间的 开始/结束 分别用 Call VarPtr("VMProtect begin") 和 Call VarPtr("VMProtect end") 标记)

[*] 注册版的 VM 解析引擎已经完全改变(可以有效防止 PEiD, RDG Packer Detector 之类的探壳工具查明保护方式)

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

[!] 修复大量缺陷

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/11/16 16:24:58