首页
学习
活动
专区
工具
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

3.9K40

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 销售商或零件网站购买。

1K30

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

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

90720

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

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

76630

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

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

2.3K10

浅谈Windows入侵检查

如果需要,断开所有与可疑机器网络连接。 做入侵检查时,检查人员需要一台PC对检查过程进行检查项目的结果记录。...请维护可疑服务器人员或者PC使用人员来配合,来确定机器上运行服务和安装软件,便于安全检查人员提交检查效率和准确性。...,比如C:\Windows\system32....检查系统不正常网络连接 C:\netstat –nao 5 检查自动化任务      检查计划任务清单未知计划      C:\at 检查windows日志异常 检查防火墙、杀毒软件事件,或任何可疑记录...l  查找是否有远程控制或后门之类传播。 l  尝试找出攻击者如何进入系统。所以可能都要考虑到。 l  修复攻击者利用漏洞。

1.1K31

云计算历程和前途

主机时代,大多数人没有经历过,但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.7K50

win10免费文件恢复工具

无论是照片、文档、视频还是其他,Windows File Recovery都可以帮你恢复,而且它还支持机械硬盘、固态硬盘、U盘、SD卡等多种硬件类型,遗憾是,不支持网络驱动器文件恢复。...下面还是一起来看看用法吧: 1、安装下载 首先,通过下载链接打开“Windows File Recovery”下载界面,点击“获取”按钮安装。...CDocuments文件夹恢复到E盘: winfr C: E: /n \Users\\Documents\ 注意:不要忘记末尾“\” 分段模式示例: 将PDF和Word文件...* 签名模式示例 将CJPEG(jpg,jpeg,jpe,jif,jfif,jfi)和PNG照片恢复到E盘: winfr C: E: /x /y:JPEG,PNG 将CZIP文件(zip,docx...关于详细命令行语法,微软也给出详细文档示例,感兴趣同学也可以去了解了解,英语比较薄弱小伙伴们,可以通过浏览器翻译软件翻译一下,相信这些都是难不倒你们

2.7K10

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

24130
领券