首先是看懂接口

#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使用日记相关推荐

  1. VMProtect SDK+ASProtect SDK保护

    程序具体保护实例 VMProtect SDK+ASProtect SDK保护 工具: VMProtect 1.12 ASProtect 1.33[Cr] 相关工具可以到www.pediy.com下载到 ...

  2. VMProtect SDK完全避坑指南

    文章目录 前言 编译VMProtect Demo 生成机器码 替换密钥对 生成序列号 总结 前言 在编写软件的时候,通常会有这样一个需求,需要对自己写的软件实现一机一码加密保护,并且最好能够限制使用时 ...

  3. VMProtect 与 ASProtect 在VC中的SDK编程

    最近想用VMProtect和ASProtect 的SDK加密一个程序,结果搞了半天没搞成,网上没看到在VC中如何使用VMProtect的SDK加密,于是琢磨了一下,总算成功了,最后有一点点心得,与大家 ...

  4. 脱壳入门初级教学(第四课 常见压缩壳与加密壳)

    转自:http://bestmk.cn/thread-491.htm 加壳软件按照其加壳目的和作用,可分为两类:一是压缩(Packers),二是保护(Protectors).压缩这类壳主要目的是减小程 ...

  5. 华为云人脸识别SDK踩坑日记

    最近公司要接入华为的人脸识别api这是前提,看了一天手册跟着文档做下来有问题的地方不少,就以demo为例子写一写经验吧 先给上SDK介绍 https://support.huaweicloud.com ...

  6. solidworks二次开发 学习日记--3使用solidworks sdk api 和vc做简单开发

    1.         安装 solidworks sdk api (按默认安装,编程工具应在 c 盘) 2.         在 vc6.0 中化建立 atl com app wizard 3.    ...

  7. HTC VIVE SDK 中的例子 hellovr_opengl 程序流程分析

    最近Vive的VR头盔设备很火,恰逢项目需求,所以对 SDK 中的例子 hellovr_opengl 做了比较细致的代码分析,先将流程图绘制如下,便于大家理解. 在ViVe头盔中实现立体效果的技术核心 ...

  8. 完美日记的微服务实践和优化思路

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「阿里巴巴中间件」 如果你是一位程序媛, ...

  9. “国货之光” 完美日记的微服务实践和优化思路

    如果你是一位程序媛,你一定知道完美日记. 如果你是一位程序员,你的那个她一定知道完美日记. 今年双11,完美日记仅用28分钟就超过了2018年双11全天的销售额,成为第一个登上天猫双11彩妆榜首的国货 ...

最新文章

  1. 创新工场有哪些失败项目?不要只看着成功
  2. 【开发工具】SCALA
  3. [SpringBoot2]@MatrixVariableUrlPathHelper
  4. 如果有这样一台服务器……
  5. activiti7流程设计器_消防水泵结合器怎么安装,水泵结合器安装工艺分享
  6. 使用instantclient_11_2和PL/SQL Developer工具包连接oracle 11g远程数据库
  7. excel常用函数公式及技巧_Excel统计类函数公式应用技巧解读,绝对的硬核干货!...
  8. 2022考研计算机是热门专业吗,2022计算机考研专业复习规划是什么?
  9. 基础算法(三)---二分排序(Java)
  10. 2021年《职业防治法》宣传周活动资料海报挂图及职业病知识小手册等
  11. Windows平台下使用GoLand生成Linux可执行文件
  12. 苹果应用提审与NAT64
  13. Ethernet0没有有效的IP配置
  14. 031-JVM-合并写(write combining)
  15. Linux CRDA(Central Regulatory Domain Agent)简介
  16. 小白学SLAM的流水账(一):跑通ORB踩过的坑
  17. 蒙氏三段卡素材---蚂蚱三段卡
  18. Excel公式与函数——每天学一个
  19. 广电700M,到底行不行?
  20. 智慧多功能综合杆案例分享:上海市多杆合一、综合杆道路智慧路灯项目解决方案解析

热门文章

  1. 106.精读《数据之上·智慧之光 - 2018》
  2. iOS 关于 定位、相机、相册权限处理
  3. 获取小程序二维码携带的参数
  4. error MSB6006: cmd.exe exited with code 4.解决方法
  5. 用java面向对象的内容建立学生姓名,学号,id,班级,每一科的成绩,以及对管理员实现(对老师只实现查看):通过名字查询成绩,通过学号查询成绩,通过id修改姓名,通过姓名修改成绩
  6. 3-论文笔记--《Privacy-preserving and Efficient Aggregation based on Blockchain for Power Grid...》
  7. 四川数字交通科技股份有限公司招标
  8. 如何制作U盘启动盘进行Win10重装?
  9. Halcon版本切换助手
  10. slim php 优点,Slim容器分析