首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从c/c ++中的Windows PC获取独特的硬件/软件签名

从C/C++中的Windows PC获取独特的硬件/软件签名,可以通过以下方法实现:

  1. 获取硬件签名:

硬件签名是基于计算机的硬件信息生成的,可以通过以下方法获取:

  • CPU ID:获取CPU的序列号,可以使用第三方库如OpenHardwareMonitor或自己编写代码获取。
  • 主板序列号:获取主板的序列号,可以使用WMI(Windows Management Instrumentation)查询Win32_BaseBoard类获取。
  • 硬盘序列号:获取硬盘的序列号,可以使用WMI查询Win32_DiskDrive类获取。
  1. 获取软件签名:

软件签名是基于软件的版本信息生成的,可以通过以下方法获取:

  • 操作系统版本:获取Windows操作系统的版本号,可以使用GetVersionEx或IsWindows*系列API获取。
  • 系统时间:获取系统当前时间,可以使用GetSystemTime或GetLocalTime API获取。
  • 软件版本:获取软件的版本号,可以在程序中定义一个版本号常量或从资源文件中获取。
  1. 生成签名:

将获取到的硬件和软件信息组合起来,可以使用哈希算法如SHA-256生成一个唯一的签名。

示例代码:

代码语言:c++
复制

#include<Windows.h>

#include <Wbemidl.h>

#include <comdef.h>

#include<iostream>

#include <sstream>

#include <iomanip>

#include<openssl/sha.h>

// 获取CPU ID

std::string GetCPUID()

{

代码语言:txt
复制
std::stringstream ss;
代码语言:txt
复制
int CPUInfo[4] = { -1 };
代码语言:txt
复制
unsigned int nExIds, i = 0;
代码语言:txt
复制
char CPUBrandString[0x40];
代码语言:txt
复制
__cpuid(CPUInfo, 0x80000000);
代码语言:txt
复制
nExIds = CPUInfo[0];
代码语言:txt
复制
for (i = 0x80000000; i <= nExIds; ++i)
代码语言:txt
复制
{
代码语言:txt
复制
    __cpuid(CPUInfo, i);
代码语言:txt
复制
    if (i == 0x80000002)
代码语言:txt
复制
    {
代码语言:txt
复制
        memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
代码语言:txt
复制
        ss<< CPUBrandString;
代码语言:txt
复制
    }
代码语言:txt
复制
    else if (i == 0x80000003)
代码语言:txt
复制
    {
代码语言:txt
复制
        memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
代码语言:txt
复制
        ss<< CPUBrandString;
代码语言:txt
复制
    }
代码语言:txt
复制
    else if (i == 0x80000004)
代码语言:txt
复制
    {
代码语言:txt
复制
        memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
代码语言:txt
复制
        ss<< CPUBrandString;
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
return ss.str();

}

// 获取硬盘序列号

std::string GetDiskSerialNumber()

{

代码语言:txt
复制
std::stringstream ss;
代码语言:txt
复制
HRESULT hres;
代码语言:txt
复制
VARIANT vtProp;
代码语言:txt
复制
CoInitialize(NULL);
代码语言:txt
复制
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
代码语言:txt
复制
if (FAILED(hres))
代码语言:txt
复制
    return "";
代码语言:txt
复制
hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
代码语言:txt
复制
if (FAILED(hres))
代码语言:txt
复制
    return "";
代码语言:txt
复制
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);
代码语言:txt
复制
if (FAILED(hres))
代码语言:txt
复制
    return "";
代码语言:txt
复制
hres = pSvc->ExecQuery(_bstr_t("WQL"), _bstr_t("SELECT * FROM Win32_DiskDrive"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
代码语言:txt
复制
if (FAILED(hres))
代码语言:txt
复制
    return "";
代码语言:txt
复制
while (pEnumerator)
代码语言:txt
复制
{
代码语言:txt
复制
    hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
代码语言:txt
复制
    if (FAILED(hres))
代码语言:txt
复制
        break;
代码语言:txt
复制
    hres = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
代码语言:txt
复制
    if (FAILED(hres))
代码语言:txt
复制
        continue;
代码语言:txt
复制
    if (vtProp.vt == VT_BSTR)
代码语言:txt
复制
    {
代码语言:txt
复制
        ss << _bstr_t(vtProp.bstrVal);
代码语言:txt
复制
        break;
代码语言:txt
复制
    }
代码语言:txt
复制
    VariantClear(&vtProp);
代码语言:txt
复制
}
代码语言:txt
复制
pSvc->Release();
代码语言:txt
复制
pLoc->Release();
代码语言:txt
复制
pEnumerator->Release();
代码语言:txt
复制
CoUninitialize();
代码语言:txt
复制
return ss.str();

}

// 生成签名

std::string GenerateSignature()

{

代码语言:txt
复制
unsigned char hash[SHA256_DIGEST_LENGTH];
代码语言:txt
复制
std::stringstream ss;
代码语言:txt
复制
// 获取CPU ID
代码语言:txt
复制
std::string cpuid = GetCPUID();
代码语言:txt
复制
SHA256_CTX sha256;
代码语言:txt
复制
SHA256_Init(&sha256);
代码语言:txt
复制
SHA256_Update(&sha256, cpuid.c_str(), cpuid.size());
代码语言:txt
复制
// 获取硬盘序列号
代码语言:txt
复制
std::string diskserial = GetDiskSerialNumber
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券