接上一篇终端上网行为管理开源框架己经介绍的服务器端开源代码,其实同时还开源了agent端的代码,agent使用的是vc++,能运行在windows7以上操作系统上,目前代码还不是太多,主要是收集了pc端的程序运行信息,我给大家大致解读下,具体的源码地 址为boxiaojishu/windata (github.com)
代码中先是实现了一个公共读取windows操作系统的硬件信息
bool getDevcieInfo(char* cmd, list
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
list
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);
}
先解读到这里,后面的代码大家先自己看,待有空再来解读