说明

本篇简单的说一下怎么样使用的VMProtect的权限管理功能,使我们的程序拥有注册码的功能。只用的注册版的程序才能执行指定的函数

同样这个功能VMProtect也有例子位置在:安装目录\VMProtect Ultimate\Examples\Licensing\MSVC\下找到。

打开工程

为了节省时间,我这里就直接使用第一篇的文章。

修改原工程

将原来的工程源码修改为下面代码,并编译为Release

因代码比较长,所以就将代码放置文章的结尾

可以看到__declspec(noinline) int register_code(int
a)
这个函数,之所以用__declspec(noinline)标志,是不想让编译器把这个函数给优化掉,如果给优化掉,就没有办法个给函数添加注册功能了。

开启MAP

为什么要开启MAP功能呢,这是让VMProtect看到程序都是有那些的函数被导出了,这样就可以选择性的哪些函数。

增加保护

打开VMProtect并加载编译出的exe,载入之后就就可以看到程序都是有哪些的函数了。



另加一张没开启MAP功能的图片

这里找到int register_code(int a)选择绑定注册码,然后选择加密

添加一个授权

切换到授权管理选项卡,并点击生成按钮。

生成完新建授权



保护程序

选择这个绿色的播放按钮,进行编译加密。

在加壳的exe目录下新建一个用来输入的序列号的serial.txt。内容就为刚才生成的序列号。

cySEdR58cjnXzj3puhr923nZvS94n352cGmNb3eEkGIacVpNXPQxL1RGXqK4Z+hZxNYuaob2QoV/
rRhGK41ZYwOFg6pCJbl5zkMkJl4daijugp3U1n304fDqE0e3pbRsXmi7Gm/x7aVc3JH7UZ4PpkJz
WldnPBDbZ2SmOapQf/qaC4gt8AyrMcNlv/WAD7PXPuZUDiIbHD0sR8/3+n+HEgc1WmbuzPXIpA+g
rSUbfGjHGZNJEOv1ge7N8Kx5qYMHuSIGpiEY/vJcfXYn0oiaEfm8rMMpl4qdxb4sGg78il3ttsfR
anH9imc3R0xWHa2oZ5AjfA47TAwyiQ0eyN14Jg==

授权成功

授权不成功

随便修改一下serial.txt的内容,可以看到如下效果

源代码

// VMProtectDemo1.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "VMProtectDemo1.h" #include "VMProtectSDK.h" #ifdef _DEBUG
#define new DEBUG_NEW
#endif // 唯一的应用程序对象 CWinApp theApp; using namespace std; #define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag)
void print_state(INT state)
{
if (state == 0)
{
printf("state = 0\n");
return;
} printf("state = ");
PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED);
PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID);
PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED);
PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED);
PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER);
PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID);
PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED);
printf("\n");
} char *read_serial(const char *fname)
{
FILE *f;
if (0 != fopen_s(&f, fname, "rb")) return NULL;
fseek(f, 0, SEEK_END);
int s = ftell(f);
fseek(f, 0, SEEK_SET);
char *buf = new char[s + 1];
fread(buf, s, 1, f);
buf[s] = 0;
fclose(f);
return buf;
} __declspec(noinline) int register_code(int a)
{
return MessageBox(NULL,_T("this is register_code test"), _T("By:Sollyu"),MB_OK | MB_ICONINFORMATION);
} int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; VMProtectBegin("VMProtec Tag By Sollyu"); char *serial = read_serial("serial.txt");
ASSERT(serial != NULL);
std::cout << serial << std::endl;
int res = VMProtectSetSerialNumber(serial);
delete [] serial;
if (res)
{
printf ("授权失败,失败代码:");
print_state(res);
system("pause");
return 0;
} std::cout << "授权成功!" << std::endl; CString csMessageBox;
csMessageBox.Format(_T("Result code = %d"),register_code(argc));
MessageBox(NULL, csMessageBox, _T("By:Sollyu"), MB_OK|MB_ICONINFORMATION); VMProtectEnd(); system("pause");
return nRetCode;
}


MProtect使用小计【三】 – 权限管理的更多相关文章

  1. struts2学习之旅三 权限管理和导航设计

    1,权限管理的db设计和dao实现,尽量简单快速有效: db的设计如下:权限按照角色来赋给用户: 权限对应每一个具体的功能,有菜单级别的,有导航级别的,还有页面级别的功能: 涉及到权限的敏感操作一般都 ...

  2. PHP——小尾巴之权限管理

    流程: 在权限管理页面,默认显示用户的角色,更改复选框的按钮内容,可以改变角色,点击确定提交至数据库 在登陆之后,只显示该用户的角色所对应的权限 数据库: guanli.php <!DOCTYP ...

  3. TFS 2010 使用手册(三)权限管理

    本文参考了 蔚蓝的宁静 http://www.cnblogs.com/tymo/archive/2011/03/21/1990550.html 等文章. 1.权限说明 1.1 权限关联 TFS的权限与 ...

  4. Expo大作战(三十)--expo sdk api之Permissions(权限管理模块),Pedometer(计步器api)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  5. MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理

    MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...

  6. Oracle数据安全(三)权限管理

    一.权限概述 所谓权限就是执行特定类型SQL命令或访问其他模式对象的权利.用户在数据库中可以执行什么样的操作,以及可以对哪些对象进行操作,完全取决于该用户所拥有的权限. 在Oracle中将权限分为系统 ...

  7. 从零开始配置Jenkins(三)——用户权限管理

    背景 最近项目管理中需要对jenkins的权限进行区分和限定,就研究了一下下.顺道把用户和权限这块的内容分享给大家. 用户 要想创建用户,需要先设定允许用户注册. 在系统设置,Configure Gl ...

  8. Jenkins拾遗--第三篇(用户权限管理)

    采访过很多实用Jenkins的同学,发现Jenkins的安全是一个很薄弱的地方.很多公司用作生产部署的Jenkins安全管理都不是很规范,就更别提测试用的Jenkins了. 其实Jenkins是一个很 ...

  9. MySQL权限管理、配置文件(三)

    一.MySQL权限管理 GRANT 权限 ON 授权范围 TO '用户名'@'允许的ip(所有%)' IDENTIFIED BY '用户密码'; 权限:参加下表,一般常用的是CREATE.DELETE ...

随机推荐

  1. 【Shiro】六、Apache Shiro Session管理

    1.Session的介绍 关于Session 会话:从启动一个Session到关闭这个Session作为一个会话,是对客户端和服务器端交互的一种封装,带有时效性 会话的产生: 一般从容器中产生 Web ...

  2. What size do you use for varchar(MAX) in your parameter declaration?

    What size do you use for varchar(MAX) in your parameter declaration? In this case you use -1. See al ...

  3. vue 自定义指令(directive)实例

    一.内置指令 1.v-bind:响应并更新DOM特性:例如:v-bind:href  v-bind:class  v-bind:title  v-bind:bb 2.v-on:用于监听DOM事件: 例 ...

  4. springboot bootstrap.yml 和 application.yml

    bootstrap.yml可以理解成系统级别的一些参数配置,这些参数一般是不会变动的 application.yml 可以用来定义应用级别的,如果搭配spring-cloud-config使用 app ...

  5. 【C++第一个Demo】---控制台RPG游戏4【角色系统】

    [角色基类] #ifndef _ROLE_H_ #define _ROLE_H_ #include<list> #include<vector> #include " ...

  6. OO七大设计原则

    一.单一职责原则(Single Responsibility Principle,SRP) 含义: 1.避免相同的职责分散到不同的类中 2.避免一个类承担太多职责 作用: 1.可以减少类之间的耦合 2 ...

  7. 在响应式布局中,碰到图片不会自动缩放,因此需要一段js脚本

    <script> (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchang ...

  8. 如何安装python运行环境Anaconda

    参考视频:https://v.qq.com/x/page/u05499rig9s.html

  9. 线性方程组迭代算法——Jacobi迭代算法的python实现

    原理: 请看本人博客:线性方程组的迭代求解算法——原理 代码: import numpy as np max=100#迭代次数上限 Delta=0.01 m=2#阶数:矩阵为2阶 n=3#维数:3X3 ...

  10. 在我的Mint上安装网易云音乐

    首先到网易官网下载Ubuntu版本的安装包,哪个版本多少位没多大所谓啦 然而会出现类似如下的依赖错误: dpkg: 依赖关系问题使得 netease-cloud-music 的配置工作不能继续: ne ...