接上一篇终端上网行为管理开源框架己经介绍的服务器端开源代码,其实同时还开源了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);

}

先解读到这里,后面的代码大家先自己看,待有空再来解读

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐