VMP比较正确的编译教程

一、编译环境

1.1 编译整体配置

采用VS2022社区版+MSVC2017_xp+QT5.6.0+WDK7.1(编译DDK需要,不需要DDK的可以不用下载)

1.1 VS2022安装

1.1.1 除常规勾选桌面C++以外,需要勾选win xp支持和支持相应的MSVC版本。教程采用msvc2017和xp支持。

1.1.2 安装好xp支持会同步安装win7.1A SDK,不用另行安装。

1.2 Qt安装与配置

1.1.1 QT5.6.0下载 根据需求选择32位或者64位。选择5.6.0原因是VMP原项目采用的就是5.6.0,以及支持XP。高版本QT不支持XP。教程采用64位即:qt-opensource-windows-x86-msvc2015_64-5.6.0.exe

1.1.2 QT5.6.0 下载后直接默认安装,安装完毕即可,注意:不需要设置系统环境变量和安装VS QT插件。

1.3 WDK7.1安装

1.3.1 WDK7.1下载 编译DDK需要,不需要DDK的可以不用下载

1.4 VMP源码

1.4.1   vmp源码

二、编译过程

2.1 开始编译(Debug版本,动态链接QT)

2.1.1 打开VMP工程,出现提示升级和Net版本不匹配,笔者选择取消。然后手动更改MSVC版本为2017_xp。

2.1.2 首先编译Common两个工程。其中Core会报错。

错误1、编码报错:双击打开错误打开文件,然后点击:文件——高级保存选项——以"Unicode-代码页1200"保存。提示:错误指向相同的文件只需要保存一次即可,不用每个错误都操作。没有高级保存选项,在工具——自定义设置。具体百度。
warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

错误2、重载定义:根据函数声明补充定义函数的参数
error C2511: “void IntelFunction::Mutate(const CompileContext &,bool)”:“IntelFunction”中没有找到重载的成员函数
补充后的的定义:
cpp void IntelFunction::Mutate(const CompileContext &ctx, bool for_virtualization, int index)
cpp void IntelObfuscation::Compile(IntelFunction *func, size_t index, size_t end_index , bool for_virtualization)
至此Common工程编译成功。

2.1.3 编译win_runtime、VMProtectSDK、VMProtecCon三个工程。顺利编译,不再展开说明。

2.1.4 编译VMProtect

2.1.4.1 修改QT路径。

在VS属性管理器(非右键项目-属性。视图-属性管理器)展开VMPProtect-Debug|X64,右键"qt_debug64"属性-用户宏,将QT路径修改成自己安装的路径。

至此VMProtect Debug版本可顺利编译。将core目录下的VMProtectLicense.ini文件和编译好的VMProtect.exe放一起,即可显示已授权版本。(QT文件自行补充)只是玩一玩的看到这里就可以结束了。

2.1.5 编译DDK

2.1.5.1 修改WKD路径,同样在属性管理器修改Driver的WDK inlude路径为自己安装的路径。默认路径则不用修改。

2.1.5.2 MSVC选择用MSVC2017或者msvc2017XP即可顺利编译

2.1.6 .Net编译

2.1.6.1 SDK和.NetCore正常编译,不展开说明。

2.1.6.2 Runtime编译

原VMP作者采用的是.net4.0,笔者升级到4.8后报错如下:
Your project does not reference ".NETFramework,Version=v4.8" framework. Add a reference to ".NETFramework,Version=v4.8" in the "TargetFrameworks" property of your project file and then re-run NuGet restore.
解决方法:

右键.NetCore项目-属性,没错就是.NetCore。在目标框架中补充"net48;"。.Net的别名见微软说明。修改后出现新的错误:
Your project file doesn't list 'win-x64' as a "RuntimeIdentifier". You should add 'win-x64' to the "RuntimeIdentifiers" property in your project file and then re-run NuGet restore.
解决方法:
关闭VS,找到.NetCore的项目文件。路径如下:\runtime\VMProtect.Runtime。以编辑的方式打开。在属性中添加RuntimeIdentifier的定义。
<RuntimeIdentifier>win-x64</RuntimeIdentifier>

重新打开VS,Runtime编译可顺利编译成功。

2.1.7 Misc——Tests中的的UnitTestProject编译报错:

error CS0030: 无法将类型“object”转换为“System.TypedReference”
解决方法:
笔者不懂.Net,Gpt给的解决方法:把(TypedReference)args[0]改为__makeref(args[0])
重新编译即可。

2.2 编译Ultimate版本(静态链接QT)

2.2.1 VMP工程中的Ultimate版本使用的是静态编译的QT,网上没找到现成的。只能自行编译。由于QT协议问题,本文不提供静态QT文件。具体教程请自行摸索。QT源码下载]

2.2.2 静态编译QT注意事项

2.2.2.1 要支持xp:SDK需要使用win7.1A,vs2022安装后路径如下:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\,分别设置nmake环境中的bin、include、lib为win7.1A的。
2.2.2.2 config编译选项时,需要编译带opengl的QT(-opengl desktop),支持xp平台( -target xp)
2.2.2.3 编译踩到的大坑:config有增量选项时,不一定会生效,需要重新解压。
2.2.2.4 使用nmake编译大概需要15GB的硬盘空间,编译时间大概2小时。

2.2.3 静态QT编译后参照上文中2.1.4.1 修改QT路径。

2.2.4 编译VMProtect 三方库报错如下:

..\third-party\libffi\libffi64.lib”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库
解决方法:采用msvc_2017_xp编译器编译,libffi源码在github上。
替换libffi64后,至此VMProtect Ultimate静态编译成功。

三、VMP许可集成

3.1 生成自定义序列号

3.1.1 使用编译好的VMProtect打开.vmp文件,.vmp路径:\core\vmprotect.vmp。在项目-添加-许可,添加自定义的信息,然后保存即可。

3.1.2 以编辑的方式打开.vmp文件,找到复制刚才添加的序列号,新建一个文件保存。

3.1.3 删除.vmp文件的以下lua代码段

 -- 2223 - Testing Purposes and Demo watermark Customer ID
    local watermark = watermarks:itemByName("2223")
	if (watermark) then
			add_watermark:xproc(version_watermark_command:address(), watermark:value())
	else
			error("Testing Purposes and Demo watermark was not found in the database");
	end

没删在对VmpProtectCon加壳会提示函数地址占用。

    AddFunction("__scrt_common_main_seh(void)")

3.2 VMProtect加壳并集成许可

3.2.1在目录下打开命令行,使用VMProtectCon进行加壳。暂时需要带VMProtectLicense.ini。

VMProtectCon的参数如下:
VMProtect_Con File [Output File] [-pf Project File] [-sf Script File] [-lf Licensing Parameters File] [-bd Build Date (yyyy-mm-dd)] [-wm Watermark Name] [-we]
正式cmd命令如下,添加-key参数,原因:.vmp的lua对-key解析将序列号并集成到文件。
VMProtectCon.exe VMProtectCon.exe VMProtectConVmp.exe -pf vmprotect.vmp -key key.txt

3.2.2 使用加壳并许可的VMProtectCon.exe对VMProtect.exe进行加壳并集成许可

VMProtectCon.exe VMProtect.exe VMProtectVmp.exe -pf vmprotect.vmp -key key.txt

四、最终效果:带许可的静态编译的ultimate版VMProtect

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331339.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​批量文件夹随机小写字母重命名:文件夹重命名简单步骤,高效结果

在日常工作中&#xff0c;经常要对大量的文件夹重命名进行管理和查找文件。手动重命名每个文件夹不仅耗时&#xff0c;而且容易出错。现在一起来看云炫文件管理器如何给文件夹名称批量随机小写字母重命名&#xff0c;简单的步骤&#xff0c;高效率的结果。 文件夹名称随机小写…

多文件转二维码的两种方式,有兴趣的了解一下

多个文件能一键生成二维码吗&#xff1f;二维码是现在很多人用来展示文件内容的一种手段&#xff0c;在制作二维码图片之后&#xff0c;其他人扫码就可以查看文件或者下载文件&#xff0c;有效的提升文件获取的效率。一般情况下&#xff0c;文件二维码分为多个文件生成一个二维…

黑群晖利用云服务器公网IP

一、服务器端 1.使用工具 xShell&#xff1a;连接云服务器使用。 云服务&#xff1a;阿里云&#xff0c;系统采用的是Ubuntu20.02&#xff0c;预装了宝塔界面&#xff0c;设置好root密码。 2.操作 远程登录阿里云&#xff0c;安装Vim、Wget等功能&#xff1b;下载和一键安装…

LeetCode面试题02.07链表相交

力扣题目链接 思想&#xff08;数学&#xff09;&#xff1a;设链表A的长度为a&#xff0c;链表B的长度为b&#xff0c;A到交点D的距离为c&#xff0c;B到交点D的距离为d。显然可以得到两者相交链表的长度为&#xff1a;a - c b - d ,变换一下式子得到&#xff1a;a d b …

Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务

技术背景 我们在对接Unity下推送模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;开发者希望在Android的Unity场景下&#xff0c;获取到前后摄像头的数据&#xff0c;并投递到RTMP服务器&#xff0c;实现低延迟的数据采集处理。 在此之前&#xff0c;我们已经有了非常成…

密码产品推介 | 沃通安全电子签章系统(ES-1)

产品介绍 沃通安全电子签章系统&#xff08;ES-1&#xff09;是一款基于密码技术、完全自主研发的商用密码产品&#xff0c;严格遵循国家密码管理局制定的相关标准&#xff0c;可为企业和个人提供安全、合规的电子签章功能服务。产品的主要用途是为各类文书、合同、表单等电子…

Solana Mobile开启第二代Saga手机预售,怎么购买Solana Mobile?

PANews 1月17日消息&#xff0c;Solana Mobile官方宣布开启其第二代Saga手机&#xff08;Chapter 2&#xff09;的预售&#xff0c;预购押金为450美元&#xff0c;预计将于2025年上半年发货。同时&#xff0c;Chapter 2的发售将会包括推荐&#xff08;Referrals&#xff09;和积…

【Linux系列】在Pop!OS的启动器中添加自定义程序图标

文章目录 前言一、创建快捷方式二、快捷方式参数三、添加右键菜单和注册MIME 前言 无论是在Windows上&#xff0c;还是Linux&#xff0c;或者安卓这些我们常用的操作系统上&#xff0c;一些应用程序的快捷方式放在桌面或者启动器&#xff0c;只需要简单的点击就可以启动&#…

海思hi3516dv500陀螺仪防抖调试过程问题分析

主要看cat /proc/umap/motionfusion 1、陀螺仪配置&#xff0c;使用在线零偏 2、采集的陀螺仪数据 3、矫正之后的陀螺仪数据 4、效果异常的情况下确认 1、镜头视场角是否异常 2、陀螺仪方向标定是否正常&#xff0c;正常的情况下矫正之后的数据在0上下震动 3、确认在线零偏…

Python实现员工管理系统(Django页面版 ) 八

Hello 大家新年好。今天这篇博客是用来填补之前的登录系统的不足所遗留下来的坑点&#xff0c;你们知道的&#xff0c;我有坑是必补啊。 首先我留的第一个坑点不知道大家有没有注意到&#xff0c;当我们没并没有登录的时候&#xff0c;但是如果我们事先知道一些内部测试的网站路…

前端公共组件库优化

背景 前段时间入职了新公司后&#xff0c;做一些内部前端基建的工作&#xff0c;其中一个工作就是优化现有的frontend-common公共组件库。之前的组件库一直是以源码依赖的形式存在&#xff0c;即各个项目通过git submodule的方式将该仓库引入到各个项目中&#xff0c;作为一个…

Win32 字符串表达式计算

简单表达式计算实用类 支持的运算如表所示 运算符号释义例子加法1024512-减法1024-512*乘法1024*1024/除法1024/128^平方1024^2%取模(求余数)10%3(优先级左括号(1024512)*8)优先级右括号(1024512)*8 表达式示例: 表达式有效性备注2(2-7)*2*(8-2)/2有效1024^3有效1024的3次方…

头像空白问题

当用户没有设置头像时&#xff0c;我们可以使用用户名第一个字来当头像 主要涉及一个截取&#xff0c;截取字符串第一个字 变量名.charAt(0) 如果变量名为null或者undefine 那么就会报错 使用可选链操作符 &#xff1f; 当前面的值为nul或undefine时&#xff0c;就不会执行…

CSS||选择器

目录 作用 分类 基础选择器 标签选择器 ​编辑类选择器 id选择器 通配符选择器 作用 选择器&#xff08;选择符&#xff09;就是根据不同需求把不同的标签选出来这就是选择器的作用。 简单来说&#xff0c;就是选择标签用的。 选择器的使用一共分为两步&#xff1a; 1.…

代码随想录算法训练营第23天 | 669. 修剪二叉搜索树 + 108.将有序数组转换为二叉搜索树 + 538.把二叉搜索树转换为累加树

今日任务 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇 669. 修剪二叉搜索树 - Medium 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你二叉搜索树的根节点 root &#xf…

代码随想录算法训练营29期|day 22 任务以及具体安排

235. 二叉搜索树的最近公共祖先 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root null) return null;//向左遍历if(root.val > p.val && root.val > q.val){TreeNode left lowestCommonAncestor(roo…

MySQL表的基本插入查询操作详解

博学而笃志&#xff0c;切问而近思 文章目录 插入插入更新 替换查询全列查询指定列查询查询字段为表达式查询结果指定别名查询结果去重 WHERE 条件基本比较逻辑运算符使用LIKE进行模糊匹配使用IN进行多个值匹配 排序筛选分页结果更新数据删除数据截断表聚合函数COUNTSUMAVGMAXM…

C语言——atoi函数解析

目录 前言 atoi函数的介绍 atoi函数的使用 atoi函数的模拟实现 前言 对于atoi函数大家可能会有些陌生&#xff0c;不过当你选择并阅读到这里时&#xff0c;请往下阅读&#xff0c;我相信你能对atoi函数熟悉该函数的头文件为<stdlib.h> 或 <cstdlib> atoi函数的…

被遗忘在角落的RPA,成了提升AI Agent执行能力的天选神器

LLM&#xff08;Large Language Models&#xff09;刚爆发之时&#xff0c;很多人认为RPA要完了&#xff0c;自然语言交互API操作足以干掉任何UI自动化工具。 然而&#xff0c;大语言模型应用发展到AI Agent这一步&#xff0c;大家才发现API并不是万能的。Agent平台雨后春笋一…

【开源项目】经典开源项目实景三维数字孪生泰山

飞渡科技数字孪生文旅运营中心&#xff0c;基于文旅单位的运营管理、服务质量以及游客需求&#xff0c;通过数字孪生、AR/VR、大数据分析等技术&#xff0c;为景区打造虚实融合、超沉浸体验的专属虚拟数字场景&#xff0c;实现文旅领域的数据可视化、产业数字化以及智能化管理。…