1.下载nmap并安装。下载地址:nmap

2.nmap可以将输出结果定向为xml文件。因此,可以先通过进程将nmap输出保存至xml文件,然后再去解析xml即可得到扫描的结果。nmap主机发现命令:nmap -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -PE 1-254 -oX nmap_output.xml。一个网段大概2s,还挺快的。参数解析命令如下:

-sn 只ping主机,不扫描端口
-PE 通过ICMP echo判定主机是否存活
-n  不反向解析IP地址到域名
–min-hostgroup 1024    最小分组设置为1024个IP地址,当IP太多时,nmap需要分组,然后串行扫描
–min-parallelism 1024  探针的数目限定最小为1024,和扫描时间有关,当然依赖于系统和网络资源
-oX nmap_output.xml    将结果以文件名nmap_output.xml的XML格式输出。

3.部分代码和运行结果如下:

    qDebug() << "start: " << QDateTime::currentDateTime().toString("hh:mm:ss:zzz");
    QProcess cmd;
    //-sn		只ping主机,不扫描端口 
    //-PE		通过ICMP echo判定主机是否存活 
    //-n		不反向解析IP地址到域名
    //–min-hostgroup 1024 最小分组设置为1024个IP地址,当IP太多时,nmap需要分组,然后串行扫描
    //-min-parallelism 1024 探针的数目限定最小为1024,和扫描时间有关,当然依赖于系统和网络资源 
    //-oX nmap_output.xml   将结果以文件名nmap_output.xml的XML格式输出
    QString arg("nmap -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -PE  192.168.0.1-254 -oX nmap_output.xml");
    //process.execute(cmd);
    cmd.start(arg);
    cmd.waitForReadyRead();
    cmd.waitForFinished();
    //QString retStr = cmd.readAll();

    readNampOutputXml("nmap_output.xml");

    qDebug() << "over: " << QDateTime::currentDateTime().toString("hh:mm:ss:zzz");
QStringList readNampOutputXml(QString fileName)
{
    QStringList lstUpHostIP;
    if (fileName.isEmpty())
    {
        qDebug() << QStringLiteral("fileName is empty!");
        return lstUpHostIP;
    }
    pugi::xml_document xmlDoc;
    if (!xmlDoc.load_file(fileName.toLocal8Bit().data(), pugi::parse_default,     pugi::encoding_utf8)) 
    {
        qDebug() << QStringLiteral("read file failed!");
        return lstUpHostIP;
    }
    pugi::xml_node nodeHostInfos = xmlDoc.child("nmaprun");
    for (pugi::xml_node nodeHost = nodeHostInfos.first_child(); nodeHost; nodeHost =     nodeHost.next_sibling())
    {
        for (pugi::xml_node nodeAddr = nodeHost.first_child(); nodeAddr; nodeAddr =      nodeAddr.next_sibling())
        {
            QString nodename = nodeAddr.name();
            if (nodename == "address")
            {
                QString addrtype = nodeAddr.attribute("addrtype").as_string();
                if ("ipv4" == addrtype)
                {
                    QString ip = nodeAddr.attribute("addr").as_string();
                    lstUpHostIP << ip;
                    qDebug() << ip;
                }
            }
        }
    }	
    return lstUpHostIP;
}

存活主机发现(基于nmap和Qt)

4.剩下的部分是一个小例子,在具体的使用时建议移至子线程(xml解析用的是pugixml库),传送门:Qt+nmap主机发现示例

 

 

 

相关文章:

  • 2021-05-17
  • 2022-12-23
  • 2021-06-02
  • 2021-11-20
  • 2022-12-23
  • 2022-01-22
  • 2022-12-23
  • 2022-01-19
猜你喜欢
  • 2021-09-28
  • 2021-12-07
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-08-22
  • 2022-12-23
相关资源
相似解决方案