Authorization.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. #include "Authorization.h"
  2. #include "Logger.h"
  3. #include "Utils.h"
  4. #include <windows.h>
  5. #include <winioctl.h>
  6. #include <iphlpapi.h>
  7. #include <iostream>
  8. #include <fstream>
  9. #include <sstream>
  10. #include <iomanip>
  11. #include <vector>
  12. #include <ctime>
  13. #include "cryptopp/cryptlib.h"
  14. #include "cryptopp/sha.h"
  15. #include "cryptopp/hex.h"
  16. #include "cryptopp/base64.h"
  17. #include "cryptopp/files.h"
  18. #include "cryptopp/aes.h"
  19. #include "cryptopp/modes.h"
  20. #ifdef _WIN64// 是 64 位 Windows
  21. #ifdef _DEBUG
  22. #pragma comment(lib, "cryptopp/x64/Debug/cryptlib.lib")
  23. #else
  24. #pragma comment(lib, "cryptopp/x64/Release/cryptlib.lib")
  25. #endif
  26. #else
  27. #ifdef _DEBUG// 是 32 位 Windows
  28. #pragma comment(lib, "cryptopp/Win32/Debug/cryptlib.lib")
  29. #else
  30. #pragma comment(lib, "cryptopp/Win32/Release/cryptlib.lib")
  31. #endif
  32. #endif
  33. #pragma comment(lib, "Iphlpapi.lib")
  34. // 简单的加密密钥(实际应用中应该更安全)
  35. const std::string ENCRYPTION_KEY = "CommModifyServiceKey12345";
  36. bool Authorization::IsAuthorized()
  37. {
  38. // 获取可执行文件目录并构建完整路径
  39. std::string exeDir = Utils::GetExecutableDirectory();
  40. std::string licensePath = exeDir + "\\license.dat";
  41. // 检查授权文件是否存在
  42. std::ifstream licenseFile(licensePath);
  43. if (!licenseFile.is_open())
  44. {
  45. LOG_WARNING("License file not found");
  46. // 生成授权码文件
  47. std::string machineCode = GetMachineCode();
  48. if (!GenerateAuthorizationCodeFile(machineCode))
  49. {
  50. LOG_ERROR("Failed to generate authorization code file");
  51. }
  52. return false;
  53. }
  54. // 读取授权文件内容
  55. std::stringstream buffer;
  56. buffer << licenseFile.rdbuf();
  57. std::string encryptedData = buffer.str();
  58. licenseFile.close();
  59. // 验证授权文件
  60. return VerifyLicenseFile(licensePath);
  61. }
  62. bool Authorization::GenerateAuthorizationCodeFile(const std::string &machineCode)
  63. {
  64. try
  65. {
  66. // 获取可执行文件目录并构建完整路径
  67. std::string exeDir = Utils::GetExecutableDirectory();
  68. std::string filePath = exeDir + "\\auth_code.dat";
  69. std::ofstream codeFile(filePath);
  70. if (!codeFile.is_open())
  71. {
  72. LOG_ERROR("Failed to create authorization code file");
  73. return false;
  74. }
  75. // 写入机器码到授权码文件
  76. codeFile << machineCode;
  77. codeFile.close();
  78. LOG_INFO("Authorization code file generated successfully");
  79. return true;
  80. }
  81. catch (const std::exception &e)
  82. {
  83. LOG_ERROR("Error generating authorization code file: " + std::string(e.what()));
  84. return false;
  85. }
  86. }
  87. std::string Authorization::GetMachineCode()
  88. {
  89. std::string cpuId = GetCPUID();
  90. std::string diskSerial = GetHardDiskSerial();
  91. std::string macAddress = GetMACAddress();
  92. // 组合所有硬件信息
  93. std::string hardwareInfo = cpuId + diskSerial + macAddress;
  94. // 使用SHA256生成机器码
  95. CryptoPP::SHA256 sha256;
  96. std::string hash;
  97. CryptoPP::StringSource ss(hardwareInfo, true,
  98. new CryptoPP::HashFilter(sha256,
  99. new CryptoPP::HexEncoder(
  100. new CryptoPP::StringSink(hash))));
  101. return hash;
  102. }
  103. std::string Authorization::GetCPUID()
  104. {
  105. int cpuInfo[4] = {0};
  106. __cpuid(cpuInfo, 0);
  107. std::stringstream ss;
  108. ss << std::hex << std::uppercase << std::setfill('0');
  109. for (int i = 0; i < 4; i++)
  110. {
  111. ss << std::setw(8) << cpuInfo[i];
  112. }
  113. return ss.str();
  114. }
  115. std::string Authorization::GetHardDiskSerial()
  116. {
  117. HANDLE hDevice = CreateFileA("\\\\.\\PhysicalDrive0", 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
  118. NULL, OPEN_EXISTING, 0, NULL);
  119. if (hDevice == INVALID_HANDLE_VALUE)
  120. {
  121. return "UNKNOWN";
  122. }
  123. STORAGE_PROPERTY_QUERY query = {};
  124. query.PropertyId = StorageDeviceProperty;
  125. query.QueryType = PropertyStandardQuery;
  126. STORAGE_DESCRIPTOR_HEADER header = {};
  127. DWORD bytesReturned = 0;
  128. if (!DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query),
  129. &header, sizeof(header), &bytesReturned, NULL))
  130. {
  131. CloseHandle(hDevice);
  132. return "UNKNOWN";
  133. }
  134. std::vector<BYTE> buffer(header.Size);
  135. STORAGE_DEVICE_DESCRIPTOR *deviceDescriptor = reinterpret_cast<STORAGE_DEVICE_DESCRIPTOR *>(buffer.data());
  136. if (!DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query),
  137. buffer.data(), header.Size, &bytesReturned, NULL))
  138. {
  139. CloseHandle(hDevice);
  140. return "UNKNOWN";
  141. }
  142. CloseHandle(hDevice);
  143. if (deviceDescriptor->SerialNumberOffset == 0)
  144. {
  145. return "UNKNOWN";
  146. }
  147. std::string serialNumber(reinterpret_cast<char *>(buffer.data() + deviceDescriptor->SerialNumberOffset));
  148. return serialNumber;
  149. }
  150. std::string Authorization::GetMACAddress()
  151. {
  152. PIP_ADAPTER_INFO adapterInfo;
  153. ULONG bufferSize = sizeof(IP_ADAPTER_INFO);
  154. adapterInfo = (IP_ADAPTER_INFO *)malloc(bufferSize);
  155. if (GetAdaptersInfo(adapterInfo, &bufferSize) == ERROR_BUFFER_OVERFLOW)
  156. {
  157. free(adapterInfo);
  158. adapterInfo = (IP_ADAPTER_INFO *)malloc(bufferSize);
  159. }
  160. if (GetAdaptersInfo(adapterInfo, &bufferSize) == NO_ERROR)
  161. {
  162. std::stringstream ss;
  163. ss << std::hex << std::uppercase << std::setfill('0');
  164. for (int i = 0; i < adapterInfo->AddressLength; i++)
  165. {
  166. if (i > 0)
  167. ss << "-";
  168. ss << std::setw(2) << static_cast<int>(adapterInfo->Address[i]);
  169. }
  170. free(adapterInfo);
  171. return ss.str();
  172. }
  173. free(adapterInfo);
  174. return "UNKNOWN";
  175. }
  176. bool Authorization::VerifyLicenseFile(const std::string &licenseFile)
  177. {
  178. try
  179. {
  180. std::ifstream file(licenseFile, std::ios::binary);
  181. if (!file.is_open())
  182. {
  183. return false;
  184. }
  185. std::stringstream buffer;
  186. buffer << file.rdbuf();
  187. std::string encryptedData = buffer.str();
  188. file.close();
  189. // 解密授权文件
  190. std::string decryptedData = DecryptLicense(encryptedData);
  191. // 检查解密后的数据是否包含当前机器码
  192. std::string currentMachineCode = GetMachineCode();
  193. if (decryptedData.find(currentMachineCode) == std::string::npos)
  194. {
  195. return false;
  196. }
  197. // 检查授权是否过期
  198. // 查找Expiration行
  199. size_t expirationPos = decryptedData.find("Expiration: ");
  200. if (expirationPos == std::string::npos)
  201. {
  202. // 如果没有找到Expiration行,则认为授权永不过期
  203. return true;
  204. }
  205. // 提取过期日期
  206. size_t dateStart = expirationPos + 12; // "Expiration: "的长度
  207. size_t dateEnd = decryptedData.find('\n', dateStart);
  208. if (dateEnd == std::string::npos)
  209. {
  210. dateEnd = decryptedData.length();
  211. }
  212. std::string expirationDate = decryptedData.substr(dateStart, dateEnd - dateStart);
  213. // 获取当前日期
  214. time_t t = time(0);
  215. struct tm now;
  216. localtime_s(&now, &t);
  217. char currentDateStr[11];
  218. strftime(currentDateStr, sizeof(currentDateStr), "%Y-%m-%d", &now);
  219. std::string currentDate(currentDateStr);
  220. // 比较日期
  221. if (currentDate >= expirationDate)
  222. {
  223. LOG_WARNING("License has expired");
  224. return false;
  225. }
  226. return true;
  227. }
  228. catch (const std::exception &e)
  229. {
  230. LOG_ERROR("Error verifying license file: " + std::string(e.what()));
  231. return false;
  232. }
  233. }
  234. std::string Authorization::DecryptLicense(const std::string &encryptedData)
  235. {
  236. try
  237. {
  238. // 使用Base64解码
  239. std::string decoded;
  240. CryptoPP::StringSource ss(encryptedData, true,
  241. new CryptoPP::Base64Decoder(
  242. new CryptoPP::StringSink(decoded)));
  243. // 使用AES解密
  244. CryptoPP::AES::Decryption aesDecryption((CryptoPP::byte *)ENCRYPTION_KEY.data(), 16);
  245. CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, (CryptoPP::byte *)ENCRYPTION_KEY.data());
  246. std::string decrypted;
  247. CryptoPP::StringSource ss2(decoded, true,
  248. new CryptoPP::StreamTransformationFilter(cbcDecryption,
  249. new CryptoPP::StringSink(decrypted)));
  250. return decrypted;
  251. }
  252. catch (const std::exception &e)
  253. {
  254. LOG_ERROR("Error decrypting license: " + std::string(e.what()));
  255. return "";
  256. }
  257. }
  258. std::string Authorization::EncryptData(const std::string &data)
  259. {
  260. try
  261. {
  262. // 使用AES加密
  263. CryptoPP::AES::Encryption aesEncryption((CryptoPP::byte *)ENCRYPTION_KEY.data(), 16);
  264. CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, (CryptoPP::byte *)ENCRYPTION_KEY.data());
  265. std::string encrypted;
  266. CryptoPP::StringSource ss(data, true,
  267. new CryptoPP::StreamTransformationFilter(cbcEncryption,
  268. new CryptoPP::Base64Encoder(
  269. new CryptoPP::StringSink(encrypted))));
  270. return encrypted;
  271. }
  272. catch (const std::exception &e)
  273. {
  274. LOG_ERROR("Error encrypting data: " + std::string(e.what()));
  275. return "";
  276. }
  277. }