vmp完整源码分析-4运行时模块详解

# VMProtect 运行时模块详解

20260402111256268-image

 

运行时模块位于 `code/runtime/`,负责在被保护程序运行时执行各种保护功能。

## 1. 公共定义 (common.h)

### 导入导出宏

“`cpp
#ifdef VMP_GNU
#define VMP_IMPORT
#else
#define VMP_IMPORT __declspec(dllimport)
// 自动链接库文件
#ifdef _WIN64
#pragma comment(lib, “../bin/64/Release/VMProtectSDK64.lib”)
#else
#pragma comment(lib, “../bin/32/Release/VMProtectSDK32.lib”)
#endif
#endif
“`

### 消息类型枚举

“`cpp
enum {
MESSAGE_DEBUGGER_FOUND, // 发现调试器
MESSAGE_VIRTUAL_MACHINE_FOUND, // 发现虚拟机
MESSAGE_FILE_CORRUPTED, // 文件已损坏
MESSAGE_SERIAL_NUMBER_REQUIRED, // 需要序列号
MESSAGE_HWID_MISMATCHED, // 硬件ID不匹配
MESSAGE_COUNT
};
“`

### 默认消息字符串

“`cpp
#define MESSAGE_DEBUGGER_FOUND_STR
VMP_STR(“A debugger has been found running in your system.\nPlease, unload it from memory and restart your program.”)
#define MESSAGE_VIRTUAL_MACHINE_FOUND_STR
VMP_STR(“Sorry, this application cannot run under a Virtual Machine.”)
#define MESSAGE_FILE_CORRUPTED_STR
VMP_STR(“File corrupted! This program has been manipulated and maybe\nit’s infected by a Virus or cracked. This file won’t work anymore.”)
#define MESSAGE_SERIAL_NUMBER_REQUIRED_STR
VMP_STR(“This code requires valid serial number to run.\nProgram will be terminated.”)
#define MESSAGE_HWID_MISMATCHED_STR
VMP_STR(“This application cannot be executed on this computer.”)
“`

### 运行时变量

“`cpp
enum {
VAR_IS_PATCH_DETECTED,
VAR_IS_DEBUGGER_DETECTED,
VAR_LOADER_CRC_INFO,
VAR_LOADER_CRC_INFO_SIZE,
VAR_LOADER_CRC_INFO_HASH,
VAR_SESSION_KEY,
VAR_DRIVER_UNLOAD,
VAR_CRC_IMAGE_SIZE,
VAR_LOADER_STATUS,
VAR_SERVER_DATE,
VAR_OS_BUILD_NUMBER,
VAR_CPU_COUNT,
VAR_CPU_HASH,
VAR_COUNT = VAR_CPU_HASH + 32
};
“`

### FACE 标记

用于标记各种运行时数据结构:

“`cpp
enum {
FACE_MASK = 0xFACE0000U,

FACE_RC5_P,
FACE_RC5_Q,
FACE_STRING_INFO,
FACE_RESOURCE_INFO,
FACE_STORAGE_INFO,
FACE_REGISTRY_INFO,
FACE_LICENSE_INFO,
FACE_LICENSE_INFO_SIZE,
FACE_KEY_INFO,
FACE_RUNTIME_ENTRY,
FACE_CRC_INFO_SALT,
FACE_CORE_OPTIONS,
FACE_IMAGE_BASE,
FACE_FILE_BASE,

// Windows API 函数名
FACE_NTOSKRNL_NAME,
FACE_HAL_NAME,
FACE_USER32_NAME,
FACE_MESSAGE_BOX_NAME,
FACE_KERNEL32_NAME,
FACE_CREATE_FILE_NAME,
FACE_CLOSE_HANDLE_NAME,

// 调试器/虚拟机检测
FACE_DEBUGGER_FOUND,
FACE_VIRTUAL_MACHINE_FOUND,
FACE_UNREGISTERED_VERSION,

// 压缩信息
FACE_PACKER_INFO = 0xFACE0100U,
FACE_PACKER_INFO_SIZE,
FACE_FILE_CRC_INFO,
};
“`

## 2. 核心运行时 (core.h)

运行时核心负责:
– 初始化保护环境
– 管理虚拟化执行
– 处理各种保护事件
– 与加载器通信

## 3. 许可证管理 (licensing_manager.h)

### 功能

– 序列号验证
– 许可证信息解析
– 过期检查
– 硬件绑定验证

### 许可证数据结构

“`cpp
struct LicenseInfo {
uint32_t Flags;
std::string CustomerName;
std::string CustomerEmail;
LicenseDate ExpireDate;
std::string HWID;
uint8_t RunningTimeLimit;
LicenseDate MaxBuildDate;
std::string UserData;
};
“`

### 许可证标志

“`cpp
enum LicenseFlag {
lfHasExpirationDate = 0x0001, // 有过期日期
lfHasMaxBuildDate = 0x0002, // 有最大构建日期
lfHasRunningTimeLimit = 0x0004, // 有运行时间限制
lfHasHWID = 0x0008, // 绑定硬件ID
lfHasUserData = 0x0010, // 有用户数据
};
“`

## 4. 硬件ID管理 (hwid.h)

### 功能

– 收集系统硬件信息
– 生成唯一硬件指纹
– 验证硬件绑定

### 收集的硬件信息

– CPU 信息
– 硬盘序列号
– 网卡 MAC 地址
– 主板信息
– BIOS 信息

## 5. 加密模块 (crypto.h)

### 支持的算法

– **RC5** – 对称加密
– **RSA** – 非对称加密
– **SHA** – 哈希算法
– **CRC** – 循环冗余校验

### 用途

– 字符串加密
– 资源加密
– 代码完整性校验
– 许可证签名验证

## 6. 文件管理 (file_manager.h)

### 功能

– 虚拟文件系统
– 文件加密存储
– 运行时文件访问

### 虚拟文件

允许将文件嵌入到受保护程序中,运行时按需解密访问。

## 7. 字符串管理 (string_manager.h)

### 功能

– 字符串加密存储
– 运行时解密
– 防止静态分析

### 加密方式

字符串在编译时加密,运行时通过密钥动态解密,防止在二进制文件中直接看到敏感字符串。

## 8. API Hook 管理 (hook_manager.h)

### 功能

– 拦截系统 API 调用
– 实现导入表保护
– 动态 API 解析

### Hook 类型

– IAT Hook – 导入地址表钩子
– Inline Hook – 内联钩子
– SSDT Hook – 系统服务描述表钩子(内核模式)

## 9. 资源管理 (resource_manager.h)

### 功能

– 资源加密
– 运行时资源解密
– 防止资源被提取

## 10. 注册表管理 (registry_manager.h)

### 功能

– 注册表操作加密
– 防止注册表监控
– 安全存储配置信息

## 运行时保护流程

“`
程序启动

加载器执行

初始化运行时环境

执行各种检测
├── 调试器检测
├── 虚拟机检测
└── 完整性校验

验证许可证(如果需要)

解密受保护代码

进入虚拟化执行

程序正常运行
“`

## 反调试技术

### 1. 调试器检测方法

– `IsDebuggerPresent()` API 检测
– `CheckRemoteDebuggerPresent()` 检测
– 手动检查 PEB.BeingDebugged 标志
– 检查 `NtGlobalFlag`
– 调试寄存器检测
– 时间差检测
– 异常处理检测

### 2. 虚拟机检测方法

– CPUID 检测虚拟机特征
– 检查特定虚拟机进程
– 检查虚拟机特定文件
– 检查虚拟机注册表项
– 检查 MAC 地址前缀

### 3. 完整性保护

– 运行时 CRC 校验
– 代码段哈希校验
– 内存保护(防止内存修改)

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容