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