说明

本篇简单的说一下怎么样使用的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. vue常见面试题

    什么是 mvvm? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑:View ...

  2. [CSP-S模拟测试]:工业题/a(数学)

    题目传送门(内部题39) 输入格式 第一行:四个正整数$n$.$m$.$a$.$b$.第二行:$n$个正整数,第$i$个表示$f(i,0)$.第三行:$m$个正整数,第$i$个表示$f(0,i)$. ...

  3. 老板让我十分钟上手nx-admin

    大体流程 参考资料: nx-admin项目地址 首先这里就不讲解vue和vuex之类的基础东西了 有兴趣的可以去官方文档了解.这里根据流程走向大概说说 路由配置 首先找到路由配置,路由配置放在了src ...

  4. Hive 数据类型转换(转)

    原文连接:https://www.iteblog.com/archives/892.html 在<Hive内置数据类型>文章中,我们提到了Hive内置数据类型由基本数据类型和复杂数据类型组 ...

  5. 泛微weaver_oa filebrowser.jsp 任意目录遍历

    url//document/imp/filebrowser.jsp?dir=/etc/

  6. Rust <2>:函数、方法与注释的格式

    rust 函数定义格式如下: fn function_name(a: i64, b: u32, c: bool) -> (d: f64, e: &str) { ... (1, " ...

  7. list列表操作(创建、增加、删除、取值)

    list ####(一)列表的创建[].追加(append,extend,insert).删除(remove.del.poop).修改 ##创建一个空列表.一个字符串列表.一个数字列表 lis0 = ...

  8. shell getopts命令

    由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高.使用内部命令 getopts 可以很方便地处理命令行参数.一般格式为: getopts optstring name [args]   ...

  9. PHP正则表达式中的反斜线

    PHP反斜线再正则表达式中的使用 <?php $str = 'hello\world'; $pattern = '/hello\\\\world/'; preg_match($pattern,$ ...

  10. Vue开发环境安装并集成element-ui示例

    此文为转载,原文链接:https://blog.csdn.net/weixin_44670973/article/details/88871106 在此对原文中部分内容进行补充. 补充:element ...