VMProtectSDK使用教程
//开始保护处标记(对应于功能设置:反调试、内存保护等等)
VMProtectBegin(const char *);
//开始虚拟化代码处标记(包括保护设置)
VMProtectBeginVirtualization(const char *);
//开始变异代码处标记(包括保护设置)
VMProtectBeginMutation(const char *);
//开始虚拟+代码变异标记处
VMProtectBeginUltra(const char *);
VMProtectBeginVirtualizationLockByKey(const char *);
VMProtectBeginUltraLockByKey(const char *);
//保护结束处标记
VMProtectEnd(void);
//检测调试
BOOL VMProtectIsDebuggerPresent(BOOL);
//检测虚拟机
BOOL VMProtectIsVirtualMachinePresent(void);
//映像文件CRC校验
BOOL VMProtectIsValidImageCRC(void);
//解密被保护的名为字符串A
char * VMProtectDecryptStringA(const char *value);
//解密被保护的名为字符串W
wchar_t * VMProtectDecryptStringW(const wchar_t *value);
二. 使用方法
1. 保护函数必须有始有终出现
VMProtectBegin、
VMProtectBeginVirtualization、
VMProtectBeginMutation、
VMProtectBeginUltra
必须有相对应的VMProtectEnd结束。
比如:
void FunName()
{
VMProtectBegin(“FunName”); //最好用函数名,否则会出现重名冲突
.....
VMProtectEnd();
}
2. 保护的单元是函数,而不是整个EXE代码
比如:
//不保护
void fun1(char* msg)
{
char* szmsg = "fun1 none vm";
OutputDebugString( szmsg );
}
//虚拟化保护
int fun2( int x, int y )
{
int n = x + y;
VMProtectBeginVirtualization("fun2");
OutputDebugString( "x+y= %d" );
VMProtectEnd();
return n;
}
//虚拟化和变异保护
void fun3()
{
VMProtectBeginUltra("fun3");
fun1("fun3 call fun1");
VMProtectEnd();
fun2( 2, 4 );
}
3. 保护嵌套情况
void main()
{
char* szMsg = "proxxb vm sapmle!"; //不被保护
VMProtectBegin("main"); //被保护
OutputDebugString( "vm protect test." ); //被保护
fun1(szMsg); //函数内部自己去保护
fun2( 2, 4 ); //函数内部自己去保护
fun1(szMsg); //函数内部自己去保护
fun3(); //不被保护
VMProtectEnd();
getchar(); //不被保护
}
4. 字符串保护
应使用VMProtectDecryptStringA或VMProtectDecryptStringW函数保护名为字符串,被保护后,明晚字符串不再出现在内存,除非被解密的那一刻!
char* Decrypt( char* key, char* buffer, long length )
{
VMProtectBeginUltra("Decrypt");
....
VMProtectEnd();
}
调用方法:
Decrypt(
VMProtectDecryptStringA(“DecryptKey”), //此时密文密钥被解密
buffer,
512
);
本文内容转载自:https://blog.csdn.net/loooooooi1/article/details/50133675
VMProtectSDK使用教程相关推荐
- 将VMProtect集成到应用程序教程之实模式(一):创建新的受保护的应用程序
在实模式下,VMProtect许可系统向受保护的应用程序放置一个特殊的许可模块.该模块执行与SDK中的测试功能相同的功能,但是使用序列号的内容而不是配置ini文件.本系列教程的五个步骤说明了使用基于V ...
- 使用Docker搭建svn服务器教程
使用Docker搭建svn服务器教程 svn简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很 ...
- mysql修改校对集_MySQL 教程之校对集问题
本篇文章主要给大家介绍mysql中的校对集问题,希望对需要的朋友有所帮助! 推荐参考教程:<mysql教程> 校对集问题 校对集,其实就是数据的比较方式. 校对集,共有三种,分别为:_bi ...
- mysql备份psb文件怎么打开_Navicat for MySQL 数据备份教程
原标题:Navicat for MySQL 数据备份教程 一个安全和可靠的服务器与定期运行备份有密切的关系,因为错误有可能随时发生,由攻击.硬件故障.人为错误.电力中断等都会照成数据丢失.备份功能为防 ...
- php rabbmq教程_RabbitMQ+PHP 教程一(Hello World)
介绍 RabbitMQ是一个消息代理器:它接受和转发消息.你可以把它当作一个邮局:当你把邮件放在信箱里时,你可以肯定邮差先生最终会把邮件送到你的收件人那里.在这个比喻中,RabbitMQ就是这里的邮箱 ...
- 【置顶】利用 NLP 技术做简单数据可视化分析教程(实战)
置顶 本人决定将过去一段时间在公司以及日常生活中关于自然语言处理的相关技术积累,将在gitbook做一个简单分享,内容应该会很丰富,希望对你有所帮助,欢迎大家支持. 内容介绍如下 你是否曾经在租房时因 ...
- Google Colab 免费GPU服务器使用教程 挂载云端硬盘
一.前言 二.Google Colab特征 三.开始使用 3.1在谷歌云盘上创建文件夹 3.2创建Colaboratory 3.3创建完成 四.设置GPU运行 五.运行.py文件 5.1安装必要库 5 ...
- 理解和实现分布式TensorFlow集群完整教程
手把手教你搭建分布式集群,进入生产环境的TensorFlow 分布式TensorFlow简介 前一篇<分布式TensorFlow集群local server使用详解>我们介绍了分布式Ten ...
- 高级教程: 作出动态决策和 Bi-LSTM CRF 重点
https://www.zhihu.com/question/35866596 条件随机场 CRF(条件随机场)与Viterbi(维特比)算法原理详解 https://blog.csdn.net/qq ...
最新文章
- mysql 5.7 1054_MySQL5.7更改密码时出现ERROR 1054 (42S22)的解决方法
- 高考结束了,来看下QS最新全球大学排名,清华北大进前20
- Ubuntu上nfs的安装配置
- docker nexus3
- linux accept 修改数据包,Linux协议栈accept和syn队列问题
- 【费用预测】基于matlab粒子群算法优化ELM神经网络预测费用【含Matlab源码 1378期】
- 《Java1996》詹姆斯·高斯林简介
- 一文读懂Layer 2:Layer 2指基于底层区块链...
- android原生支持机型,首发机型Find 7:OPPO发布原生Android系统
- HTML单机玩游戏,电脑十大耐玩单机游戏,推荐10个经典单机游戏
- Java实现扫码枪二维码自动跳转网页(基于键盘监听)
- 接口安全评估基本流程
- 常用二极管IN4148和单片机驱动的一些关系
- 哼唱识别(query by humming)
- 【5万字】详解 Plotly Express 可视化
- 二维空间最近点对问题 python
- 复变函数基本概念总结
- The Shawshank Redemption-5
- GMap.net控件学习记录
- Python面向对象二(第十二讲)
热门文章
- PostgreSQL 高权限命令执行 (CVE-2019-9193)
- win10允许应用使用麦克风和照相机
- 路由器CAR限速策略
- 【Matlab条形码识别】二维条形码识别【含GUI源码 607期】
- 一级计算机word字处理教程,计算机一级考试历年常见考点总结:Word文字处理.pdf...
- Java Optional总结
- Android实现调用手机摄像头录像限制录像时长
- 【报告分享】2019-2020年中国产业互联网发展指数-清华大学(附下载)
- 打卡第4天:安恒元旦杯-爆破鬼才与CRC
- authorization权限控制_MVC中AuthorizeAttribute用法并实现权限控制