VMProtect SDK使用日记
首先是看懂接口
#pragma once#if defined(__APPLE__) || defined(__unix__)
#define VMP_IMPORT
#define VMP_API
#define VMP_WCHAR unsigned short
#else
#define VMP_IMPORT __declspec(dllimport)
#define VMP_API __stdcall
#define VMP_WCHAR wchar_t
#ifdef _WIN64
#pragma comment(lib, "VMProtectSDK64.lib")
#else
#pragma comment(lib, "VMProtectSDK32.lib")
#endif // _WIN64
#endif // __APPLE__ || __unix__#ifdef __cplusplus
extern "C" {
#endif// protection// 保护相关// 开始常规保护VMP_IMPORT void VMP_API VMProtectBegin(const char *);// 开始虚拟保护VMP_IMPORT void VMP_API VMProtectBeginVirtualization(const char *);// 开始变异保护VMP_IMPORT void VMP_API VMProtectBeginMutation(const char *);// 开始超级保护(虚拟保护 + 变异保护)VMP_IMPORT void VMP_API VMProtectBeginUltra(const char *);// 开始虚拟按键保护VMP_IMPORT void VMP_API VMProtectBeginVirtualizationLockByKey(const char *);// 开始超级按键保护VMP_IMPORT void VMP_API VMProtectBeginUltraLockByKey(const char *);// 结束保护(上面的每一个函数都要对应一个结束保护)VMP_IMPORT void VMP_API VMProtectEnd(void);// utils// 杂项// 判断是否处于保护代码中VMP_IMPORT bool VMP_API VMProtectIsProtected();// 判断是否处于调试器中VMP_IMPORT bool VMP_API VMProtectIsDebuggerPresent(bool);// 判断是否处于虚拟机中VMP_IMPORT bool VMP_API VMProtectIsVirtualMachinePresent(void);// 判断程序CRC是否正确VMP_IMPORT bool VMP_API VMProtectIsValidImageCRC(void);// 获取加密后的char字符串VMP_IMPORT const char * VMP_API VMProtectDecryptStringA(const char *value);// 获取加密后的wchar_t字符串VMP_IMPORT const VMP_WCHAR * VMP_API VMProtectDecryptStringW(const VMP_WCHAR *value);// 释放加密后的字符串VMP_IMPORT bool VMP_API VMProtectFreeString(const void *value);// licensing// 许可标识enum VMProtectSerialStateFlags{SERIAL_STATE_SUCCESS = 0, // 成功状态SERIAL_STATE_FLAG_CORRUPTED = 0x00000001, // 损坏状态SERIAL_STATE_FLAG_INVALID = 0x00000002, // 无效状态SERIAL_STATE_FLAG_BLACKLISTED = 0x00000004, // 黑名单状态SERIAL_STATE_FLAG_DATE_EXPIRED = 0x00000008, // 过期状态SERIAL_STATE_FLAG_RUNNING_TIME_OVER = 0x00000010, // 超时状态SERIAL_STATE_FLAG_BAD_HWID = 0x00000020, // 错误机器码状态SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED = 0x00000040, //};#pragma pack(push, 1)typedef struct{unsigned short wYear; // 年unsigned char bMonth; // 月unsigned char bDay; // 日} VMProtectDate;typedef struct{int nState; // VMProtectSerialStateFlags : 操作状态VMP_WCHAR wUserName[256]; // user name : 用户名VMP_WCHAR wEMail[256]; // email : 邮箱VMProtectDate dtExpire; // date of serial number expiration : 序列号到期时间VMProtectDate dtMaxBuild; // max date of build, that will accept this key :int bRunningTime; // running time in minutes : 运行时间unsigned char nUserDataLength; // length of user data in bUserData :unsigned char bUserData[255]; // up to 255 bytes of user data : 用户数据} VMProtectSerialNumberData;
#pragma pack(pop)// 设置序列号VMP_IMPORT int VMP_API VMProtectSetSerialNumber(const char *serial);// 获取序列号状态VMP_IMPORT int VMP_API VMProtectGetSerialNumberState();// 获取序列号数据VMP_IMPORT bool VMP_API VMProtectGetSerialNumberData(VMProtectSerialNumberData *data, int size);// 获取当前的机器码VMP_IMPORT int VMP_API VMProtectGetCurrentHWID(char *hwid, int size);// activation//enum VMProtectActivationFlags{ACTIVATION_OK = 0, // 成功ACTIVATION_SMALL_BUFFER, // 缓冲区太小ACTIVATION_NO_CONNECTION, // 没有连接ACTIVATION_BAD_REPLY, // 错误的回复ACTIVATION_BANNED, // 禁止ACTIVATION_CORRUPTED, // 损坏ACTIVATION_BAD_CODE, // 错误的代码ACTIVATION_ALREADY_USED, // 已经使用过ACTIVATION_SERIAL_UNKNOWN, // 未知序列号ACTIVATION_EXPIRED, // 已经过期ACTIVATION_NOT_AVAILABLE // 无法使用};// 激活许可证VMP_IMPORT int VMP_API VMProtectActivateLicense(const char *code, char *serial, int size);// 停用许可证VMP_IMPORT int VMP_API VMProtectDeactivateLicense(const char *serial);// 获取离线激活字符串VMP_IMPORT int VMP_API VMProtectGetOfflineActivationString(const char *code, char *buf, int size);// 获取离线停用字符串VMP_IMPORT int VMP_API VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size);#ifdef __cplusplus
}
#endif
#pragma once#ifndef byte
typedef unsigned char byte;
#endif// 错误标识
enum VMProtectErrors
{ALL_RIGHT = 0, // 全部正确UNSUPPORTED_ALGORITHM = 1, // 不支持的算法UNSUPPORTED_NUMBER_OF_BITS = 2, // 不支持的位数USER_NAME_IS_TOO_LONG = 3, // 用户名太长EMAIL_IS_TOO_LONG = 4, // 电子邮件太长USER_DATA_IS_TOO_LONG = 5, // 用户数据太长HWID_HAS_BAD_SIZE = 6, // 机器码长度错误PRODUCT_CODE_HAS_BAD_SIZE = 7, // 产品代码长度错误SERIAL_NUMBER_TOO_LONG = 8, // 序列号太长BAD_PRODUCT_INFO = 9, // 产品信息错误BAD_SERIAL_NUMBER_INFO = 10, // 错误序列号信息BAD_SERIAL_NUMBER_CONTAINER = 11, // 错误序列号容器NOT_EMPTY_SERIAL_NUMBER_CONTAINER = 12, // 非空序列号容器BAD_PRIVATE_EXPONENT = 13, // 错误个人信息BAD_MODULUS = 14, // 错误模块
};// 序列号标识
enum VMProtectSerialNumberFlags
{HAS_USER_NAME = 0x00000001, // 有用户名HAS_EMAIL = 0x00000002, // 有邮箱HAS_EXP_DATE = 0x00000004, // 有导出数据HAS_MAX_BUILD_DATE = 0x00000008, // 有最大建设时间HAS_TIME_LIMIT = 0x00000010, // 有时间限制HAS_HARDWARE_ID = 0x00000020, // 有硬件IDHAS_USER_DATA = 0x00000040, // 有用户数据SN_FLAGS_PADDING = 0xFFFFFFFF // 填充
};// 算法标识
enum VMProtectAlgorithms
{ALGORITHM_RSA = 0, // RSAALGORITHM_PADDING = 0xFFFFFFFF // 填充
};#define MAKEDATE(y, m, d) (DWORD)((y << 16) + (m << 8) + d)#pragma pack(push, 1)
struct VMProtectProductInfo
{VMProtectAlgorithms algorithm; // 算法标识size_t nBits; // 比特size_t nPrivateSize; // 私人大小byte *pPrivate; // 私人数据size_t nModulusSize; // 模块大小byte *pModulus; // 模块数据size_t nProductCodeSize; // 产品代码大小byte *pProductCode; // 产品代码
};
struct VMProtectSerialNumberInfo
{INT flags; // 标识wchar_t *pUserName; // 用户名wchar_t *pEMail; // 邮箱DWORD dwExpDate; // 导入数据DWORD dwMaxBuildDate; // 最大建设时间BYTE nRunningTimeLimit; // 运行时间限制char *pHardwareID; // 硬件IDsize_t nUserDataLength; // 用户数据大小BYTE *pUserData; //用户数据
};
#pragma pack(pop)// for dynamic link 动态链接库
typedef VMProtectErrors(__stdcall *tVMProtectGenerateSerialNumber)(VMProtectProductInfo *pProductInfo, VMProtectSerialNumberInfo *pSerialInfo, char **pSerialNumber);
typedef void(__stdcall *tVMProtectFreeSerialNumberMemory)(char *pSerialNumber);// for static link 静态链接库
VMProtectErrors __stdcall VMProtectGenerateSerialNumber(VMProtectProductInfo *pProductInfo, VMProtectSerialNumberInfo *pSerialInfo, char **pSerialNumber);
void __stdcall VMProtectFreeSerialNumberMemory(char *pSerialNumber);
#include <Windows.h>
#include <stdio.h>#include <iostream>
#include <string>#include "VMProtectSDK.h"
#include "KeyGenAPI.h"int main(int argc, char* argv[])
{/* 超级保护开始 */VMProtectBeginUltra("main");/* 程序基本检测 */printf("[+] 处于代码保护中 : %s \n", VMProtectIsProtected() ? "Yes" : "No");printf("[+] 处于调试器中 : %s \n", VMProtectIsDebuggerPresent(true) ? "Yes" : "No");printf("[+] 处于虚拟机中 : %s \n", VMProtectIsVirtualMachinePresent() ? "Yes" : "No");printf("[+] 程序CRC未变动 : %s \n", VMProtectIsValidImageCRC() ? "Yes" : "No");/* 加密char字符串 */const char* char_str = VMProtectDecryptStringA("[+] this is char string \n");printf("%s", char_str);VMProtectFreeString(char_str);/* 加密wchar字符串 */const wchar_t* wchar_str = VMProtectDecryptStringW(L"[+] this is wchar string \n");wprintf(L"%ws", wchar_str);VMProtectFreeString(wchar_str);/* 获取HWID */char hwid[0x100]{ 0 };VMProtectGetCurrentHWID(hwid, 0x100);printf("[+] 计算机HWID -> %s \n", hwid);/* 获取序列号 */std::string Serial;std::cout << "[+] 输入序列号 -> ";getline(std::cin, Serial);/* 设置序列号 */int state = VMProtectSetSerialNumber(Serial.c_str());printf("[+] 序列号状态 -> %d \n", state);/* 获取序列号的相关信息 */VMProtectSerialNumberData data{ 0 };VMProtectGetSerialNumberData(&data, sizeof(data));printf("[+] nState -> %d \n", data.nState);printf("[+] wUserName -> %ws \n", data.wUserName);printf("[+] wEMail -> %ws \n", data.wEMail);printf("[+] dtExpire -> %d-%d-%d \n", data.dtExpire.wYear, data.dtExpire.bMonth, data.dtExpire.bDay);printf("[+] dtMaxBuild -> %d-%d-%d \n", data.dtMaxBuild.wYear, data.dtMaxBuild.bMonth, data.dtMaxBuild.bDay);printf("[+] bRunningTime -> %d \n", data.bRunningTime);printf("[+] nUserDataLength -> %d \n", data.nUserDataLength);printf("[+] bUserData -> %s \n", data.bUserData);/* 超级保护结束 */VMProtectEnd();system("pause");return 0;
}
VMProtect SDK使用日记相关推荐
- VMProtect SDK+ASProtect SDK保护
程序具体保护实例 VMProtect SDK+ASProtect SDK保护 工具: VMProtect 1.12 ASProtect 1.33[Cr] 相关工具可以到www.pediy.com下载到 ...
- VMProtect SDK完全避坑指南
文章目录 前言 编译VMProtect Demo 生成机器码 替换密钥对 生成序列号 总结 前言 在编写软件的时候,通常会有这样一个需求,需要对自己写的软件实现一机一码加密保护,并且最好能够限制使用时 ...
- VMProtect 与 ASProtect 在VC中的SDK编程
最近想用VMProtect和ASProtect 的SDK加密一个程序,结果搞了半天没搞成,网上没看到在VC中如何使用VMProtect的SDK加密,于是琢磨了一下,总算成功了,最后有一点点心得,与大家 ...
- 脱壳入门初级教学(第四课 常见压缩壳与加密壳)
转自:http://bestmk.cn/thread-491.htm 加壳软件按照其加壳目的和作用,可分为两类:一是压缩(Packers),二是保护(Protectors).压缩这类壳主要目的是减小程 ...
- 华为云人脸识别SDK踩坑日记
最近公司要接入华为的人脸识别api这是前提,看了一天手册跟着文档做下来有问题的地方不少,就以demo为例子写一写经验吧 先给上SDK介绍 https://support.huaweicloud.com ...
- solidworks二次开发 学习日记--3使用solidworks sdk api 和vc做简单开发
1. 安装 solidworks sdk api (按默认安装,编程工具应在 c 盘) 2. 在 vc6.0 中化建立 atl com app wizard 3. ...
- HTC VIVE SDK 中的例子 hellovr_opengl 程序流程分析
最近Vive的VR头盔设备很火,恰逢项目需求,所以对 SDK 中的例子 hellovr_opengl 做了比较细致的代码分析,先将流程图绘制如下,便于大家理解. 在ViVe头盔中实现立体效果的技术核心 ...
- 完美日记的微服务实践和优化思路
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「阿里巴巴中间件」 如果你是一位程序媛, ...
- “国货之光” 完美日记的微服务实践和优化思路
如果你是一位程序媛,你一定知道完美日记. 如果你是一位程序员,你的那个她一定知道完美日记. 今年双11,完美日记仅用28分钟就超过了2018年双11全天的销售额,成为第一个登上天猫双11彩妆榜首的国货 ...
最新文章
- 创新工场有哪些失败项目?不要只看着成功
- 【开发工具】SCALA
- [SpringBoot2]@MatrixVariableUrlPathHelper
- 如果有这样一台服务器……
- activiti7流程设计器_消防水泵结合器怎么安装,水泵结合器安装工艺分享
- 使用instantclient_11_2和PL/SQL Developer工具包连接oracle 11g远程数据库
- excel常用函数公式及技巧_Excel统计类函数公式应用技巧解读,绝对的硬核干货!...
- 2022考研计算机是热门专业吗,2022计算机考研专业复习规划是什么?
- 基础算法(三)---二分排序(Java)
- 2021年《职业防治法》宣传周活动资料海报挂图及职业病知识小手册等
- Windows平台下使用GoLand生成Linux可执行文件
- 苹果应用提审与NAT64
- Ethernet0没有有效的IP配置
- 031-JVM-合并写(write combining)
- Linux CRDA(Central Regulatory Domain Agent)简介
- 小白学SLAM的流水账(一):跑通ORB踩过的坑
- 蒙氏三段卡素材---蚂蚱三段卡
- Excel公式与函数——每天学一个
- 广电700M,到底行不行?
- 智慧多功能综合杆案例分享:上海市多杆合一、综合杆道路智慧路灯项目解决方案解析
热门文章
- 106.精读《数据之上·智慧之光 - 2018》
- iOS 关于 定位、相机、相册权限处理
- 获取小程序二维码携带的参数
- error MSB6006: cmd.exe exited with code 4.解决方法
- 用java面向对象的内容建立学生姓名,学号,id,班级,每一科的成绩,以及对管理员实现(对老师只实现查看):通过名字查询成绩,通过学号查询成绩,通过id修改姓名,通过姓名修改成绩
- 3-论文笔记--《Privacy-preserving and Efficient Aggregation based on Blockchain for Power Grid...》
- 四川数字交通科技股份有限公司招标
- 如何制作U盘启动盘进行Win10重装?
- Halcon版本切换助手
- slim php 优点,Slim容器分析