很多年没有来论坛了,最近刚好有点时间,编译了VMP,发现对于初学者还是可能会有一点帮助的,记录下编译过程。
VMP源码泄露了一段时间了,吾爱破解论坛上发表了《VMProtect编译成功过程梳理》文章,过程较为繁琐,我利用最近时间仔细学习了一遍,很快编译成功了,然后自己重新完整尝试没有博文指导下,记录编译过程,发现原来文章其实有些步骤是多余的。
1、查看工程文件
利用记事本打开vmprotect.sln可以看到:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.2092
MinimumVisualStudioVersion = 10.0.40219.1
原来的工程是VS2015编译的。
利用记事本打开VMProtectSDK.vcxproj,可以看到以下信息:
<PropertyGroup Label="Globals">
<ProjectGuid>{F3B5035B-34E5-4A8A-9B2B-485C3C79B67A}</ProjectGuid>
<RootNamespace>VMProtectSDK</RootNamespace>
<Keyword>Win32Proj</Keyword>
<ProjectName>VMProtectSDK</ProjectName>
<WindowsTargetPlatformVersion>7.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v90</PlatformToolset>
</PropertyGroup>
7.0指用于构建项目的 Windows SDK 的版本号,实际上是支持winxp的sdk,V90对应着VS2008的编译器和相关C++库。
2、开发环境
根据上面,我电脑配置了开发环境为:VS2022 +QT5.7+Windows SDK10.0+.net4.8
3、编译过程
利用VS2022打开项目文件,自动检查解决方案不匹配的地方,显示如下对话框,允许项目升级(不考虑支持XP系统,之前在安装VS2022是选择安装vs2017 xp支持组件v141_XP),点击确定。

升级完成后,设置工程为X64,直接在VMProtectSDK工程上右键“生成”,很快显示成功。
1> 正在创建库 E:\vmp3\vmp\bin\64\Debug\VMProtectSDK64.lib 和对象 E:\vmp3\vmp\bin\64\Debug\VMProtectSDK64.exp
1>VMProtectSDK.vcxproj -> E:\vmp3\vmp\bin\64\Debug\VMProtectSDK64.dll
========== 生成: 1 成功,0 失败,0 最新,0 已跳过 ==========
========== 生成 于 下午 3:03 完成,耗时 04.115 秒 ==========
在VMProtect工程上右键“生成”,报错106个,找到第一错误
严重性 |
代码 |
说明 |
项目 |
文件 |
行 |
禁止显示状态 |
详细信息 |
错误 |
C2511 |
“void IntelFunction::Mutate(const CompileContext &,bool)”:“IntelFunction”中没有找到重载的成员函数 |
core |
e:\vmp3\vmp\core\intel.cc |
16040 |
|
|
找到该函数声明:
void Mutate(const CompileContext &ctx, bool for_virtualization, int index = 0);
原因是声明中使用默认构造参数,定义中直接缺少了构造参数。
intel.cc将其修改为:
void IntelFunction::Mutate(const CompileContext& ctx, bool for_virtualization, int index )
重新编译,报错38个,找到第一个错误
严重性 |
代码 |
说明 |
项目 |
文件 |
行 |
禁止显示状态 |
详细信息 |
错误 |
C2511 |
“void IntelObfuscation::Compile(IntelFunction *,size_t)”:“IntelObfuscation”中没有找到重载的成员函数 |
core |
e:\vmp3\vmp\core\intel.cc |
17335 |
|
|
同样的原因,intel.cc将其修改为:
void IntelObfuscation::Compile(IntelFunction* func, size_t index, size_t end_index, bool for_virtualization)
重新编译,报错1个
res.bat: QT resources 'E:\vmp3\vmp\VMProtect\resources.cc' are up to date
直接在命令行中运行res.bat发现:
E:\vmp3\vmp\VMProtect>D:\DATA\Qt1\5.7\msvc2015_64/msvc2015_64/bin/rcc.exe E:\vmp3\vmp\VMProtect\application.qrc -o E:\vmp3\vmp\VMProtect\resources.cc.tmp
系统找不到指定的路径。
检查系统变量:

实际上是设置的与作者系统变量不一致导致的,修改res.bat中的语句如下:
%QTDIR%/bin/rcc.exe %RC_DIR%application.qrc -o %rc_out%
重新编译,报错53个,找到第一个错误:
严重性 |
代码 |
说明 |
项目 |
文件 |
行 |
禁止显示状态 |
详细信息 |
错误(活动) |
E1696 |
无法打开 源 文件 "QtCore/QMap" |
VMProtect |
E:\vmp3\vmp\VMProtect\precompiled.h |
5 |
|
|
说明程序编译QT时没有找到QT的正确路径,右键VMProtect属性,修改VC++目录的包含目录和库目录如下

编译成功。
1>VMProtect.vcxproj -> E:\vmp3\vmp\bin\64\Debug\VMProtect.exe
然后windeployqt VMProtect.exe完成qt程序的打包,即可以运行程序。