C/C++:Windows获取电脑机器指纹
生活随笔
收集整理的這篇文章主要介紹了
C/C++:Windows获取电脑机器指纹
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
介紹
很多時候我們需要為一臺Windows設備生成一個機器指紋來標識一臺設備。當然標識設備最好的是與硬件相關的標識,應該硬件一般不會被改變。筆者參考了獲取設備唯一標識這篇博客。筆者將使用下面幾個字段進行機器指紋的生成。
wmic csproduct get UUID
唯一值,缺陷并不是所有的廠商都提供UUID(可以使用)
wmic cpu get processorid
同一批次的PC,CPUID可能一樣(可以使用)
wmic bios get serialnumber
刷了BIOS系統可能導致BIOS序列號變動(刷BIOS概率很小,可以使用)
wmic diskdrive get serialnumber
多塊硬盤,更換硬盤(概率較小,可以使用)
網卡更換,MAC地址易被更改 作為硬件不可靠(不建議使用)
代碼
這里我們采用的策略是:主板UUID存在,就使用主板UUID生成機器指紋。主板UUID不存在,使用CPUID、BIOS序列號、硬盤序列號生成機器指紋。這里的散列算法用的標準庫中自帶。
#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"); //打開管道,并執行命令 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; }總結
以上是生活随笔為你收集整理的C/C++:Windows获取电脑机器指纹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT5_数据类型转化
- 下一篇: Z-Stack通过按键中断实现长按功能