简介
- 本实例用于演示,通过万捷网络验证给VC++程序增加VMP网络授权功能,让VC++编写的程序可以进行销售,控制软件的版权,为软件的作者提供收益。
- VMP是一款非常强大的PE保护壳程序,通过虚拟化代码内存等处理,为指定子程序增加注册码授权的功能,没有正确的注册码解密受保护的代码,就不可以正常运行软件,可以更好的达到防破解的目的。
- 购买使用网络验证系统请联系唯一客服QQ:434888761
实现的原理:
根据网络验证的WebApi接口的要求,构造URL网址,然后访问网址,根据返回的内容控制程序流程。
用到的技术/接口:
1、(必须)需要用到URL访问的功能,通常表达为:网页访问、GET请求、HTTP请求、cURL,用于访问构造的网址。
2、(非必须)字符串分割成数组的功能,用于将访问网址返回的内容分割成数组,根据实际需求来利用分割出的成员结果。
相关资料:
在线帮助文档(看 webapi接口说明):https://www.wjsrs.com/h/
示例源码(片段):
// 此代码为部分代码片段, 网络验证授权功能需要配合万捷网络验证系统实现。
// 联系QQ:434888761
#include <iostream>
#include <string>
#include <sstream>
#include "conio.h"
#include "include/VMProtectSDK.h"
#include <Windows.h>
#include "HttpRequest.h"
using namespace std;
int main()
{
string server = "http://127.0.0.1/";//服务器地址
INTERNET_PORT port = 80;//端口号
//获取机器码hwid
size_t hwid_Len =VMProtectGetCurrentHWID(NULL,0);
char* hwid = new char[hwid_Len];
VMProtectGetCurrentHWID(hwid, hwid_Len);
cout <<"机器码:" << hwid <<"\n\n";
string ka;
stringstream url; //组合URL
//用户登录获取激活码
cout <<"请输入卡号后按回车:\n\n";
cin >> ka;
url.clear();
url.str("");
url << server;
url << "wlyz/web6.0/api.php?name=s_vmpkey";//设置接口名称
url << "&c1=10001";//设置软件编号
url << "&c2=" << ka ;//设置卡号
url << "&c4=1.0";//设置软件编号
url << "&c5=" << hwid;//设置机器码
//cout << "URL:" << url.str() <<"\n\n";
string res= GetHtml(url.str(), port);
///cout << "返回结果:" << res << "\n";
//返回信息不包含<|>分隔符,表示返回错误信息了。
if (!res.find("<|>")) {
cout << "出错了:" << res << "\n\n";
system("pause");
return 0;
}
//分割字符串,取出序列号等信息
vector<std::string>arr = Split(res, "<|>");
if (arr.size() < 4) {
cout << "出错了:" << res << "\n\n";
system("pause");
return 0;
}
cout << "序列号:" << arr[3] << "\n\n";
//设置序列号
int zt = VMProtectSetSerialNumber(arr[3].c_str());
if (zt!=0) {
switch (zt)
{
case 1:
cout << "Error:授权模块错误." << "\n\n";
break;
case 2:
cout << "Error:序列号错误." << "\n\n";
break;
case 4:
cout << "Error:序列号已被加入黑名单." << "\n\n";
break;
case 8:
cout << "Error:序列号已过期." << "\n\n";
break;
case 16:
cout << "Error:序列号已超过使用次数." << "\n\n";
break;
case 32:
cout << "Error:序列号已经绑定其他机器." << "\n\n";
break;
case 64:
cout << "Error:序列号不适用当前版本." << "\n\n";
break;
default:
cout << "Error:未知错误." << "\n\n";
break;
}
system("pause");
return 0;
}
//取序列号状态
zt = VMProtectGetSerialNumberState();
if(zt!=0){
cout << "Error:错误 "<< zt << "\n\n";
system("pause");
return 0;
}
//设置VMP保护标记,在VMP中将此标记绑定到序列号
VMProtectBeginUltraLockByKey("VMP保护标记,【锁定到序列号】选【是】");
cout << "看到这条信息,表示所有验证都通过了,被序列号保护的代码正常执行。 " << "\n\n";
VMProtectEnd();
system("pause");
return 0;
}