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

相关·内容

  • C++如何获取终端输出行数,C++清除终端输出特定一行内容

    单纯使用C++ 进行编程时候,很多输出调试信息都是直接在终端输出,那么有的时候就会对终端输出信息有一定要求,那么如何进行定位终端输出信息到底输出到了哪一行呢?...如何清除特定一行终端内容呢? 对于上面的两个问题,相信也会有很多小伙伴有同样烦恼,那么就让我们一起来解决这个麻烦吧。...#include #include using namespace std; // 回到坐标位置,坐标需要给定 void setpos(int x, int...} // 获取当前标准输出流位置 void getpos(int* x, int* y) { CONSOLE_SCREEN_BUFFER_INFO b; // 包含控制台屏幕缓冲区信息...GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &b); // 获取标准输出句柄 *x = b.dwCursorPosition.X

    4K40

    EasyScreenLive同屏功能组件C#版如何实现RTSPSERVER获取本机IP功能

    TSINGSEE青犀视频EasyScreenLive同屏组件内置有一个轻量级RTSPSERVER,可以对于采集音视频源进行RTSP分发,最近有一个C#使用者在调研时候,对于RTSPSERVERLocalIP...获取不是很清楚,下面结合代码做个演示,说明实现方法以及如何使用。...1、定义函数GetLocalIP()用于获取本机IP; 2、具体实现如下: /// /// 获取当前使用IP /// /// <...地址列表筛选出IPv4类型IP地址 //AddressFamily.InterNetwork表示此IP为IPv4, //AddressFamily.InterNetworkV6...“成功” : “失敗”)); 在实际使用,EasyScreenLive同屏组件只需要调用EasyScreenLive几个API接口,就能轻松、稳定地把流媒体音视频数据RTMP推送给EasyDSS服务器以及发布

    1.5K20

    如何把云端服务器上file04.c文件传输到本地pcwindows系统上去呢?

    一般服务器会放在机房,很多时候我们一般是通过一某个终端软件进行远程连接到服务器,然后再去工作。 那么我们如何把云端服务器上file04.c文件传输到本地pcwindows系统上去呢?...1、在SecureCRT上链接对话框右键打开  之后选择  连接SFTP会话 2、在sftp里面要分别要进入远程服务器路径和本地路径,如下:   先用命令pwd                 查看远程...linux目录   cd /home/chen/001/01/文件操作day01/      进入远程linux下存放文件目录   lpwd                    查看本地windows...目录     lcd 阿里云文件/001/                进入本地windows下将要存放文件目录 3、 get file04.c            远程目录得到文件file04....c,放入本地windows目录。

    2K10

    什么是UEFI签名认证?UEFI代码签名有什么好处?

    而现在新型电脑用基本都是UEFI启动,EFI启动过渡而来,基本功能上都和BIOS差不多,都是完成系统自检、完成硬件初始化、加载操作系统。...EFI,是Extensible Firmware Interface词头缩写,直译过来就是可扩展固件接口,它是用模块化、高级语言(主要是C语言)构建一个小型化系统,它和BIOS一样,主要在启动过程完成硬件初始化...UEFI具有一个独特功能——安全启动(secure boot),而EFI是没有安全启动。...而Win8以后Windows则是在操作系统加载过程硬件驱动继续查签名,符合Windows记录硬件才能被Windows加载。...如何进行UEFI签名认证 开发者需要通过“Windows合作伙伴中心硬件仪表板”对 UEFI 固件二进制文件进行数字签名,使其能够安装在 Windows 设备上。

    1.4K20

    抱歉,你电脑不能升级 Windows 11

    在这篇文章,我们深入研究了这个鲜为人知组件,给出了一些常见问题答案,例如它用途、如何查看你计算机是否已安装它,以及在哪里获取它。 什么是 TPM 芯片?...这些密钥可以用来加密你硬盘驱动器,于是没人能在偷走你硬盘后把它连接到自家计算机主板上来获取硬盘数据。 此外,有经验用户经常使用这些芯片来处理电子邮件客户端加密、密钥签名消息。...几天后,微软网站上删除了这条信息。他们在更新博客 文章 中表示,他们已暂时移除了 PC 健康检查应用(该应用可让用户查看他们计算机是否与新硬件要求兼容)。...如何检查你计算机是否有 TPM 芯片 首先,如果你 PC 是在 2016 年 7 月 28 日之后购买,它很可能已经启用了 TPM 2.0 芯片。...正如我们之前提到,黄牛在听说了微软最初 Windows 11 硬件要求后立即开始囤积 TPM 芯片了。你最好选项是尝试直接 PC 销售商或零件网站购买。

    1.2K30

    IOS,安卓,Windows和塞班,你最喜欢哪个?为什么?

    从事软件开发多年,主要用C/C++,java三种编程语言开发,IOS,安卓,windows,塞班四个系统除了IOS没怎么玩过,其余三种系统都做过对应开发,其中安卓系统玩时间最长,研究过中间层framework...框架,应用级开发也弄过两年,技术角度上衡量虽然windows系统不是开源,但受众如此之多经常遭受病毒侵袭但通过打补丁方式来避免,还不耽误整体使用,就冲着这点还是感觉windows框架兼容性还是非常强...,而且现在windows系统在PC端还是稳稳霸主地位,虽然linux系统在早期对于微软产生过威胁,但整体来讲冲击不大。...,特别当初为了一个签名弄得非常被动,可能是当初诺基亚太过强大,创新意识差一点。...这四个系统技术角度上各有千秋,开发者角度更加喜欢安卓,毕竟代码开源并且能从源码汲取很多编程知识,虽然代码更新速度太快,大部分时间跟不上思路,但可以从中学习到很多模块设计理念,能明白里面运行机制和原理

    92520

    物联网设备固件安全性分析

    想要回答这个问题,必须得知道固件在物联网设备是怎么存储,还要理清物联网设备固件获取方法有哪些,才能回答如何防止获取到固件问题。...图11 nandflash芯片编程器 “有心人”除了有这个编程器以外,还会卖家得到一个配套软件,运行在PC上,作为上位机读取nandflash内容,如。图12所示。...与通过bootloader读取固件方式不同,生产硬件调试器厂商会提供一个配套软件作为主机端程序,如J-Link驱动程序等,使PC运行J-Link驱动程序后,可以向主控器存储器写入数据、读取数据...图17 J-Link驱动配套软件 以J-Link驱动程序为例,J-Link驱动程序与J-Link硬件调试器配套。PC安装完J-Link驱动程序之后,会带有如图17所示软件。...设备端是以AES密钥作为被签名文本,采用RSA签名方式。 ? 图18 kaa整体架构 kaa加密方法足够强,目前看来,其签名认证采用单向认证,如何把kaa单向认证改为双向认证呢?

    2.1K30

    PC-Doctor组件存在提权漏洞,海量设备面临网络攻击风险

    PC-Doctor是国外一款计算机硬件检测和清理优化工具,有着相当长应用历史,很多计算机设备生产厂商基于其组件构建了自己计算机管理软件,并预装进设备获得了大量分发,因此本次发现漏洞将影响全球范围内数以亿计计算机设备...漏洞解构 SupportAssist用于检查系统硬件软件运行状况,检测到问题时它会向戴尔发送必要系统状态信息以便进入故障排除流程。...这些可执行文件都加载了DLL库,这些DLL库能够从不同源(软件硬件)收集信息。加载库后,ProcMon中会出现以下内容: ?...截图中可以看出,有三个p5x可执行文件试图在c:\ python27目录(测试设备PATH环境变量)中找到以下DLL文件:LenovoInfo.dll、AlienFX.dll、atiadlxx.dll...安全专家发现,在他们测试环境,路径c:\ python27下有一个ACL允许任何经过身份验证用户将文件写入ACL,这意味着可以提升权限并允许普通用户编写缺少DLL文件并以SYSTEM权限运行代码

    77930

    电脑开机错误代码0xc0000428_状态为0xc0000428

    此外,在Windows上安装新软件硬件后,若没有通过Windows识别和签名,错误码0xc0000428则同样会出现。...原因2:安装了未通过签名驱动程序 启动时遇到错误码0xc0000428,还可能是因为最近更改了硬件软件,安装了未通过签名驱动程序,Windows则无法识别。...关于驱动程序,例如Windows 10驱动,都需要经过微软认证以及获取数字签名才可启用。 如果你正遇到错误码0xc0000428却不知所措,建议你参考以下3个解决方案来修复它。...⑤ 在命令提示符,输入bcdboot d:\windows /s c:,然后按Enter键。 • 此处d:\windows 指的是Windows系统根目录位置。...想要获取更多资讯和干货,请关注都叫兽软件熊掌号。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

    2.8K10

    云计算历程和前途

    主机时代,大多数人没有经历过,但PC时代,我们正在经历,所以,我们PC时代开始讲述,看看技术如何变迁。   PC刚刚发布时候,因为其价廉物美。...同时,一些基于局域网C/S应用开始普及,在服务器上安装数据库和服务软件,通过PC作为客户端来访问,提高了企业工作效率,帮助了PC局域网更加普及。   ...当然,还有一种可能性,客户端各种软件,都有了一个浏览器内核,然后,在浏览器内核基础上,开发自己独特客户端应用。把网络和自己特色融合在一起了。   ...迟早我们C盘就会变成电子硬盘,装操作系统和软件,然后其他DEF盘,其实就转移到了文件服务器上。就是C盘,也被同步到文件服务器上备份了。   ...开始,DOS和Windows 3.x并存,Windows 95开始,DOS就隐藏了。直到Windows 7。   今天,Windows 8又在玩过去Windows 3.x游戏。

    3.7K130

    怎样制作GHOST系统盘

    1.安装系统 正常安装Windows XP到C盘(注意不要安装到其他分区,否则会比较麻烦),并安装好系统安全补丁(如冲击波补丁等)和常用软件,注意安装软件时只安装那些常用软件,不要什么都装。...列表或指定位置安装(高级)→下一步→不要搜索→Standard PC→下一步”(见图2),最后单击“完成”按钮,系统会提示重新启动,单击“否”不重启系统。...7.制作万能克隆镜像文件 现在CWindows XP已经是一个完全重新封装干净系统了。...现在就可以用这张光盘来启动系统(注意在CMOS要设置光盘引导),在提示菜单中选择“光盘恢复C盘”即可自动把万能克隆恢复到电脑中C盘分区了(见图6)。...使用要点 1.如何恢复到D盘分区 当系统C盘已经安装了Windows 98,想把Windows XP克隆安装到D盘,可在光盘启动后菜单中选择“光盘恢复D盘”,但恢复后不会出现Windows

    9.3K80

    移动App专项性能测试(Android and iOS)

    b、常见使用场景能够正常进入待机,待机电流在正常范围内。 c、长时间连续使用应用无异常耗电现象。 功耗测试方法分为两类,一类为软件测试,一类为硬件测试。...2类,一类为使用软件来测试,一类为使用硬件来测试。...帧率 GPU这个词对于PC性能测试者来说并不陌生,而今3Dmax,安兔兔之类第三方软件让GPU 在移动端性能测试领域家喻户晓,但对于App内GPU该如何来测试呢?...4x过度绘制 c、不允许存在面积超过屏幕1/4区域3x过度绘制(淡红色区域) 对于屏幕滑动帧速率,常用手段包括软件测试或硬件辅助测试。...软件测试方法如下: 1.手机端需打开开发者选项启用跟踪后,勾选Graphics 和 View; 2.启动SDK工具Systrace插件,勾选被测应用,点击Systrace插件,在弹出对话框设置持续抓取时间

    3.9K50

    为什么IBM开放策略,没能取得最终胜利?

    image.png 这句话应该结合着下一句话来说:为什么连当时赢家微软最后也陷入了困境? IBM PC苹果开创市场,硬生生抢走半壁江山。...微软是开放操作系统创造者。它用Windows操作系统、Office办公软件、与英特尔捆绑合作,再联合众多硬件制造商一起,开拓了一种全新商业模式。这一模式目前正在被谷歌Android所借鉴。...然后通过通用性再吸引更多用户,进而吸引更多硬件制造商加入。 但问题就在这里:为了硬件制造商通用性,软件无法最大程度优化以及独特化;而没有优秀软件硬件竞争最后会恶化成荒漠。...这从来都不是一个好组合,最终也会社会进化消失。 4、IBM必然会从中退出。...因此,无论硬件还是软件,二者都失去了共同积极进化方向和可能。缺少二者密切合作,诞生伟大产品可能性就大大降低了。 综上所述,我认为,所谓开放系统优于封闭系统说法是错误

    1.3K90

    平头哥TH5120 BeagleV-Ahead开机系统软件使用体验

    上一篇介绍了 BeagleV-Ahead硬件基本组成,以及各个接口使用场景功能等,这一篇我们拿到一个开发板开始,软件层面来展示 BeagleV-Ahead 系统一些软件特性,首先从BeagleV-Ahead...上电,连接显示器,作为一个独立小型 PC使用,之后 使用USB转串口工具,使用终端命令行 方式 登录终端,作为嵌入式开发角度来操作此款开发板,最后 讲解 如何 更新 官方提供 不同系统镜像,分别烧录至...系统体验 更新软件源,如果使用 sudo apt update 命令提示需要输入密码,默认系统 密码为 temppwd 用户名为 beagle 安装htop软件包 开发Hello.c程序 如果只是运行安装现有的软件...\n\r"); return 0; } 截图介绍 如何 使用 文本编辑器,怎么写入代码 怎么保存 编译运行 大家应该都知道,计算机硬件只认识0 1 0 1数字,无法直接运行我们编写好程序,这时我们就需要把...更新eMMC 系统 注意:此教程运行环境基于windows系统,理论上 windows 10及以上系统都支持 获取镜像 使用浏览器访问 https://www.beagleboard.org/distros

    25830

    DELL服务器iDRAC远程访问管理控制台使用

    此功能还有以下优点: 组织每个iDRAC都有唯一证书 您可以将签名证书上传到客户端,而且在访问组织所有iDRAC时,系统都不会提示任何与证书相关警告。...作为PKCS#12文件一部分私钥,将被安全地存储于iDRAC,但系统不提供iDRAC下载私钥选项。即使是iDRAC管理员,也不能下载私钥。...这样即会使用上传签名证书创建SSL证书,并将其应用到IDRAC。当您iDRAC删除签名证书时,iDRAC也将重新启动。当您iDRAC下载签名证书时,证书将被下载但不包含私钥。...WeiyiGeek. 5) 使用软件是XCA一个功能强大Windows 证书管理器 官方地址: http://hohnstaedt.de/xca 下载地址: https://github.com/chris2511..." -c idrac.embedded.1 注:如果绝对路径名称有空格,就需要加双引号。

    22.1K33
    领券