这几天在弄软件注册码的问题。发现windows自带一个很好用的命令行工具wmic,可以查询各种设备的序列号。
https://blog.csdn.net/discover2210212455/article/details/82711930
https://blog.csdn.net/u012156872/article/details/103733290
有了这个,代码量可以少很多。
参考:
https://www.52pojie.cn/thread-744248-1-1.html?fallback=1
https://bbs.csdn.net/topics/392161316
在获取主板ID时,最好使用:
wmic csproduct get uuid
加一个哈希值的计算方式
https://www.cnblogs.com/anjou/archive/2008/12/31/1366011.html
我修改成了用string类型的:
// 计算Hash,成功返回0,失败返回GetLastError()
// CONST BYTE *pbData, // 输入数据
// DWORD dwDataLen, // 输入数据字节长度
// ALG_ID algId // Hash 算法:CALG_MD5,CALG_SHA
// string* outStr, // 输出16进制Hash字符串,MD5长度为32+1, SHA长度为40+1
//
DWORD GetHash(CONST BYTE *pbData, DWORD dwDataLen, ALG_ID algId, string* outStr)
{
DWORD dwReturn = 0;
HCRYPTPROV hProv;
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
return (dwReturn = GetLastError());
HCRYPTHASH hHash;
//Alg Id:CALG_MD5,CALG_SHA
if (!CryptCreateHash(hProv, algId, 0, 0, &hHash))
{
dwReturn = GetLastError();
CryptReleaseContext(hProv, 0);
return dwReturn;
}
if (!CryptHashData(hHash, pbData, dwDataLen, 0))
{
dwReturn = GetLastError();
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
return dwReturn;
}
DWORD dwSize;
DWORD dwLen = sizeof(dwSize);
CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)(&dwSize), &dwLen, 0);
BYTE* pHash = new BYTE[dwSize];
dwLen = dwSize;
CryptGetHashParam(hHash, HP_HASHVAL, pHash, &dwLen, 0);
for (DWORD i = 0; i < dwLen; ++i)
{
char strTemp[3] = { 0 };
sprintf_s(strTemp, "%02X", pHash[i]);
*outStr += strTemp;
}
delete[] pHash;
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
return dwReturn;
}
//用法
string hwID = "123";
printf("hwID:%s\r\n", hwID.data());
string hashStr;
GetHash((BYTE*)hwID.data(), hwID.length(), CALG_MD5, &hashStr);