学习示例

VMProtect SDK 演示 - 房有亮
https://bbs.pediy.com/thread-201173.htm
VMProtect - SDK的应用示例学习 - 图1

VMProtect.rar

这个例子完整的示例了VMP-SDK的应用,
但在实际应用中, 常常使用的并不是SDK自带的验证, 此验证仅适合于单机验证.

VMProtect 下载

https://down.52pojie.cn/?query=vmp
VMProtect - SDK的应用示例学习 - 图2

下载地址: https://down.52pojie.cn/Tools/Packers/VMProtect_Ultimate_v3.2.0_x32_x64_Build_976_Retail_Licensed.7z


QT测试VMP-SDK

在QT测试用例中, 仅测试了

  1. CRC校验

  2. 虚拟保护

  3. 变异保护

  4. 虚拟加变异保护

  5. 保护字符串

  6. 获取硬件ID

  7. 监测硬件ID

VMP测试

VMProtect - SDK的应用示例学习 - 图3

汇编对比

暂不探究字符串加密算法

源码

VMProtect - SDK的应用示例学习 - 图4

加密前

VMProtect - SDK的应用示例学习 - 图5
VMProtect - SDK的应用示例学习 - 图6
VMProtect - SDK的应用示例学习 - 图7

加密后

VMProtect - SDK的应用示例学习 - 图8
VMProtect - SDK的应用示例学习 - 图9

示例代码展示

完整工程

testQtVMPSDK.zip

widget.cpp

  1. #ifdef WIN32
  2. #pragma execution_character_set("utf-8")
  3. #endif
  4. #include "widget.h"
  5. #include "ui_widget.h"
  6. #include <string>
  7. #include <Windows.h>
  8. #include "VMP_SDK/VMProtectSDK.h"
  9. Widget::Widget(QWidget *parent) :
  10. QWidget(parent),
  11. ui(new Ui::Widget)
  12. {
  13. ui->setupUi(this);
  14. }
  15. Widget::~Widget()
  16. {
  17. delete ui;
  18. }
  19. #include <QDebug>
  20. #include <QMessageBox>
  21. //##############################################################################
  22. //功能:内存CRC
  23. //##############################################################################
  24. void Widget::on_pushButton_clicked()
  25. {
  26. qDebug() << "on_pushButton_clicked";
  27. if (VMProtectIsValidImageCRC())
  28. {
  29. QMessageBox::warning(this, "TestSDK", "内存 CRC 效验成功");
  30. }
  31. else
  32. {
  33. QMessageBox::warning(this, "TestSDK", "内存 CRC 效验失败");
  34. }
  35. }
  36. //##############################################################################
  37. //功能:普通保护
  38. //##############################################################################
  39. void Widget::on_pushButton_2_clicked()
  40. {
  41. qDebug() << "on_pushButton_2_clicked";
  42. VMProtectBegin("OnBnClickedButton4");
  43. QMessageBox::warning(this, "TestSDK", "VMProtectBegin");
  44. VMProtectEnd();
  45. }
  46. //##############################################################################
  47. //功能:虚拟保护
  48. //##############################################################################
  49. void Widget::on_pushButton_3_clicked()
  50. {
  51. qDebug() << "on_pushButton_3_clicked";
  52. VMProtectBeginVirtualization("OnBnClickedButton5");
  53. QMessageBox::warning(this, "TestSDK", "VMProtectBeginVirtualization");
  54. VMProtectEnd();
  55. }
  56. //##############################################################################
  57. //功能:变异保护
  58. //##############################################################################
  59. void Widget::on_pushButton_4_clicked()
  60. {
  61. qDebug() << "on_pushButton_4_clicked";
  62. VMProtectBeginMutation("OnBnClickedButton6");
  63. QMessageBox::warning(this, "TestSDK", "VMProtectBeginMutation");
  64. VMProtectEnd();
  65. }
  66. //##############################################################################
  67. //功能:虚拟加变异
  68. //##############################################################################
  69. void Widget::on_pushButton_5_clicked()
  70. {
  71. qDebug() << "on_pushButton_5_clicked";
  72. VMProtectBeginUltra("OnBnClickedButton7");
  73. QMessageBox::warning(this, "TestSDK", "VMProtectBeginUltra");
  74. VMProtectEnd();
  75. }
  76. //##############################################################################
  77. //功能:保护字符串
  78. //##############################################################################
  79. void Widget::on_pushButton_6_clicked()
  80. {
  81. qDebug() << "on_pushButton_6_clicked";
  82. //__asm int 3;
  83. QMessageBox::warning(this, "TestSDK", QString::fromStdWString(std::wstring(VMProtectDecryptStringW(L"保护字符串"))));
  84. }
  85. //##############################################################################
  86. //功能:获取硬件ID
  87. //##############################################################################
  88. void Widget::on_pushButton_7_clicked()
  89. {
  90. qDebug() << "on_pushButton_7_clicked";
  91. char *pHardWareString = NULL;
  92. UINT Size = VMProtectGetCurrentHWID(NULL, 0);
  93. pHardWareString = new char[Size];
  94. VMProtectGetCurrentHWID(pHardWareString, Size);
  95. QString str(pHardWareString);
  96. ui->lineEdit->setText(str);
  97. }
  98. //########################################################################################################################################
  99. //功能:检测硬件ID
  100. //########################################################################################################################################
  101. void Widget::on_pushButton_8_clicked()
  102. {
  103. qDebug() << "on_pushButton_8_clicked";
  104. VMProtectBeginUltra("OnBnClickedButton10");
  105. QString str;
  106. str = ui->lineEdit->text();
  107. char *pHardWareString = NULL;
  108. UINT Size = VMProtectGetCurrentHWID(NULL, 0);
  109. pHardWareString = new char[Size];
  110. VMProtectGetCurrentHWID(pHardWareString, Size);
  111. QString strHardWare(pHardWareString);
  112. if (strHardWare == str)
  113. {
  114. QMessageBox::warning(this, "TestSDK", QString::fromStdWString(std::wstring(VMProtectDecryptStringW(L"您的机器已被授权"))));
  115. }
  116. else
  117. {
  118. QMessageBox::warning(this, "TestSDK",QString::fromStdWString(std::wstring( VMProtectDecryptStringW(L"您的机器未被授权"))));
  119. }
  120. VMProtectEnd();
  121. }

稍作修改的VMProtectSDK.h

把lib放置于 .h 头文件同一目录, 然后包含头文件使用即可

  1. #pragma once
  2. // 用于自动查找到CURL目录下的lib文件
  3. #define LIBPATH(p,f) p##f
  4. #if defined(__APPLE__) || defined(__unix__)
  5. #define VMP_IMPORT
  6. #define VMP_API
  7. #define VMP_WCHAR unsigned short
  8. #else
  9. #define VMP_IMPORT __declspec(dllimport)
  10. #define VMP_API __stdcall
  11. #define VMP_WCHAR wchar_t
  12. #ifdef _WIN64
  13. #pragma comment(lib, LIBPATH(__FILE__, ".dir/../VMProtectSDK64.lib"))
  14. #else
  15. #pragma comment(lib, LIBPATH(__FILE__, ".dir/../VMProtectSDK32.lib"))
  16. #endif // _WIN64
  17. #endif // __APPLE__ || __unix__
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif
  21. // protection
  22. VMP_IMPORT void VMP_API VMProtectBegin(const char *);
  23. VMP_IMPORT void VMP_API VMProtectBeginVirtualization(const char *);
  24. VMP_IMPORT void VMP_API VMProtectBeginMutation(const char *);
  25. VMP_IMPORT void VMP_API VMProtectBeginUltra(const char *);
  26. VMP_IMPORT void VMP_API VMProtectBeginVirtualizationLockByKey(const char *);
  27. VMP_IMPORT void VMP_API VMProtectBeginUltraLockByKey(const char *);
  28. VMP_IMPORT void VMP_API VMProtectEnd(void);
  29. // utils
  30. VMP_IMPORT bool VMP_API VMProtectIsProtected();
  31. VMP_IMPORT bool VMP_API VMProtectIsDebuggerPresent(bool);
  32. VMP_IMPORT bool VMP_API VMProtectIsVirtualMachinePresent(void);
  33. VMP_IMPORT bool VMP_API VMProtectIsValidImageCRC(void);
  34. VMP_IMPORT const char * VMP_API VMProtectDecryptStringA(const char *value);
  35. VMP_IMPORT const VMP_WCHAR * VMP_API VMProtectDecryptStringW(const VMP_WCHAR *value);
  36. VMP_IMPORT bool VMP_API VMProtectFreeString(const void *value);
  37. // licensing
  38. enum VMProtectSerialStateFlags
  39. {
  40. SERIAL_STATE_SUCCESS = 0,
  41. SERIAL_STATE_FLAG_CORRUPTED = 0x00000001,
  42. SERIAL_STATE_FLAG_INVALID = 0x00000002,
  43. SERIAL_STATE_FLAG_BLACKLISTED = 0x00000004,
  44. SERIAL_STATE_FLAG_DATE_EXPIRED = 0x00000008,
  45. SERIAL_STATE_FLAG_RUNNING_TIME_OVER = 0x00000010,
  46. SERIAL_STATE_FLAG_BAD_HWID = 0x00000020,
  47. SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED = 0x00000040,
  48. };
  49. #pragma pack(push, 1)
  50. typedef struct
  51. {
  52. unsigned short wYear;
  53. unsigned char bMonth;
  54. unsigned char bDay;
  55. } VMProtectDate;
  56. typedef struct
  57. {
  58. int nState; // VMProtectSerialStateFlags
  59. VMP_WCHAR wUserName[256]; // user name
  60. VMP_WCHAR wEMail[256]; // email
  61. VMProtectDate dtExpire; // date of serial number expiration
  62. VMProtectDate dtMaxBuild; // max date of build, that will accept this key
  63. int bRunningTime; // running time in minutes
  64. unsigned char nUserDataLength; // length of user data in bUserData
  65. unsigned char bUserData[255]; // up to 255 bytes of user data
  66. } VMProtectSerialNumberData;
  67. #pragma pack(pop)
  68. VMP_IMPORT int VMP_API VMProtectSetSerialNumber(const char *serial);
  69. VMP_IMPORT int VMP_API VMProtectGetSerialNumberState();
  70. VMP_IMPORT bool VMP_API VMProtectGetSerialNumberData(VMProtectSerialNumberData *data, int size);
  71. VMP_IMPORT int VMP_API VMProtectGetCurrentHWID(char *hwid, int size);
  72. // activation
  73. enum VMProtectActivationFlags
  74. {
  75. ACTIVATION_OK = 0,
  76. ACTIVATION_SMALL_BUFFER,
  77. ACTIVATION_NO_CONNECTION,
  78. ACTIVATION_BAD_REPLY,
  79. ACTIVATION_BANNED,
  80. ACTIVATION_CORRUPTED,
  81. ACTIVATION_BAD_CODE,
  82. ACTIVATION_ALREADY_USED,
  83. ACTIVATION_SERIAL_UNKNOWN,
  84. ACTIVATION_EXPIRED,
  85. ACTIVATION_NOT_AVAILABLE
  86. };
  87. VMP_IMPORT int VMP_API VMProtectActivateLicense(const char *code, char *serial, int size);
  88. VMP_IMPORT int VMP_API VMProtectDeactivateLicense(const char *serial);
  89. VMP_IMPORT int VMP_API VMProtectGetOfflineActivationString(const char *code, char *buf, int size);
  90. VMP_IMPORT int VMP_API VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size);
  91. #ifdef __cplusplus
  92. }
  93. #endif