C/C++:Windows获取电脑机器指纹
生活随笔
收集整理的這篇文章主要介紹了
C/C++:Windows获取电脑机器指纹
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
介紹
很多時(shí)候我們需要為一臺(tái)Windows設(shè)備生成一個(gè)機(jī)器指紋來(lái)標(biāo)識(shí)一臺(tái)設(shè)備。當(dāng)然標(biāo)識(shí)設(shè)備最好的是與硬件相關(guān)的標(biāo)識(shí),應(yīng)該硬件一般不會(huì)被改變。筆者參考了獲取設(shè)備唯一標(biāo)識(shí)這篇博客。筆者將使用下面幾個(gè)字段進(jìn)行機(jī)器指紋的生成。
wmic csproduct get UUID
唯一值,缺陷并不是所有的廠商都提供UUID(可以使用)
wmic cpu get processorid
同一批次的PC,CPUID可能一樣(可以使用)
wmic bios get serialnumber
刷了BIOS系統(tǒng)可能導(dǎo)致BIOS序列號(hào)變動(dòng)(刷BIOS概率很小,可以使用)
wmic diskdrive get serialnumber
多塊硬盤(pán),更換硬盤(pán)(概率較小,可以使用)
網(wǎng)卡更換,MAC地址易被更改 作為硬件不可靠(不建議使用)
代碼
這里我們采用的策略是:主板UUID存在,就使用主板UUID生成機(jī)器指紋。主板UUID不存在,使用CPUID、BIOS序列號(hào)、硬盤(pán)序列號(hào)生成機(jī)器指紋。這里的散列算法用的標(biāo)準(zhǔn)庫(kù)中自帶。
#include <Windows.h> #include <string> #include <list> #include <iostream> #include <functional>using namespace std; #define BUFFER_SIZE 128bool getDevcieInfo(char* cmd,list<string> &resultList) {char buffer[BUFFER_SIZE];bool ret = false;FILE* pipe = _popen(cmd, "r"); //打開(kāi)管道,并執(zhí)行命令 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無(wú)用的空行{continue;}ret = true;resultList.push_back(string(buffer));}}_pclose(pipe); // 關(guān)閉管道 return ret; }string getDeviceFingerPrint(){list<string> strList;list<string>::iterator it;hash<string> str_hash;size_t num ;char tmp[11] = {0};// 主板UUID存在,就使用主板UUID生成機(jī)器指紋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序列號(hào)、硬盤(pán)序列號(hào)生成機(jī)器指紋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("");// 硬盤(pán)可能有多塊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; }總結(jié)
以上是生活随笔為你收集整理的C/C++:Windows获取电脑机器指纹的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: QT5_数据类型转化
- 下一篇: Z-Stack通过按键中断实现长按功能