在实模式下,VMProtect许可系统向受保护的应用程序放置一个特殊的许可模块。该模块执行与SDK中的测试功能相同的功能,但是使用序列号的内容而不是配置ini文件。本系列教程的五个步骤说明了使用基于VMProtect和许可系统的全功能保护来保护简单应用程序的过程。

免费下载VMProtecthttps://www.evget.com/product/1859/downloade


步骤一  创建控制台应用程序

在第一阶段,我们制作了几个简单的应用程序来测试许可系统的API。现在,在第二阶段,创建一个带有foo()函数的控制台应用程序,该函数仅在注册版本中有效。这是测试应用程序的代码:

#include #include #include“ VMProtectSDK.h”#定义PRINT_HELPER(状态,标志)如果(状态和标志)printf(“%s”,#flag)
无效print_state(INT状态)
{如果(状态== 0){printf(“ state = 0 \ n”);返回;}printf(“ state =”);PRINT_HELPER(状态,SERIAL_STATE_FLAG_CORRUPTED);PRINT_HELPER(状态,SERIAL_STATE_FLAG_INVALID);PRINT_HELPER(状态,SERIAL_STATE_FLAG_BLACKLISTED);PRINT_HELPER(状态,SERIAL_STATE_FLAG_DATE_EXPIRED);PRINT_HELPER(状态,SERIAL_STATE_FLAG_RUNNING_TIME_OVER);PRINT_HELPER(状态,SERIAL_STATE_FLAG_BAD_HWID);PRINT_HELPER(状态,SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED);printf(“ \ n”);
}char * read_serial(const char * fname)
{文件* f;如果(0!= fopen_s(&f,fname,“ rb”))返回NULL;fseek(f,0,SEEK_END);int s = ftell(f);fseek(f,0,SEEK_SET);char * buf =新的char [s + 1];fread(buf,s,1,f);buf [s] = 0;fclose(f);返回buf;
}// foo()方法非常简短,但我们需要将其作为单个函数
//因此,我们要求编译器不要内联编译
__declspec(noinline)void foo()
{printf(“我是foo!\ n”);
}int main(int argc,char ** argv)
{char * serial = read_serial(“ serial.txt”);int res = VMProtectSetSerialNumber(序列);删除[]序列号;如果(res){printf(“序列号错误\ n”);print_state(res);返回0;}printf(“序列号正确,调用foo()\ n”);foo();printf(“ done \ n”);返回0;
}

在没有调试信息的情况下编译程序,但是在链接器设置中,我们创建了MAP文件–需要将它与VMProtect一起使用。运行程序后,应该看到以下文本:

序列号为错误
状态= SERIAL_STATE_FLAG_INVALID

当前,许可系统仍在测试模式下工作,因为该文件未由VMProtect处理,并且其中不包含许可模块。

步骤二 创建VMProtect保护项目

当测试应用程序准备就绪、已编译且在同一文件夹中有分配的MAP文件时,就可以运行VMProtect Ultimate并打开可执行文件。需要向项目添加两个函数:_main(这是Visual Studio重命名main())和foo()的方式。可以在VMProtect的“Functions”部分的功能列表中看到这两个功能。

将VMProtect集成到应用程序教程之实模式(一):创建新的受保护的应用程序相关推荐

  1. 将VMProtect集成到应用程序教程之实模式(四):将代码锁定到序列号上

    在实模式下,VMPROTECT 许可系统向受保护的应用程序放置一个特殊的许可模块.该模块执行与SDK中的测试功能相同的功能,但是使用序列号的内容而不是配置ini文件.本系列教程的五个步骤说明了使用基于 ...

  2. C# winform程序运行过程中提示尝试读取或写入受保护的内存.这通常指示其他内存已损坏的

    C# winform程序运行过程中提示"尝试读取或写入受保护的内存.这通常指示其他内存已损坏的" 错误,如下图所示 查看详细信息如下 未处理System.AccessViolati ...

  3. 铁威马NAS教程之如何为NAS创建新用户

    铁威马NAS除了备份功能强大之外,它的优点还在于可以共享,方便我们办公和分享文件照片之类的.当我们拥有一台NAS之后,我们如何创建更多用户账号共同分享编辑呢?以铁威马为例,下面向大家分享如何创建用户: ...

  4. linux 快速启动程序,centos7快速启动应用程序教程

    CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linu ...

  5. linux java services_在 Linux 上创建第一个 Service Fabric Java 应用程序

    先决条件 开始之前,请安装 Service Fabric SDK.Azure CLI,并在 Linux 开发环境中设置开发群集. 如果使用 Mac OS X,则可使用 Vagrant 在虚拟机中设置 ...

  6. 应用程序进程(一):创建应用程序

    1.ActivityManagerService发送创建请求 startViaZygote函数通过函数zygoteSendArgsAndGetResult()调用Zygote进程创建一个指定的应用程序 ...

  7. 将VMProtect集成到应用程序教程:许可API函数

    VMprotect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果. 本文介绍许可API函数的相关 ...

  8. SharePoint 集成PowerApps和Flow教程(二,第一个PowerApps程序)

    SharePoint 集成PowerApps和Flow教程(二,第一个PowerApps程序) 使用Excel 数据创建一个APP. 我的第一个PowerApp使用的Excel文件作为数据源,数据文件 ...

  9. kotlin web_Kotlin Web应用程序教程

    kotlin web In this tutorial, we'll learn how to create Kotlin Web Application. We assume that you're ...

最新文章

  1. 秒啊!程序员防猝死指南来了!
  2. POJ 3889 Fractal Streets(逼近模拟)
  3. cocos2d-x3.0 相对布局(一)
  4. java程序员学习路线以及我的学习经验
  5. springcloud流程图
  6. Protobuf生成Go代码指南
  7. 代码好味道、坏味道与重构
  8. 【python】list,dict赋值不要用等号,要用extend,update
  9. 如何删除“运行”里面的内容
  10. 新中大如何修改服务器地址,新中大GE10.0安装配置手册
  11. ERP原理及应用教程-第五章
  12. Pytorch报错解决:The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimensio
  13. Spring源码系列(五)——@Aspect源码解析
  14. android谷歌服务框架(GoogleServicesFramework)
  15. python设置字体_python操作word设置字体
  16. 【全局盘点】华为云政企全栈技术创新能力图谱
  17. 导入下载excel(还有excel多个sheet)和txt文本的方法
  18. 松果出行 x StarRocks:实时数仓新范式的实践之路
  19. Detectron测试过程(含关键点)
  20. 如何正确认识和推进企业数字化转型?

热门文章

  1. Linux操作系统-2022(Viper)
  2. 【数据库】数据库系统概念
  3. 使用python将中文与Unicode编码相互转换
  4. 在JSP里使用CKEditor和CKFinder
  5. 雅虎搜索怎么切换中英文_雅虎! 实际上在付费搜索中处于领先地位
  6. layDate日期选择插件
  7. 基于CocosCreator的切水果小游戏(一)
  8. IDEA 如何进入.class文件上打的的debug断点
  9. jquery获取父元素及祖先元素
  10. Transformer框架时间序列模型Informer内容与代码解读