首页
学习
活动
专区
工具
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
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • WireShark网络取证分析第五集

    现在的你是调查员且拥有记录Moneymany女士与网站互动的网络截图(PCAP)文件,您的任务是了解Moneymany女士点击链接后她的系统可能会发生什么情况,您的分析将从PCAP文件开始并揭示一个恶意的可执行文件,这是这个谜题的网络捕获文件,这个PCAP文件的MD5哈希是c09a3019ada7ab17a44537b069480312,请使用正式提交表格提交您的答案 1.作为感染过程的一部分,Moneymany女士的浏览器下载了两个Java小程序,这两个程序的名字是什么?实现这些小程序的jar文件? 2.Moneymany女士在被感染的Windows系统上的用户名是什么? 3.这个事件的起始网址是什么?换句话说Moneymany女士可能点击了哪个网址? 4.作为感染的一部分一个恶意的Windows可执行文件被下载到了Moneymany的系统中,文件的MD5哈希是什么?提示:以"91ed"结尾 5.用于保护恶意Windows可执行文件的打包程序的名称是什么?提示:这是"主流"恶意软件中最流行的免费打包程序之一 6.恶意Windows可执行文件的解压缩版本的MD5哈希是什么? 7.恶意可执行文件试图使用硬编码的IP地址连接到互联网主机(没有DNS查找),那个互联网主机的IP地址是什么?

    02
    领券