首页
学习
活动
专区
工具
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 Windows.h> 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#使用者在调研的时候,对于RTSPSERVER的LocalIP...的获取不是很清楚,下面结合代码做个演示,说明实现的方法以及如何使用。...1、定义函数GetLocalIP()用于获取本机IP; 2、具体实现如下: /// /// 获取当前使用的IP /// /// 中筛选出IPv4类型的IP地址 //AddressFamily.InterNetwork表示此IP为IPv4, //AddressFamily.InterNetworkV6...“成功” : “失敗”)); 在实际使用中,EasyScreenLive同屏组件只需要调用EasyScreenLive的几个API接口,就能轻松、稳定地把流媒体音视频数据RTMP推送给EasyDSS服务器以及发布

    1.5K20

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

    一般服务器会放在机房,很多时候我们一般是通过一某个终端软件进行远程连接到服务器,然后再去工作。 那么我们如何把云端服务器上的file04.c文件传输到本地pc机windows系统上去呢?...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.5K20

    抱歉,你的电脑不能升级 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系统在早期对于微软产生过威胁,但整体来讲冲击不大。...,特别当初为了一个签名弄得非常被动,可能是当初的诺基亚太过强大,创新意识差一点。...这四个系统从技术角度上各有千秋,从开发者角度更加喜欢安卓,毕竟代码开源并且能从源码中汲取很多的编程知识,虽然代码的更新速度太快,大部分时间跟不上思路,但可以从中学习到很多模块设计理念,能明白里面运行的机制和原理

    93320

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

    想要回答这个问题,必须得知道固件在物联网设备中是怎么存储的,还要理清物联网设备固件的获取方法有哪些,才能回答如何防止获取到固件的问题。...图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.2K30

    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权限运行代码

    79130

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

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

    3.3K10

    云计算历程和前途

    主机时代,大多数人没有经历过,但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.制作万能克隆镜像文件 现在C盘中的Windows XP已经是一个完全重新封装的干净系统了。...现在就可以用这张光盘来启动系统(注意在CMOS中要设置从光盘引导),在提示菜单中选择“从光盘恢复C盘”即可自动把万能克隆恢复到电脑中的C盘分区了(见图6)。...使用中的要点 1.如何恢复到D盘分区 当系统中C盘已经安装了Windows 98,想把Windows XP克隆安装到D盘,可在光盘启动后的菜单中选择“从光盘恢复D盘”,但恢复后不会出现Windows

    9.4K80

    移动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插件,在弹出的对话框中设置持续抓取时间

    4K50

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

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

    1.3K90

    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 注:如果绝对路径中的名称有空格,就需要加双引号。

    23.6K33

    平头哥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

    27430
    领券