活动介绍
file-type

32位字符串加解密构件CRYPT32详解

4星 · 超过85%的资源 | 下载需积分: 50 | 1KB | 更新于2025-07-29 | 114 浏览量 | 33 下载量 举报 收藏
download 立即下载
标题中的"Crypto32"指的是一个在IT领域内,特别是在软件开发和数据安全领域中经常遇到的一个术语。在深入探讨之前,我们需要先理解什么是“32位字符串加密构件”。 ### 加解密构件简介 加密构件是一种软件组件,通常被集成在操作系统或应用软件中,用于对数据执行加密和解密操作。它是一组预先编程好的功能模块,可以是应用程序接口(API)、动态链接库(DLL)或其他形式的可重用代码单元。加密构件可以实现多种加密算法,如对称加密、非对称加密、散列算法等。 ### 32位字符串加密构件的含义 标题中的“32位”是一个特定的描述,它可能指向加密构件所处理的数据位宽,或者更精确地指明了加密算法中使用的密钥长度。在这个上下文中,“32位字符串加密构件”可能意味着该构件专门处理32位长度的数据或字符串,或者使用32位的密钥进行加密和解密。 ### 不可视构件(控件) 在软件开发中,“不可视构件”指的是那些执行内部功能但不直接提供用户界面的组件。这些构件通常在软件后台运行,完成如数据处理、通信等任务。与之相对的是“可视构件”,它们与用户交互并提供用户界面元素。在Windows编程中,控件是一种特定类型的可视构件,比如按钮、文本框等。 ### 标签中的关键词 - **不可视构件**:通常用于程序后台,执行数据处理、算法运算等非用户交互功能的程序组件。 - **控件**:是一种特定的软件构件,它提供用户界面和控制功能,使用户能够与软件进行交互。 - **源码**:指的是构成程序的原始代码,通常由开发人员编写,可以是C/C++、Pascal等语言的代码。 - **资源**:通常指在软件开发中使用的非代码元素,如图像、声音、字符串等资源文件。 ### 压缩包子文件的文件名称列表 从给定的文件名称列表来看,我们只有一个文件名:“Crypt32.pas”。文件扩展名“.pas”表明这个文件是用Pascal语言编写的源代码文件。Pascal是一种较老的编程语言,它强调可读性和结构化编程。在Windows编程中,Pascal常用于早期的Delphi或Turbo Pascal开发环境。 ### Pascal语言与加密 Pascal语言由于其清晰的结构,有时候被用来实现一些算法,如加密算法。尽管现代加密实现更常见于如C/C++、Python等其他语言,但是Pascal版本的加密库也存在。考虑到文件名“Crypt32.pas”,我们可以推测这是一个加密相关的源代码文件,可能是加密构件的实现,或者至少是相关功能的一部分。 ### 关键知识点总结 - 加解密构件在软件开发中扮演着关键角色,负责数据的加密与解密工作,保障数据传输和存储的安全。 - 32位描述在加密中可以指密钥长度或数据位宽,具体含义需要结合上下文来分析。 - 不可视构件通常用于软件后台,不直接与用户交互,而控件则主要负责提供界面和交互功能。 - 源码是实现软件功能的核心,而资源文件是软件开发过程中需要的各种非代码元素。 - Pascal作为编程语言,虽然不如现代语言流行,但在某些特定领域或老旧系统中仍有应用,特别是在教育和一些遗留系统中。 - “Crypt32.pas”暗示了Pascal代码实现的加密库或加密算法实现的可能性,这在现代软件开发中相对罕见。 综合以上信息,我们可以推测“CRYPT32”标题下可能描述的是一个用于Windows环境的加密构件,用Pascal语言编写,可能用于特定的安全处理任务,比如使用32位密钥进行数据的加解密操作。这样的构件可能会嵌入到软件中以保护数据安全,但需要开发者具有相应的Pascal编程能力和对加密技术的理解。

相关推荐

filetype

PS F:\西南石油大学\大四下\毕设\项目\dy数据分析系统项目文件\基于大数据的dy数据分析系统> pip install mysqlclient Collecting mysqlclient Downloading mysqlclient-2.2.7.tar.gz (91 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Building wheels for collected packages: mysqlclient Building wheel for mysqlclient (pyproject.toml) ... error error: subprocess-exited-with-error × Building wheel for mysqlclient (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [37 lines of output] # Options for building extension module: library_dirs: ['C:/mariadb-connector\\lib\\mariadb', 'C:/mariadb-connector\\lib'] libraries: ['kernel32', 'advapi32', 'wsock32', 'shlwapi', 'Ws2_32', 'crypt32', 'secur32', 'bcrypt', 'mariadbclient'] extra_link_args: ['/MANIFEST'] include_dirs: ['C:/mariadb-connector\\include\\mariadb', 'C:/mariadb-connector\\include\\mysql', 'C:/mariadb-connector\\include'] extra_objects: [] define_macros: [('version_info', (2, 2, 7, 'final', 0)), ('__version__', '2.2.7')] running bdist_wheel running build running build_py creating build\lib.win-amd64-cpython-38\MySQLdb copying src\MySQLdb\connections.py -> build\lib.win-amd64-cpython-38\MySQLdb copying src\MySQLdb\converters.py -> build\lib.win-amd64-cpython-38\MySQLdb copying src\MySQLdb\cursors.py -> build\lib.win-amd64-cpython-38\MySQLdb copying src\MySQLdb\release.py -> build\lib.win-amd64-cpython-38\MySQLdb copying src\MySQLdb\times.py -> build\lib.win-amd64-cpython-38\MySQLdb copying src\MySQLdb\_exceptions.py -> build\lib.win-amd64-cpython-38\MySQLdb copying src\MySQLdb\__init__.py -> build\lib.win-amd64-cpython-38\MySQLdb creating build\lib.win-amd64-cpython-38\MySQLdb\constants copying src\MySQLdb\constants\CLIENT.py -> build\lib.win-amd64-cpython-38\MySQLdb\constants copying src\MySQLdb\constants\CR.py

filetype

#include "pch.h" #include <Windows.h> #include <Wbemidl.h> #include <comdef.h> #include <WinCrypt.h> #include <string> #include <algorithm> #include <sstream> #include <vector> #pragma comment(lib, "wbemuuid.lib") #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "Crypt32.lib") // 导出函数声明 extern "C" __declspec(dllexport) const char* GetMachineCode(); extern "C" __declspec(dllexport) const char* ComputeRegistration(const char* machineCode, int daysChoice); extern "C" __declspec(dllexport) BOOL SaveRegistration(const char* machineCode, const char* regCode, int daysChoice); extern "C" __declspec(dllexport) int ValidateLicense(); // 全局缓冲区用于返回字符串 thread_local static char g_buffer[256] = { 0 }; // 获取机器码函数 const char* GetMachineCode() { HRESULT hres; std::string serials; // 初始化COM hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { strcpy_s(g_buffer, "COM Init Failed"); return g_buffer; } // 设置安全级别 hres = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); if (FAILED(hres)) { CoUninitialize(); strcpy_s(g_buffer, "Security Init Failed"); return g_buffer; } // 创建WMI实例 IWbemLocator* pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc ); if (FAILED(hres)) { CoUninitialize(); strcpy_s(g_buffer, "WMI Locator Failed"); return g_buffer; } // 连接WMI IWbemServices* pSvc = NULL; hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc ); if (FAILED(hres)) { pLoc->Release(); CoUninitialize(); strcpy_s(g_buffer, "WMI Connect Failed"); return g_buffer; } // 设置代理安全 hres = CoSetProxyBlanket( pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); strcpy_s(g_buffer, "Proxy Setup Failed"); return g_buffer; } // 执行查询 IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT SerialNumber FROM Win32_DiskDrive"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); strcpy_s(g_buffer, "Query Failed"); return g_buffer; } // 处理查询结果 IWbemClassObject* pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (uReturn == 0) break; VARIANT vtProp; VariantInit(&vtProp); // 获取序列号 hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR) { _bstr_t bstr(vtProp.bstrVal); serials += (const char*)bstr; } VariantClear(&vtProp); pclsObj->Release(); } // 清理资源 pEnumerator->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); // 计算MD5哈希 HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; BYTE rgbHash[16]; DWORD cbHash = 16; CHAR rgbDigits[] = "0123456789abcdef"; if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { strcpy_s(g_buffer, "Crypto Context Failed"); return g_buffer; } if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { CryptReleaseContext(hProv, 0); strcpy_s(g_buffer, "Hash Creation Failed"); return g_buffer; } if (!CryptHashData(hHash, (BYTE*)serials.c_str(), (DWORD)serials.length(), 0)) { CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); strcpy_s(g_buffer, "Hashing Failed"); return g_buffer; } if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) { std::string hashStr; for (DWORD i = 0; i < cbHash; i++) { char hex[3]; sprintf_s(hex, "%02x", rgbHash[i]); hashStr += hex; } strcpy_s(g_buffer, hashStr.c_str()); } else { strcpy_s(g_buffer, "Hash Retrieval Failed"); } CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return g_buffer; } // 计算注册码 const char* ComputeRegistration(const char* machineCode, int daysChoice) { int days; switch (daysChoice) { case 0: days = 7; break; case 1: days = 15; break; case 2: days = 30; break; default: days = 9999; // 永久 } std::string mc(machineCode); if (mc.length() < 5) { strcpy_s(g_buffer, "Invalid Machine Code"); return g_buffer; } // 算法:前4字符 + (第5字符ASCII+天数) + 反转字符前4 + 天数*100 std::string part1 = mc.substr(0, 4); char c = mc[4]; std::string part2 = std::to_string(static_cast<int>(c) + days); std::string reversed = mc; std::reverse(reversed.begin(), reversed.end()); std::string part3 = reversed.substr(0, 4); std::string part4 = std::to_string(days * 100); std::string regCode = part1 + part2 + part3 + part4; strcpy_s(g_buffer, regCode.c_str()); return g_buffer; } // 保存注册信息 BOOL SaveRegistration(const char* machineCode, const char* regCode, int daysChoice) { HKEY hKey; std::string subkey = "Software\\MyPlugin\\"; subkey += machineCode; // 创建注册表项 if (RegCreateKeyExA( HKEY_CURRENT_USER, subkey.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) { return FALSE; } // 写入注册码 if (RegSetValueExA( hKey, "Registration", 0, REG_SZ, (const BYTE*)regCode, (DWORD)strlen(regCode) + 1) != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } // 写入天数选项 std::string daysStr = std::to_string(daysChoice); if (RegSetValueExA( hKey, "ExpireDays", 0, REG_SZ, (const BYTE*)daysStr.c_str(), (DWORD)daysStr.length() + 1) != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } // 写入注册日期 (使用系统时间) SYSTEMTIME st; GetLocalTime(&st); char dateStr[32]; sprintf_s(dateStr, "%04d%02d%02d%02d%02d%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); if (RegSetValueExA( hKey, "RegisterDate", 0, REG_SZ, (const BYTE*)dateStr, (DWORD)strlen(dateStr) + 1) != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } RegCloseKey(hKey); return TRUE; } // 验证授权 int ValidateLicense() { const char* machineCode = GetMachineCode(); if (!machineCode || strlen(machineCode) == 0) { return 0; // 获取机器码失败 } std::string subkey = "Software\\MyPlugin\\"; subkey += machineCode; HKEY hKey; if (RegOpenKeyExA( HKEY_CURRENT_USER, subkey.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS) { return -1; // 未注册 } // 读取注册信息 char regDate[32] = { 0 }; DWORD size = sizeof(regDate); if (RegQueryValueExA( hKey, "RegisterDate", NULL, NULL, (LPBYTE)regDate, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } char daysChoice[10] = { 0 }; size = sizeof(daysChoice); if (RegQueryValueExA( hKey, "ExpireDays", NULL, NULL, (LPBYTE)daysChoice, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } RegCloseKey(hKey); // 解析注册日期 int year, month, day, hour, min, sec; if (sscanf_s(regDate, "%4d%2d%2d%2d%2d%2d", &year, &month, &day, &hour, &min, &sec) != 6) { return -1; } // 计算已过天数 SYSTEMTIME regTime = { 0 }; regTime.wYear = year; regTime.wMonth = month; regTime.wDay = day; FILETIME ftReg, ftNow; SystemTimeToFileTime(®Time, &ftReg); GetSystemTimeAsFileTime(&ftNow); ULARGE_INTEGER ulReg, ulNow; ulReg.LowPart = ftReg.dwLowDateTime; ulReg.HighPart = ftReg.dwHighDateTime; ulNow.LowPart = ftNow.dwLowDateTime; ulNow.HighPart = ftNow.dwHighDateTime; ULONGLONG diff = ulNow.QuadPart - ulReg.QuadPart; int daysPassed = static_cast<int>(diff / (10000000ULL * 60 * 60 * 24)); // 检查授权状态 int choice = atoi(daysChoice); if (choice == 3) return 1; // 永久授权 int maxDays = 0; switch (choice) { case 0: maxDays = 7; break; case 1: maxDays = 15; break; case 2: maxDays = 30; break; default: return 0; } return (daysPassed <= maxDays) ? 1 : 0; } 运行测试

filetype

#include <Windows.h> #include <Wbemidl.h> #include <comdef.h> #include <WinCrypt.h> #include <string> #include <algorithm> #include <sstream> #include <vector> #include <commctrl.h> #include <iomanip> // 添加缺失的头文件 #pragma comment(lib, "wbemuuid.lib") #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "Crypt32.lib") #pragma comment(lib, "comctl32.lib") // 资源ID定义 #define IDD_MAIN_DIALOG 101 // 添加缺失的定义 #define IDC_MACHINE_CODE 1001 #define IDC_DAYS_COMBO 1002 #define IDC_REG_CODE 1003 #define IDC_GENERATE_BTN 1004 #define IDC_REGISTER_BTN 1005 #define IDC_STATUS_TEXT 1006 #define IDC_VALIDATE_BTN 1007 // 全局变量 HWND g_hMainDlg = NULL; char g_szMachineCode[256] = { 0 }; // 函数声明 const char* GetMachineCode(); const char* ComputeRegistration(const char* machineCode, int daysChoice); BOOL SaveRegistration(const char* machineCode, const char* regCode, int daysChoice); int ValidateLicense(); void UpdateStatus(const char* message); void InitializeControls(HWND hDlg); void GenerateRegistrationCode(HWND hDlg); void RegisterProduct(HWND hDlg); void ValidateLicenseOnStartup(); // 获取机器码函数 const char* GetMachineCode() { if (g_szMachineCode[0] != '\0') { return g_szMachineCode; } HRESULT hres; std::string serials; // 初始化COM hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { return "COM Init Failed"; } // 设置COM安全级别 hres = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); if (FAILED(hres)) { CoUninitialize(); return "CoInitializeSecurity Failed"; } // 创建WMI实例 IWbemLocator* pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc ); if (FAILED(hres)) { CoUninitialize(); return "WbemLocator Failed"; } // 连接到WMI IWbemServices* pSvc = NULL; hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc ); if (FAILED(hres)) { pLoc->Release(); CoUninitialize(); return "ConnectServer Failed"; } // 设置代理安全级别 hres = CoSetProxyBlanket( pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return "SetProxyBlanket Failed"; } // 查询CPU信息 IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if (SUCCEEDED(hres)) { IWbemClassObject* pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) break; VARIANT vtProp; hr = pclsObj->Get(L"ProcessorId", 0, &vtProp, 0, 0); if (SUCCEEDED(hr)) { serials += _bstr_t(vtProp.bstrVal); VariantClear(&vtProp); } pclsObj->Release(); } pEnumerator->Release(); } // 查询磁盘信息 hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_DiskDrive"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if (SUCCEEDED(hres)) { IWbemClassObject* pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) break; VARIANT vtProp; hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); if (SUCCEEDED(hr)) { serials += _bstr_t(vtProp.bstrVal); VariantClear(&vtProp); } pclsObj->Release(); } pEnumerator->Release(); } // 清理资源 pSvc->Release(); pLoc->Release(); CoUninitialize(); // 生成哈希值 HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; BYTE rgbHash[16]; DWORD cbHash = 16; CHAR rgbDigits[] = "0123456789abcdef"; if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { return "CryptoContext Failed"; } if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { CryptReleaseContext(hProv, 0); return "CreateHash Failed"; } if (!CryptHashData(hHash, (BYTE*)serials.c_str(), (DWORD)serials.length(), 0)) { CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return "HashData Failed"; } if (!CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) { CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return "GetHashParam Failed"; } std::string hashStr; for (DWORD i = 0; i < cbHash; i++) { char rgb[3]; sprintf_s(rgb, 3, "%c%c", rgbDigits[rgbHash[i] >> 4], rgbDigits[rgbHash[i] & 0xf]); hashStr += rgb; } // 修正strcpy_s调用 strcpy_s(g_szMachineCode, sizeof(g_szMachineCode), hashStr.c_str()); return g_szMachineCode; } // 计算注册码函数 const char* ComputeRegistration(const char* machineCode, int daysChoice) { static char regBuffer[256] = { 0 }; std::string input = machineCode; std::string regCode; // 简单转换算法(实际应使用加密算法) for (char c : input) { regCode += (c + daysChoice) ^ 0xAA; } // 修正strcpy_s调用 strcpy_s(regBuffer, sizeof(regBuffer), regCode.c_str()); return regBuffer; } // 保存注册信息函数 BOOL SaveRegistration(const char* machineCode, const char* regCode, int daysChoice) { HKEY hKey; LPCSTR subKey = "Software\\MyApp\\Registration"; // 创建注册表项 if (RegCreateKeyExA(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) { return FALSE; } // 保存机器码 RegSetValueExA(hKey, "MachineCode", 0, REG_SZ, (const BYTE*)machineCode, (DWORD)strlen(machineCode) + 1); // 保存注册码 RegSetValueExA(hKey, "RegCode", 0, REG_SZ, (const BYTE*)regCode, (DWORD)strlen(regCode) + 1); // 保存授权天数 DWORD days = 0; switch (daysChoice) { case 0: days = 7; break; case 1: days = 15; break; case 2: days = 30; break; case 3: days = 0xFFFFFFFF; // 永久 } RegSetValueExA(hKey, "Days", 0, REG_DWORD, (const BYTE*)&days, sizeof(days)); // 保存激活日期 SYSTEMTIME st; GetSystemTime(&st); FILETIME ft; SystemTimeToFileTime(&st, &ft); RegSetValueExA(hKey, "ActivationDate", 0, REG_QWORD, (const BYTE*)&ft, sizeof(ft)); RegCloseKey(hKey); return TRUE; } // 验证授权函数 int ValidateLicense() { HKEY hKey; LPCSTR subKey = "Software\\MyApp\\Registration"; if (RegOpenKeyExA(HKEY_CURRENT_USER, subKey, 0, KEY_READ, &hKey) != ERROR_SUCCESS) { return -1; // 未注册 } // 检查机器码是否匹配 char storedMachineCode[256] = { 0 }; DWORD size = sizeof(storedMachineCode); if (RegQueryValueExA(hKey, "MachineCode", NULL, NULL, (LPBYTE)storedMachineCode, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } if (strcmp(storedMachineCode, GetMachineCode()) != 0) { RegCloseKey(hKey); return -1; // 机器码不匹配 } // 检查授权天数 DWORD days = 0; size = sizeof(days); if (RegQueryValueExA(hKey, "Days", NULL, NULL, (LPBYTE)&days, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } // 永久授权 if (days == 0xFFFFFFFF) { RegCloseKey(hKey); return 1; } // 检查激活日期 FILETIME activationDate; size = sizeof(activationDate); if (RegQueryValueExA(hKey, "ActivationDate", NULL, NULL, (LPBYTE)&activationDate, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } // 计算已过天数 SYSTEMTIME stNow; FILETIME ftNow; GetSystemTime(&stNow); SystemTimeToFileTime(&stNow, &ftNow); ULARGE_INTEGER uAct, uNow; uAct.LowPart = activationDate.dwLowDateTime; uAct.HighPart = activationDate.dwHighDateTime; uNow.LowPart = ftNow.dwLowDateTime; uNow.HighPart = ftNow.dwHighDateTime; // 100纳秒 = 1 tick, 1天 = 864000000000 ticks ULONGLONG diff = (uNow.QuadPart - uAct.QuadPart) / 864000000000; RegCloseKey(hKey); return (diff <= days) ? 1 : 0; // 1=有效, 0=过期 } // 对话框消息处理 INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: g_hMainDlg = hDlg; InitializeControls(hDlg); ValidateLicenseOnStartup(); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_GENERATE_BTN: GenerateRegistrationCode(hDlg); break; case IDC_REGISTER_BTN: RegisterProduct(hDlg); break; case IDC_VALIDATE_BTN: ValidateLicenseOnStartup(); break; case IDCANCEL: EndDialog(hDlg, 0); return TRUE; } break; } return FALSE; } // 初始化控件 void InitializeControls(HWND hDlg) { // 设置字体 HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Arial"); // 获取机器码并显示 const char* mc = GetMachineCode(); SetDlgItemTextA(hDlg, IDC_MACHINE_CODE, mc); // 设置控件字体 HWND hWnd = GetDlgItem(hDlg, IDC_MACHINE_CODE); SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, TRUE); hWnd = GetDlgItem(hDlg, IDC_REG_CODE); SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, TRUE); // 初始化授权天数下拉框 HWND hCombo = GetDlgItem(hDlg, IDC_DAYS_COMBO); SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)L"7天试用"); SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)L"15天试用"); SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)L"30天正式版"); SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)L"永久授权"); SendMessage(hCombo, CB_SETCURSEL, 3, 0); // 默认选择永久授权 // 设置状态文本 UpdateStatus("请选择授权类型并生成注册码"); } // 生成注册码 void GenerateRegistrationCode(HWND hDlg) { // 获取选择的授权天数 HWND hCombo = GetDlgItem(hDlg, IDC_DAYS_COMBO); int daysChoice = (int)SendMessage(hCombo, CB_GETCURSEL, 0, 0); // 计算注册码 const char* mc = GetMachineCode(); const char* regCode = ComputeRegistration(mc, daysChoice); // 显示注册码 SetDlgItemTextA(hDlg, IDC_REG_CODE, regCode); UpdateStatus("注册码已生成,点击注册按钮完成激活"); } // 注册产品 void RegisterProduct(HWND hDlg) { // 获取选择的授权天数 HWND hCombo = GetDlgItem(hDlg, IDC_DAYS_COMBO); int daysChoice = (int)SendMessage(hCombo, CB_GETCURSEL, 0, 0); // 获取注册码 char regCode[256] = { 0 }; GetDlgItemTextA(hDlg, IDC_REG_CODE, regCode, sizeof(regCode)); // 保存注册信息 const char* mc = GetMachineCode(); if (SaveRegistration(mc, regCode, daysChoice)) { UpdateStatus("产品注册成功!"); MessageBoxA(hDlg, "产品激活成功!", "注册成功", MB_OK | MB_ICONINFORMATION); } else { UpdateStatus("注册失败,请重试"); MessageBoxA(hDlg, "注册失败,请检查系统权限", "错误", MB_OK | MB_ICONERROR); } } // 验证授权 void ValidateLicenseOnStartup() { int status = ValidateLicense(); switch (status) { case 1: UpdateStatus("授权状态: 已激活 (有效授权)"); break; case 0: UpdateStatus("授权状态: 已过期 (请重新注册)"); break; case -1: UpdateStatus("授权状态: 未注册 (请激活产品)"); break; default: UpdateStatus("授权状态: 未知错误"); } } // 更新状态文本 void UpdateStatus(const char* message) { SetDlgItemTextA(g_hMainDlg, IDC_STATUS_TEXT, message); } // 主程序入口 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 初始化COM if (FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE))) { MessageBoxA(NULL, "COM初始化失败", "错误", MB_OK | MB_ICONERROR); return 1; } // 初始化通用控件 INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&icc); // 创建对话框 DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAIN_DIALOG), NULL, DialogProc, 0); // 清理COM CoUninitialize(); return 0; } [NK201!无法解析的外部符号 main,函数 "int cdecl invoke main(void)"(?invoke main@@YAHXZ)中引用了该符号 LNK112(1 个无法解析的外部命令

普通网友
  • 粉丝: 881
上传资源 快速赚钱