VMProtect使用小计【三】 【转】
版权声明:
本文为博主学习过程中整理发布,如有侵权请告知
更新时间:
2018-05-24 12:08:38
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章
说明
本篇简单的说一下怎么样使用的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; }