# VMProtect 编译系统

VMProtect 使用 **Makefile** 构建系统,支持多平台编译。
## 1. Makefile 结构
### 核心模块 Makefile
| 文件 | 用途 |
|——|——|
| `lin_core.mak` | Linux 核心通用配置 |
| `lin_core32.mak` | Linux 32位核心 |
| `lin_core64.mak` | Linux 64位核心 |
| `mac_core.mak` | macOS 核心通用配置 |
| `mac_core32.mak` | macOS 32位核心 |
| `mac_core64.mak` | macOS 64位核心 |
### GUI 模块 Makefile
| 文件 | 用途 |
|——|——|
| `lin_gui.mak` | Linux GUI 通用配置 |
| `lin_gui32.mak` | Linux 32位 GUI |
| `lin_gui64.mak` | Linux 64位 GUI |
| `mac_gui.mak` | macOS GUI 通用配置 |
| `mac_gui32.mak` | macOS 32位 GUI |
| `mac_gui64.mak` | macOS 64位 GUI |
### 控制台模块 Makefile
| 文件 | 用途 |
|——|——|
| `lin_console.mak` | Linux 控制台通用配置 |
| `lin_console32.mak` | Linux 32位控制台 |
| `lin_console64.mak` | Linux 64位控制台 |
| `mac_console.mak` | macOS 控制台通用配置 |
| `mac_console32.mak` | macOS 32位控制台 |
| `mac_console64.mak` | macOS 64位控制台 |
### 通用 Makefile
| 文件 | 用途 |
|——|——|
| `gnu_simple.mak` | 简化版 GNU Makefile |
## 2. Linux 编译配置
### lin_core32.mak 示例
“`makefile
# 编译器配置
CC = gcc
CXX = g++
# 编译选项
CFLAGS = -m32 -O2 -fPIC -DVMP_GNU
CXXFLAGS = -m32 -O2 -fPIC -std=c++11 -DVMP_GNU
# 链接选项
LDFLAGS = -m32 -shared
# 包含路径
INCLUDES = -I. -I../runtime -I../third-party
# 源文件
SOURCES = core.cc \
objects.cc \
processors.cc \
intel.cc \
pefile.cc \
elffile.cc \
macfile.cc \
dotnetfile.cc \
il.cc \
packer.cc \
script.cc \
streams.cc \
files.cc \
lang.cc \
osutils.cc \
dwarf.cc \
objc.cc \
inifile.cc
# 目标文件
OBJECTS = $(SOURCES:.cc=.o)
# 目标库
TARGET = libvmprotect_core32.so
# 编译规则
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CXX) $(LDFLAGS) -o $@ $^
%.o: %.cc
$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
clean:
rm -f $(OBJECTS) $(TARGET)
.PHONY: all clean
“`
### lin_core64.mak 差异
“`makefile
# 64位编译选项
CFLAGS = -m64 -O2 -fPIC -DVMP_GNU
CXXFLAGS = -m64 -O2 -fPIC -std=c++11 -DVMP_GNU
LDFLAGS = -m64 -shared
# 目标库
TARGET = libvmprotect_core64.so
“`
## 3. macOS 编译配置
### mac_core32.mak 示例
“`makefile
# 编译器配置
CC = clang
CXX = clang++
# SDK 路径
SDK = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
# 编译选项
CFLAGS = -arch i386 -O2 -fPIC -DVMP_GNU -DMAC
CXXFLAGS = -arch i386 -O2 -fPIC -std=c++11 -DVMP_GNU -DMAC
# 链接选项
LDFLAGS = -arch i386 -dynamiclib -Wl,-install_name,@rpath/libvmprotect_core32.dylib
# 框架
FRAMEWORKS = -framework Cocoa -framework Security
# 目标库
TARGET = libvmprotect_core32.dylib
“`
### mac_core64.mak 差异
“`makefile
# 64位编译选项
CFLAGS = -arch x86_64 -O2 -fPIC -DVMP_GNU -DMAC
CXXFLAGS = -arch x86_64 -O2 -fPIC -std=c++11 -DVMP_GNU -DMAC
LDFLAGS = -arch x86_64 -dynamiclib -Wl,-install_name,@rpath/libvmprotect_core64.dylib
# 目标库
TARGET = libvmprotect_core64.dylib
“`
## 4. GUI 编译配置
### lin_gui32.mak 示例
“`makefile
# Qt 配置
QTDIR = /usr/lib/qt5
MOC = $(QTDIR)/bin/moc
# 编译器
CXX = g++
# 编译选项
CXXFLAGS = -m32 -O2 -fPIC -std=c++11 -DVMP_GNU \
-I$(QTDIR)/include \
-I$(QTDIR)/include/QtCore \
-I$(QTDIR)/include/QtGui \
-I$(QTDIR)/include/QtWidgets
# 链接选项
LDFLAGS = -m32 -Wl,-rpath,$(QTDIR)/lib
LIBS = -L$(QTDIR)/lib \
-lQt5Core -lQt5Gui -lQt5Widgets \
-lQt5Network
# 源文件
SOURCES = main.cc \
mainwindow.cc \
models.cc \
widgets.cc \
property_editor.cc \
about_dialog.cc \
license_dialog.cc \
import_license_dialog.cc \
export_key_pair_dialog.cc \
function_dialog.cc \
templates_window.cc \
watermarks_window.cc \
help_browser.cc \
settings_dialog.cc \
progress_dialog.cc \
message_dialog.cc \
remotecontrol.cc
# MOC 生成的文件
MOC_SOURCES = moc_mainwindow.cc \
moc_models.cc \
moc_widgets.cc
# 目标
TARGET = vmprotect_gui32
# 编译规则
all: $(TARGET)
$(TARGET): $(OBJECTS) $(MOC_OBJECTS)
$(CXX) $(LDFLAGS) -o $@ $^ $(LIBS)
moc_%.cc: %.h
$(MOC) $< -o $@
clean:
rm -f $(OBJECTS) $(MOC_OBJECTS) $(MOC_SOURCES) $(TARGET)
“`
## 5. 预编译头
### precompiled.h
“`cpp
#ifndef PRECOMPILED_H
#define PRECOMPILED_H
// C 标准库
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstdint>
#include <ctime>
#include <cmath>
// C++ 标准库
#include <string>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <memory>
#include <iostream>
#include <fstream>
#include <sstream>
#include <exception>
#include <stdexcept>
// 平台相关
#ifdef _WIN32
#include <windows.h>
#include <shlobj.h>
#else
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#endif
// 项目头文件
#include “core.h”
#include “objects.h”
#include “processors.h”
#endif // PRECOMPILED_H
“`
### 使用预编译头
“`makefile
# 预编译头规则
precompiled.h.gch: precompiled.h
$(CXX) $(CXXFLAGS) -x c++-header $< -o $@
# 依赖预编译头
%.o: %.cc precompiled.h.gch
$(CXX) $(CXXFLAGS) -include precompiled.h -c $< -o $@
“`
## 6. 编译脚本
### gen_inc.bat (Windows)
生成包含文件(将二进制文件转换为 C 数组):
“`batch
@echo off
setlocal enabledelayedexpansion
set INPUT=%1
set OUTPUT=%2
if “%~1″==”” (
echo Usage: gen_inc.bat input.bin output.inc
exit /b 1
)
echo // Auto-generated file > %OUTPUT%
echo const unsigned char runtime_data[] = { >> %OUTPUT%
set COUNT=0
for /f “skip=1” %%a in (‘certutil -encodehex -f “%INPUT%” tmp.hex’) do (
set LINE=%%a
set LINE=!LINE: =, 0x!
if !COUNT! gtr 0 echo , >> %OUTPUT%
echo 0x!LINE! >> %OUTPUT%
set /a COUNT+=1
)
echo }; >> %OUTPUT%
echo const size_t runtime_data_size = sizeof(runtime_data); >> %OUTPUT%
del tmp.hex
“`
### lang.bat (Windows)
生成语言定义文件:
“`batch
@echo off
python lang.py
“`
### version.bat (Windows)
生成版本信息:
“`batch
@echo off
for /f “tokens=*” %%a in (‘git describe –tags –always’) do set VERSION=%%a
echo #define VMP_VERSION “%VERSION%” > version.h
“`
## 7. 第三方库
### LZMA SDK
位于 `code/third-party/lzma/`:
“`
lzma/
├── LzmaEnc.h
├── LzmaEnc.c
├── LzmaDec.h
├── LzmaDec.c
├── LzFind.h
├── LzFind.c
└── Types.h
“`
### Scintilla
用于脚本编辑器的语法高亮组件。
## 8. 编译流程
### 完整编译步骤
“`bash
# 1. 编译核心库 (32位)
cd code/core
make -f lin_core32.mak
# 2. 编译核心库 (64位)
make -f lin_core64.mak
# 3. 编译 GUI (32位)
cd ../VMProtect
make -f lin_gui32.mak
# 4. 编译 GUI (64位)
make -f lin_gui64.mak
# 5. 编译控制台工具 (32位)
cd ../VMProtectCon
make -f lin_console32.mak
# 6. 编译控制台工具 (64位)
make -f lin_console64.mak
“`
### 运行时文件生成
“`bash
# 将运行时 DLL 转换为 C 数组
cd code/core
./gen_inc win_runtime32.dll win_runtime32.dll.inc
./gen_inc win_runtime64.dll win_runtime64.dll.inc
./gen_inc lin_runtime32.so lin_runtime32.so.inc
./gen_inc lin_runtime64.so lin_runtime64.so.inc
./gen_inc mac_runtime32.dylib mac_runtime32.dylib.inc
./gen_inc mac_runtime64.dylib mac_runtime64.dylib.inc
“`
## 9. 输出目录结构
“`
bin/
├── 32/
│ ├── Release/
│ │ ├── VMProtect.exe # Windows GUI
│ │ ├── VMProtectCon.exe # Windows 控制台
│ │ ├── libvmprotect_core.so # Linux 核心
│ │ └── libvmprotect_core.dylib # macOS 核心
│ └── Debug/
│ └── …
└── 64/
├── Release/
│ └── …
└── Debug/
└── …
“`
## 10. 编译选项说明
### 宏定义
| 宏 | 说明 |
|—–|——|
| `VMP_GNU` | GNU 编译器环境 |
| `WIN32` / `_WIN32` | Windows 平台 |
| `MAC` | macOS 平台 |
| `LINUX` | Linux 平台 |
| `DEMO` | 演示版本 |
| `ULTIMATE` | 旗舰版本 |
| `NDEBUG` | 非调试版本 |
| `_DEBUG` | 调试版本 |
### 编译器标志
| 标志 | 说明 |
|——|——|
| `-O0` | 无优化(调试) |
| `-O2` | 标准优化 |
| `-O3` | 最大优化 |
| `-g` | 包含调试信息 |
| `-fPIC` | 位置无关代码 |
| `-m32` | 32位编译 |
| `-m64` | 64位编译 |
| `-std=c++11` | C++11 标准 |
| `-Wall` | 显示所有警告 |
| `-Werror` | 警告视为错误 |














暂无评论内容