接上一篇终端上网行为管理开源框架己经介绍的服务器端开源代码,其实同时还开源了agent端的代码,agent使用的是vc++,能运行在windows7以上操作系统上,目前代码还不是太多,主要是收集了pc端的程序运行信息,我给大家大致解读下,具体的源码地 址为boxiaojishu/windata (github.com)
代码中先是实现了一个公共读取windows操作系统的硬件信息
bool getDevcieInfo(char* cmd, list<string>& resultList) { | |
char buffer[BUFFER_SIZE]; | |
bool ret = false; | |
FILE* pipe = _popen(cmd, "r"); //打开管道,并执行命令 | |
if (!pipe) | |
return ret; | |
const 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; | |
} |
接着实现了一个读取主板UUID信息,如果主板UUID不存在,使用CPUID、BIOS序列号、硬盘序列号生成机器指纹
代码如下:
string getDeviceFingerPrint() { | |
list<string> strList; | |
list<string>::iterator it; | |
hash<string> str_hash; | |
size_t num; | |
char tmp[11] = { 0 }; | |
// 主板UUID存在,就使用主板UUID生成机器指纹 | |
if (getDevcieInfo((char*)"wmic csproduct get UUID", strList) | |
&& (*strList.begin()).compare("FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF\r\n") != 0) | |
{ | |
//cout << *strList.begin() << endl; | |
cout << (*strList.begin()).substr(0, (*strList.begin()).length() - 4) << endl; | |
num = str_hash(*strList.begin()); | |
sprintf_s(tmp, "%u", num); | |
//cout << string(tmp) << endl; | |
return string((*strList.begin()).substr(0, (*strList.begin()).length() - 4)); | |
} | |
// 主板UUID不存在,使用CPUID、BIOS序列号、硬盘序列号生成机器指纹 | |
string otherStr(""); | |
strList.clear(); | |
if (getDevcieInfo((char*)"wmic cpu get processorid", strList)) { | |
//otherStr.append((*strList.begin()).pop_back()); | |
otherStr.append((*strList.begin()).substr(0, (*strList.begin()).length() - 4)); | |
cout << *strList.begin() << endl; | |
} | |
cout << otherStr << endl; | |
strList.clear(); | |
if (getDevcieInfo((char*)"wmic bios get serialnumber", strList)) { | |
otherStr.append((*strList.begin()).substr(0, (*strList.begin()).length() - 9)); | |
cout << *strList.begin() << endl; | |
cout << otherStr << endl; | |
} | |
strList.clear(); | |
if (getDevcieInfo((char*)"wmic diskdrive get serialnumber", strList)) { | |
string allDiskNum(""); | |
// 硬盘可能有多块 | |
for (it = strList.begin(); it != strList.end(); it++) | |
{ | |
allDiskNum.append(*it); | |
} | |
cout << *strList.begin() << endl; | |
otherStr.append((*strList.begin()).substr(0, (*strList.begin()).length() - 4)); | |
} | |
cout << otherStr << endl; | |
num = str_hash(otherStr); | |
sprintf_s(tmp, "%u", num); | |
//cout << string(tmp) << endl; | |
return string(otherStr); | |
} |
先解读到这里,后面的代码大家先自己看,待有空再来解读