C/C++:Windows获取电脑机器指纹

介绍

很多时候我们需要为一台Windows设备生成一个机器指纹来标识一台设备。当然标识设备最好的是与硬件相关的标识,应该硬件一般不会被改变。笔者参考了获取设备唯一标识这篇博客。笔者将使用下面几个字段进行机器指纹的生成。

  1. 主板UUID
    wmic csproduct get UUID
    唯一值,缺陷并不是所有的厂商都提供UUID(可以使用)
  2. CPUID
    wmic cpu get processorid
    同一批次的PC,CPUID可能一样(可以使用)
  3. BIOS序列号
    wmic bios get serialnumber
    刷了BIOS系统可能导致BIOS序列号变动(刷BIOS概率很小,可以使用)
  4. 硬盘序列号
    wmic diskdrive get serialnumber
    多块硬盘,更换硬盘(概率较小,可以使用)
  5. 网卡MAC地址
    网卡更换,MAC地址易被更改 作为硬件不可靠(不建议使用)

代码

这里我们采用的策略是:主板UUID存在,就使用主板UUID生成机器指纹。主板UUID不存在,使用CPUID、BIOS序列号、硬盘序列号生成机器指纹。这里的散列算法用的标准库中自带。

#include <Windows.h>
#include <string>
#include <list>
#include <iostream>
#include <functional>

using namespace std;
#define BUFFER_SIZE 128

bool getDevcieInfo(char* cmd,list<string> &resultList) {
    char buffer[BUFFER_SIZE];
	bool ret = false;
    FILE* pipe = _popen(cmd, "r"); //打开管道,并执行命令 
    if (!pipe)
          return ret;                     
    
	char *name[20] = {"UUID","ProcessorId","SerialNumber"};
	int len0 = strlen(name[0]),len1 = strlen(name[1]),len2 = strlen(name[2]);
	bool isOk = false;
    while(!feof(pipe)) 
	{
		if(fgets(buffer, BUFFER_SIZE, pipe))
		{
			if( strncmp(name[0],buffer,len0) == 0 
				|| strncmp(name[1],buffer,len1) == 0 
				|| strncmp(name[2],buffer,len2) == 0 ) // 能够正确获取信息
			{
				isOk = true;
				continue;
			}
            if( isOk ==  false 
				|| strcmp("\r\n",buffer) == 0 ) //去掉windows无用的空行
			{
				continue;
			}
			ret = true;
			resultList.push_back(string(buffer));
        }
    }
    _pclose(pipe); // 关闭管道 
    return ret; 
}


string getDeviceFingerPrint(){
    list<string> strList;
	list<string>::iterator it;
	hash<string> str_hash;
	size_t num ;
	char tmp[11] = {0};
	
	// 主板UUID存在,就使用主板UUID生成机器指纹
    if( getDevcieInfo("wmic csproduct get UUID",strList)
		&& (*strList.begin()).compare("FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF\r\n") != 0)
	{
		//cout << *strList.begin();
		//cout << str_hash(*strList.begin()) << endl;
		num = str_hash(*strList.begin());
		sprintf(tmp,"%u",num);
		//cout << string(tmp) << endl;
		return string(tmp);
    }
    
    // 主板UUID不存在,使用CPUID、BIOS序列号、硬盘序列号生成机器指纹
	string otherStr("");
	strList.clear();
	if( getDevcieInfo("wmic cpu get processorid",strList) ){
		otherStr.append( *strList.begin() );
    }
	strList.clear();
	if( getDevcieInfo("wmic bios get serialnumber",strList) ){
		otherStr.append( *strList.begin() );
    }
	strList.clear();
	if( getDevcieInfo("wmic diskdrive get serialnumber",strList) ){
		string allDiskNum("");
		// 硬盘可能有多块
		for(it = strList.begin();it != strList.end();it++)
		{
			allDiskNum.append(*it);
		}
		//cout << allDiskNum ;
		//cout << str_hash(allDiskNum) << endl;
		otherStr.append( *strList.begin() );
    }
	cout << str_hash(otherStr) << endl;
	//memset(tmp,0,11);
	num = str_hash(otherStr);
	sprintf(tmp,"%u",num);
	//cout << string(tmp) << endl;
	return string(tmp);
}

void test()
{
	string deviceFingerPrint = getDeviceFingerPrint();
	cout << deviceFingerPrint << endl;
}

int main(int args,char* argv[])
{
	test();
	system("pause");            
	return 0;
}
本资源是以压缩包形式的,里面是一个pdf格式电子书(完整版)。有需要的朋友可以下载。 本书作者: 李昊 傅曦(编著); 本书出版社:人民邮电出版社 内容简介: 《精通VisualC++指纹模式识别系统算法及现实》共5篇。第一篇讲解指纹模式识别系统入门知识,包括指纹模式识别系统演示系统和指纹学基础,引导读者快速入门;第二篇讲解指纹模式识别系统算法,包括指纹模式识别预处理和指纹图像特征提取与比对的源代码实现;第三篇讲解如何亲手打造指纹模式识别系统,带领读者制作一个指纹模式识别系统的软硬件系统;第四篇讲解指纹模式识别应用技术基础,包括指纹模式识别技术各类应用的系统构造和源代码实现;第五篇讲解指纹电子产品技术和指纹电子产品的发展创业,包括指纹电子证件系统、指纹识别电子产品以及数字指纹技术的创业规划。 《精通VisualC++指纹模式识别系统算法及现实》适合指纹模式识别技术的初学者、指纹识别电子产品工程师以及打算投身指纹模式识别领域的创业者阅读。 推荐理由: 免费公开了VisualC++指纹模式识别系统源代码 带领读者一步一步亲手制作一个指纹识别系统 深度剖析真实的行业应用案例 业界专家强力推荐 部分章节目录: 目录: 第一篇 指纹模式识别系统入门 第1章 指纹模式识别演示轻松入门 3 1.1 体验VisualC++指纹模式识别演示系统 3 1.1.1 VisualC++指纹模式识别演示系统的安装与使用 3 1.1.2 VisualBasic指纹模式识别演示系统的安装与使用 5 1.2 指纹模式识别系统的市场应用前景 8 1.3 指纹模式识别系统的学习方法 10 第2章 轻松接触传统指纹学和数字指纹11 2.1 指纹学的历史 11 2.2 传统指纹学 13 2.2.1 指纹卡片 14 2.2.2 指纹分析 16 2.2.3 传统人工指纹比对 16 2.3 数字指纹学概述 18 2.3.1 计算机视觉原理 19 2.3.2 数字指纹学与传统指纹学的关系 21 2.3.3 数字指纹学的方法 23 第3章 轻松自创指纹模式识别演示 26 3.1 动手创建一个VisualC++程序 26 3.1.1 初步了解VisualC++工具环境 26 3.1.2 用VisualC++向导创建程序工程 27 3.2 编程接入VisualC++指纹算法程序代码 30 3.2.1 改造自建VisualC++程序界面 30 3.2.2 编程接入C++指纹算法程序代码实例 34 3.3 使用开发环境自创指纹模式识别演示系统 38 3.3.1 VisualC++指纹模式识别开发环境简介 38 3.3.2 自建VisualC++指纹模式识别演示系统 38 3.3.3 VisualC++指纹模式识别开发环境详细说明 40 3.3.4 指纹图像BMP位图的读取 42 3.3.5 指纹图像的灰度模型 49 3.4 编制可移植VisualC++指纹识别源代码的要点 51 第二篇 指纹模式识别系统算法 第4章 指纹模式识别系统算法总论 55 4.1 指纹模式和指纹模式识别的发展历程 55 4.1.1 指纹的模式对象、模式特征对象、模式类型对象 55 4.1.2 指纹模式和指纹模式识别的发展历程 60 4.1.3 指纹模式的数据结构和数字图像文件表示 62 4.2 指纹模式识别系统算法的组成及流程 62 4.2.1 指纹模式识别系统算法组成概述 62 4.2.2 指纹模式识别系统算法实现流程 64 第5章 指纹模式识别的预处理 68 5.1 指纹数学建模与图像的畸变矫正 68 5.1.1 指纹图像畸变的自然模型 68 5.1.2 指纹图像畸变的物理模型 69 5.1.3 指纹图像畸变矫正的数学模型 70 5.1.4 指纹图像畸变矫正的C++源代码实现 78 5.2 指纹图像场及其计算 82 5.2.1 指纹图像场的自然模型 82 5.2.2 指纹图像场的物理模型 82 5.2.3 指纹图像场的数学模型 84 5.2.4 指纹图像场能计算的源代码实现 85 5.3 指纹图像的分割 88 5.3.1 计算强度场分割指纹图像 89 5.3.2 计算梯度场分割指纹图像 89 5.3.3 指纹图像分割的C++源代码实现 91 5.4 指纹图像的均衡 93 5.4.1 指纹图像灰度失衡的自然模型 93 5.4.2 指纹图像灰度失衡的物理模型 94 5.4.3 指纹图像灰度均衡的数学建模 95 5.4.4 指纹图像灰度均衡的C++源代码实现 97 5.5 指纹图像的收敛 99 5.5.1 指纹图像混沌发散的自然模型 99 5.5.2 指纹图像混沌发散的物理模型 100 5.5.3 指纹图像混沌发散的数学模型 101 5.5.4 指纹图像收敛的C++源代码实现 103 5.6 指纹图像的平滑 106 5.6.1 指纹图像噪声嘈杂的自然模型 107 5.6.2 指纹图像噪声嘈杂的物理模型 107 5.6.3 指纹图像平滑噪声的数学模型 108 5.6.4 指纹图像平滑噪声的C++源代码实现 109 5.7 指纹图像的智能增强 111 5.7.1 指纹图像智能增强的自然模型 111 5.7.2 指纹图像智能增强的物理模型 111 5.7.3 指纹图像智能增强的数学模型 113 5.7.4 指纹图像智能增强的C++源代码实现 114 5.8 指纹图像骨架的提取准备 117 5.8.1 指纹图像二值化模型 118 5.8.2 指纹图像智能二值化C++源代码实现 119 5.8.3 指纹图像去噪声处理C++源代码实现 123 5.9 指纹图像骨架的细化提取 126 5.9.1 指纹图像细化方法 127 5.9.2 指纹图像细化方法C++源代码实现 127 5.9.3 指纹图像细化后处理C++源代码实现
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值