MProtect使用小计【三】 – 权限管理

说明

本篇简单的说一下怎么样使用的VMProtect的权限管理功能,使我们的程序拥有注册码的功能。只用的注册版的程序才能执行指定的函数
同样这个功能VMProtect也有例子位置在:安装目录\VMProtect Ultimate\Examples\Licensing\MSVC\下找到。

打开工程

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

修改原工程

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

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

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

开启MAP

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

增加保护

打开VMProtect并加载编译出的exe,载入之后就就可以看到程序都是有哪些的函数了。
VMProtect使用小计【三】
另加一张没开启MAP功能的图片
VMProtect使用小计【三】

这里找到int register_code(int a)选择绑定注册码,然后选择加密
VMProtect使用小计【三】

添加一个授权

切换到授权管理选项卡,并点击生成按钮。
VMProtect使用小计【三】

生成完新建授权
VMProtect使用小计【三】
VMProtect使用小计【三】

保护程序

选择这个绿色的播放按钮,进行编译加密。
在加壳的exe目录下新建一个用来输入的序列号的serial.txt。内容就为刚才生成的序列号。

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

授权成功

VMProtect使用小计【三】

授权不成功

随便修改一下serial.txt的内容,可以看到如下效果
VMProtect使用小计【三】

源代码

// 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;
}

转载于:https://www.cnblogs.com/vcerror/p/4289044.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值