# VMProtect 文件格式支持

VMProtect 支持多种可执行文件格式,位于 `code/core/` 目录下。
## 1. PE 文件格式 (Windows)
### 相关文件
– `pe.h` – PE 格式结构定义
– `pefile.cc` / `pefile.h` – PE 文件操作
### PE 结构定义
“`cpp
// DOS 头
#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
// …
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER;
// NT 头
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER;
// 数据目录
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY;
“`
### 文件特征标志
“`cpp
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
#define IMAGE_FILE_32BIT_MACHINE 0x0100
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
#define IMAGE_FILE_SYSTEM 0x1000
#define IMAGE_FILE_DLL 0x2000
“`
### 支持的 PE 类型
– **EXE** – 可执行文件
– **DLL** – 动态链接库
– **SYS** – 驱动程序
### 支持的平台
– Windows x86 (32位)
– Windows x64 (64位)
## 2. ELF 文件格式 (Linux)
### 相关文件
– `elf.h` – ELF 格式结构定义
– `elffile.cc` / `elffile.h` – ELF 文件操作
### ELF 结构定义
“`cpp
// ELF 魔数
#define ELFMAG0 0x7f
#define ELFMAG1 ‘E’
#define ELFMAG2 ‘L’
#define ELFMAG3 ‘F’
// ELF 头
typedef struct {
unsigned char e_ident[EI_NIDENT]; // 魔数和文件信息
Elf32_Half e_type; // 文件类型
Elf32_Half e_machine; // 目标架构
Elf32_Word e_version; // 文件版本
Elf32_Addr e_entry; // 入口点地址
Elf32_Off e_phoff; // 程序头表偏移
Elf32_Off e_shoff; // 节头表偏移
Elf32_Word e_flags; // 处理器特定标志
Elf32_Half e_ehsize; // ELF 头大小
Elf32_Half e_phentsize; // 程序头表项大小
Elf32_Half e_phnum; // 程序头表项数量
Elf32_Half e_shentsize; // 节头表项大小
Elf32_Half e_shnum; // 节头表项数量
Elf32_Half e_shstrndx; // 节名字符串表索引
} Elf32_Ehdr;
“`
### 文件类型
“`cpp
#define ET_NONE 0 // 无类型
#define ET_REL 1 // 可重定位文件
#define ET_EXEC 2 // 可执行文件
#define ET_DYN 3 // 共享对象
#define ET_CORE 4 // 核心转储
“`
### 机器类型
“`cpp
#define EM_386 3 // Intel 80386
#define EM_X86_64 62 // AMD x86-64
“`
### 支持的 ELF 类型
– **可执行文件** – ET_EXEC
– **共享库** – ET_DYN
### 支持的平台
– Linux x86 (32位)
– Linux x64 (64位)
## 3. Mach-O 文件格式 (macOS)
### 相关文件
– `mach-o.h` – Mach-O 格式结构定义
– `macfile.cc` / `macfile.h` – Mach-O 文件操作
### Mach-O 魔数
“`cpp
#define MH_MAGIC 0xfeedface // 32位
#define MH_MAGIC_64 0xfeedfacf // 64位
#define MH_CIGAM 0xcefaedfe // 32位交换字节序
#define MH_CIGAM_64 0xcffaedfe // 64位交换字节序
“`
### Mach-O 头
“`cpp
struct mach_header {
uint32_t magic; // 魔数
cpu_type_t cputype; // CPU 类型
cpu_subtype_t cpusubtype; // CPU 子类型
uint32_t filetype; // 文件类型
uint32_t ncmds; // 加载命令数量
uint32_t sizeofcmds; // 加载命令总大小
uint32_t flags; // 标志
};
struct mach_header_64 {
uint32_t magic;
cpu_type_t cputype;
cpu_subtype_t cpusubtype;
uint32_t filetype;
uint32_t ncmds;
uint32_t sizeofcmds;
uint32_t flags;
uint32_t reserved; // 64位特有
};
“`
### CPU 类型
“`cpp
#define CPU_TYPE_X86 ((cpu_type_t) 7)
#define CPU_TYPE_X86_64 ((cpu_type_t) CPU_TYPE_X86 | CPU_ARCH_ABI64)
#define CPU_TYPE_ARM ((cpu_type_t) 12)
#define CPU_TYPE_ARM64 ((cpu_type_t) CPU_TYPE_ARM | CPU_ARCH_ABI64)
“`
### 文件类型
“`cpp
#define MH_OBJECT 0x1 // 目标文件
#define MH_EXECUTE 0x2 // 可执行文件
#define MH_FVMLIB 0x3 // 固定 VM 共享库
#define MH_CORE 0x4 // 核心文件
#define MH_PRELOAD 0x5 // 预加载可执行文件
#define MH_DYLIB 0x6 // 动态共享库
#define MH_DYLINKER 0x7 // 动态链接编辑器
#define MH_BUNDLE 0x8 // 插件 bundle
“`
### 支持的 Mach-O 类型
– **可执行文件** – MH_EXECUTE
– **动态库** – MH_DYLIB
– **Bundle** – MH_BUNDLE
### 支持的平台
– macOS x86 (32位)
– macOS x64 (64位)
## 4. .NET 程序集支持
### 相关文件
– `dotnet.h` – .NET 结构定义
– `dotnetfile.cc` / `dotnetfile.h` – .NET 文件操作
– `il.h` / `il.cc` – IL 字节码处理
### 支持的 .NET 版本
– .NET Framework 2.0
– .NET Framework 4.0
– .NET Core
– .NET Standard
### 运行时文件
“`
dotnet20_runtime32.dll
/dotnet20_runtime64.dll
dotnet40_runtime32.dll
dotnet40_runtime64.dll
netcore_runtime32.dll
netcore_runtime64.dll
netstandard_runtime32.dll
netstandard_runtime64.dll
“`
### 保护方式
– IL 代码虚拟化
– 方法加密
– 字符串加密
– 元数据保护
## 5. 文件格式处理流程
### 加载流程
“`
1. 检测文件格式(魔数检查)
↓
2. 解析文件头
↓
3. 解析节/段信息
↓
4. 解析导入/导出表
↓
5. 解析重定位信息
↓
6. 加载完成
“`
### 保护流程
“`
1. 分析目标函数
↓
2. 转换为虚拟指令
↓
3. 生成保护代码
↓
4. 更新文件结构
├── 添加新节/段
├── 修改入口点
├── 更新导入表
└── 添加运行时
↓
5. 压缩/加密
↓
6. 保存文件
“`
## 6. 通用文件操作接口
### IArchitecture 接口
所有文件格式都实现了统一的架构接口:
“`cpp
class IArchitecture
{
public:
// 文件信息
virtual uint64_t entry_point() = 0;
virtual uint64_t image_base() = 0;
virtual size_t image_size() = 0;
// 节/段操作
virtual ISection *section(size_t index) = 0;
virtual size_t section_count() = 0;
virtual ISection *AddSection(const char *name) = 0;
// 导入/导出
virtual IImportList *import_list() = 0;
virtual IExportList *export_list() = 0;
// 重定位
virtual IRelocationList *relocation_list() = 0;
// 资源
virtual IResourceList *resource_list() = 0;
// 保存
virtual bool Save(const char *filename) = 0;
};
“`
## 7. 文件格式对比
| 特性 | PE | ELF | Mach-O |
|——|—–|—–|——–|
| 魔数 | MZ / PE00 | 0x7f ELF | 0xfeedface |
| 头结构 | DOS头 + NT头 | ELF头 | Mach头 |
| 数据组织 | 节 (Section) | 节 (Section) | 段 (Segment) |
| 导入表 | Import Directory | PLT/GOT | 动态加载命令 |
| 导出表 | Export Directory | 动态符号表 | 动态加载命令 |
| 重定位 | Relocation Directory | 重定位节 | 重定位命令 |
| 资源 | Resource Directory | – | – |
## 8. 跨平台支持
VMProtect 通过抽象层实现对不同文件格式的统一处理:
– 统一的指令分析接口
– 统一的虚拟化代码生成
– 统一的运行时集成
– 格式特定的文件操作














暂无评论内容