一、软件的简介

1.1 开发技术简介

本软件是利用c++语言基于Qt与PcapPlusPlus(以下简称PcPP)库在vs2019中开发的一个单一的windows应用。Qt是一个良好的跨平台界面设计库,简单易用,可移植性好;PcapPcapPlus是一个多平台的c++库,用于捕获、解析和制作网络数据包,功能强大,易于使用,简洁高效。本程序使用在开发过程中,利用异步抓包的方式,将ui线程作为主线程,抓包及数据处理线程作为子线程,保证用户体验的一个连贯性,同时,保证抓包的效率。


更新时间:

2022年9月2日14:27:09:添加代码信息


1.2 软件的基本情况

软件的基本运行如下图所示:

1.3 软件的使用

在运行本程序前,需要安装WinPcap 。

在安装WinPcap之后,直接点击 下图中的应用程序可以直接运行。

其他功能在正面介绍时会具体的演示。

二、软件的功能设计及实现

软件当前已经基本上实现了获取当前主机的网卡、抓包、协议分析(包括以太网、ARP、IPv4、IPv6、TCP、UDP、HTTP、ICMP等)、pcap文件的保存与打开等功能。正面将对各个功能模块及主要代码进行说明。

2.1 网卡列表功能

网卡列表功能主要是获取当前主机上所有的网卡列表,功能实现如下图所示:

关键代码实现如下:

initDevices()初始化时获取所有设备的列表,并更新网卡列表的控制数据

void MyNetDump::initDevices()
{if (allDevices.size() == 0){getDeviceList();}std::vector<pcpp::PcapLiveDevice*>::iterator it;QStringList nics;QString desc;for (it = this->allDevices.begin(); it < this->allDevices.end(); it++){ pcpp::PcapLiveDevice* dev = *it;if (!dev->getDesc().empty()){desc= QString(dev->getDesc().c_str());}else{desc = QString(dev->getName().c_str());}nics.append(desc);}ui.cb_NicList->addItems(nics);
}

selectNIC()函数通过一个顺序号选择一个网卡:

void MyNetDump::selectNIC(int index)
{if (index >= 0 && index < allDevices.size()){SelectedDevices = allDevices[index];}if (SelectedDevices != nullptr){printf("Dev %s is selected. ", SelectedDevices->getDesc().c_str());}}

2.2 抓包功能

在单击开始抓包按钮后,或通过菜单中的开始抓包子菜单启动一次抓包。获取到的数据包会直接显示在基本信息列表栏中 。可以看简略的数据包信息,包括源地址、目的地址、数据包的最上层协议类型、数据的总长度(根据以太网数据包的长度计算的)及基本的信息。

开始抓包startPcap():

代码基本的逻辑如下:

1. 开始时判断是否已经停止了?如果没有,则给用户弹出提示,当用户选择停止的时候,程序才停止抓包,并清除所有的已经抓包获取到的数据。

2. 判断是否选择网卡,如果没有选择,默认选择第一块网卡作为抓包的网卡。

3. 开始异步抓包,主线程负责显示数据,子线程负责抓包,处理数据并发送给用户。此时,用户不会直接卡在主界面,而是会看到一个连续的抓包过程。提高用户体验,同时,也提高处理运行效率。

关键代码如下:

void MyNetDump::startPcap()
{//清空list中的数据 //当前表中有数据的时候if (!isStop){QMessageBox::StandardButton result = QMessageBox::question(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("正在抓包,是否重新开始?"));if (result == QMessageBox::Yes){this->stopPcap();}else{return;}}isStop = false;clearData();//如果没有选择网卡,就默认使用第1块if (SelectedDevices == nullptr){selectNIC(0);}std::cout << "Listening on Devices : " << SelectedDevices->getDesc() << std::endl;//打开 选择的接口if (!SelectedDevices->open()){std::cerr << "Cannot open device" << std::endl;exit(1);}std::cout << std::endl << "Starting async capture..." << std::endl;//开始计时tCounter.tic();//开始异步抓包 SelectedDevices->startCapture(onPacketArrives, hr_Packet);}

停止抓包stopPcap():

代码的基本逻辑如下:

判断是否选择了网卡,只有被选择的网卡同时是处于活跃状态的网卡才能被停止。

void MyNetDump::stopPcap()
{isStop = true;// stop capturing packetsif (SelectedDevices != nullptr && SelectedDevices->captureActive()){SelectedDevices->stopCapture();}}

清除数据clearData():

代码逻辑如下:

判断当前的显示列表中是否有数据,如果有数据,则会弹出提示窗口,判断用户是否对数据进行保存。然后清除所有的显示及缓存的数据。

void MyNetDump::clearData()
{if (ui.wTable_data->rowCount() > 0){QMessageBox::StandardButton result = QMessageBox::question(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("是否保存数据?"));if (result == QMessageBox::Yes){std::cout << "yes";savePacket();}else{std::cout << "no";}}hr_Packet->clearPacket();ui.wTable_data->clearContents();ui.wTable_data->setRowCount(0);ui.pte_data->clear();//利用设置一个空的model的方式,删除所有的数据//设置tree_viewQStandardItemModel* model = new QStandardItemModel(this);//设置表头model->setHorizontalHeaderLabels(QStringList() << QString::fromLocal8Bit("协议层") << QString::fromLocal8Bit("信息"));//设置model ui.wTree_data->setModel(model);
}

2.3 协议分析

协议分析的所有的代码逻辑如下:

在选中数据列表中的一个数据包的情况下,获取选中数据包的行号,根据行号,取出缓存的数据包,并将数据的原始数据转换一个十六进制的字符串,显示在正面的输出框中。同时,根据不同层的协议,选择不同的解析函数,对数据包进行逐层解析。

关键代码如下:

void MyNetDump::analysisPacket(int row, int col)
{//首先从保存的数据包中获得选中行代表的数据包/* std::cout << "当前选中的行为 :" << row << "/" << ui.wTable_data->rowCount()<< std::endl;std::cout << "总保存数据包为:" << hr_Packet->packetCount() << std::endl;*/if (row == -1){return;}sPacket spacket= hr_Packet->getPacket(row);//显示数据包的16进制信息,将信息写入到PlainText控件中 displayHexString(pcpp::byteArrayToHexString(spacket.rawPacket.getRawData(), spacket.rawPacket.getRawDataLen()).c_str());//std::vector<std::string> infos;//取出所有的数据包信息pcpp::Packet _packet(&spacket.rawPacket);QStandardItemModel* model = new QStandardItemModel(ui.wTree_data);model->setHorizontalHeaderLabels(QStringList() << QString::fromLocal8Bit("协议层") << QString::fromLocal8Bit("信息"));pcpp::Layer *_layer = _packet.getFirstLayer();//其次对数据包表层进行解析do{   QList<QStandardItem*> Items;//此处代码比较丑,一时间没想好怎么做pcpp::ProtocolType p = _layer->getProtocol();switch (p){case pcpp::Ethernet:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::EthLayer>(p), &Items);break;case pcpp::ARP:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::ArpLayer>(p), &Items);break;case pcpp::IPv4:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::IPv4Layer>(p), &Items);break;case pcpp::IPv6:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::IPv6Layer>(p), &Items);break;case pcpp::ICMP:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::IcmpLayer>(p), &Items);break;case pcpp::TCP:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::TcpLayer>(p), &Items);break;case pcpp::UDP:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::UdpLayer>(p), &Items);break;case pcpp::HTTPRequest:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::HttpRequestLayer>(p), &Items);break;case pcpp::HTTPResponse:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::HttpResponseLayer>(p), &Items);break;case pcpp::SSL:hr_Packet->LayerHandler(_packet.getLayerOfType<pcpp::SSLLayer>(p), &Items);break;default:hr_Packet->LayerHandler(_layer, &Items);break;}model->appendRow(Items);} while ((_layer = _layer->getNextLayer())!=NULL); ui.wTree_data->setModel(model);}

协议分析,主要实现了以下的协议分析功能:

2.3.1 Ethernet层的协议分析

 以太网层的协议分析比较简单,只对目的地址、源地址、数据长度及帧中所有数据进行取出。

关键代码如下:

void PacketHandler::LayerHandler(const pcpp::EthLayer* pLayer, QList<QStandardItem*>* Items)
{// 显示基本的信息QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pLayer->getProtocol()).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pLayer->toString().c_str()));// 数据的处理addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pLayer->getDataLen()));addSubItems(siLayerType, QString("Data:"), QString("%1").arg(pcpp::byteArrayToHexString(pLayer->getData(), pLayer->getDataLen()).c_str()));Items->append(siLayerType);Items->append(siLayerInfo);}

2.3.2 ARP层的协议分析

对ARP的如下图所示:

关键代码如下 :

void PacketHandler::LayerHandler(const pcpp::ArpLayer* pARPLayer, QList<QStandardItem*>* Items)
{//  ARP包的处理顺序//  ARP包是最底层的包,直接解析就可以了。//  获取当前层,直接获取ARP层// 显示基本的信息pcpp::ProtocolType pType = pARPLayer->getProtocol();QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pType).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pARPLayer->toString().c_str()));addSubItems(siLayerType, QString("Header Length:"), QString("%1").arg(pARPLayer->getHeaderLen()));// ARP包的类型QString arpType = "";if (ntohs(pARPLayer->getArpHeader()->opcode) == pcpp::ARP_REQUEST){arpType = QString("ARP request");}else{arpType = QString("ARP replay");}addSubItems(siLayerType, QString("ARPType:"), arpType);// ARP包源MAC地址addSubItems(siLayerType, QString("src mac:"), QString("%1").arg(pARPLayer->getSenderMacAddress().toString().c_str()));addSubItems(siLayerType, QString("target mac:"), QString("%1").arg(pARPLayer->getTargetMacAddress().toString().c_str()));// ARP要解析的IP地址addSubItems(siLayerType, QString("src IP:"), QString("%1").arg(pARPLayer->getSenderIpAddr().toString().c_str()));addSubItems(siLayerType, QString("target IP:"), QString("%1").arg(QString("%1").arg(pARPLayer->getTargetIpAddr().toString().c_str())));// ARP 数据的处理addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pARPLayer->getDataLen()));addSubItems(siLayerType, QString("Data:"), QString("%1").arg(pcpp::byteArrayToHexString(pARPLayer->getData(), pARPLayer->getDataLen()).c_str()));Items->append(siLayerType);Items->append(siLayerInfo);
}

2.3.3 ICMP层的协议分析

解析如下图所示:

关键代码如下:

void PacketHandler::LayerHandler(const pcpp::IcmpLayer* pIcmpLayer, QList<QStandardItem*>* Items)
{// 显示基本的信息QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pIcmpLayer->getProtocol()).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pIcmpLayer->toString().c_str()));//icmp头消息pcpp::icmphdr* pIcmpHdr = pIcmpLayer->getIcmpHeader();addSubItems(siLayerType, QString("Message Type:"), QString("%1").arg(ntohs(pIcmpHdr->type)));addSubItems(siLayerType, QString("Message Code:"), QString("%1").arg(ntohs(pIcmpHdr->code)));addSubItems(siLayerType, QString("Message checksum:"), QString("0x%1").arg(QString::number(ntohs(pIcmpHdr->checksum),16).toUpper()));// 数据的处理addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pIcmpLayer->getDataLen()));addSubItems(siLayerType, QString("Data:"), QString("%1").arg(pcpp::byteArrayToHexString(pIcmpLayer->getData(), pIcmpLayer->getDataLen()).c_str()));Items->append(siLayerType);Items->append(siLayerInfo);
}

2.3.4 IPv4协议分析

关键代码如下:

void PacketHandler::LayerHandler(const pcpp::IPv4Layer* pLayer, QList<QStandardItem*>* Items)
{// 显示基本的信息QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pLayer->getProtocol()).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pLayer->toString().c_str()));// ip头处理/*  uint8_t   internetHeaderLength : 4uint8_t     ipVersion : 4uint8_t    typeOfServiceuint16_t   totalLengthuint16_t     ipIduint16_t    fragmentOffsetuint8_t   timeToLiveuint8_t   protocoluint16_t    headerChecksumuint32_t  ipSrcuint32_t   ipDst*/pcpp::iphdr* ipHeader = pLayer->getIPv4Header();addSubItems(siLayerType, QString("internetHeaderLength:"),QString("%1").arg(ipHeader->internetHeaderLength));addSubItems(siLayerType, QString("IpVersion:"),QString("%1").arg(ipHeader->ipVersion));addSubItems(siLayerType, QString("typeOfService:"),QString("0x%1").arg(pcpp::byteArrayToHexString(&ipHeader->typeOfService, 1).c_str()).toUpper());addSubItems(siLayerType, QString("TotalLength:"),QString("%1").arg(ipHeader->totalLength));addSubItems(siLayerType, QString("IP Identification Field:"),QString("0X%1").arg(QString::number(ipHeader->ipId, 16)).toUpper());addSubItems(siLayerType, QString("fragmentOffset:"),QString("0x%1").arg(QString::number(be16toh(ipHeader->fragmentOffset & (uint16_t)0xFF1F) * 8, 16).toUpper()));addSubItems(siLayerType, QString("timeToLive:"),QString("%1").arg(QString::number(ipHeader->timeToLive)));addSubItems(siLayerType, QString("protocol:"), QString("%1").arg(getIPProtocolTypes(pcpp::IPProtocolTypes(ipHeader->protocol))));addSubItems(siLayerType, QString("headerChecksum:"),QString("%1").arg(QString::number(ipHeader->headerChecksum, 16)));// 数据的处理addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pLayer->getDataLen()));addSubItems(siLayerType, QString("Data:"), QString("0x%1").arg(pcpp::byteArrayToHexString(pLayer->getData(), pLayer->getDataLen()).c_str()).toUpper());Items->append(siLayerType);Items->append(siLayerInfo);
}

2.3.5 IPv6协议分析

IPv6的解析如下图所示:

关键代码如下:

void PacketHandler::LayerHandler(const pcpp::IPv6Layer* pLayer, QList<QStandardItem*>* Items)
{// 显示基本的信息QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pLayer->getProtocol()).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pLayer->toString().c_str()));/**   uint8_t trafficClass:4,             // Traffic class *   ipVersion:4;           // IP version number, has the value of 6 for IPv6 uint8_t flowLabel[3];             // Flow label uint16_t payloadLength;           // The size of the payload in octets, including any extension headers uint8_t nextHeader;           // Specifies the type of the next header (protocol). Must be one of ::IPProtocolTypes uint8_t hopLimit;             // Replaces the time to live field of IPv4 uint8_t ipSrc[16];           // Source address uint8_t ipDst[16];            // Destination address */pcpp::ip6_hdr* ip6Header = pLayer->getIPv6Header();addSubItems(siLayerType, QString("Traffic class :"), QString("%1").arg(ip6Header->trafficClass));addSubItems(siLayerType, QString("IP version :"), QString("%1").arg(ip6Header->ipVersion));addSubItems(siLayerType, QString("Flow label :"), QString("0x%1").arg(pcpp::byteArrayToHexString(ip6Header->flowLabel,3).c_str()).toUpper());addSubItems(siLayerType, QString("Payload length :"), QString("%1").arg(ip6Header->payloadLength));addSubItems(siLayerType, QString("Next header(protocol):"), QString("0x%1").arg(getIPProtocolTypes(pcpp::IPProtocolTypes(ip6Header->nextHeader))));addSubItems(siLayerType, QString("Hop Limit :"), QString("%1").arg(ip6Header->hopLimit));// 数据的处理addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pLayer->getDataLen()));addSubItems(siLayerType, QString("Data:"), QString("0x%1").arg(pcpp::-byteArrayToHexString(pLayer->getData(), pLayer->getDataLen()).c_str()).toUpper());Items->append(siLayerType);Items->append(siLayerInfo);
}

2.3.6 TCP协议分析

如下图所示:

关键代码如下:

void PacketHandler::LayerHandler(const pcpp::TcpLayer* pLayer, QList<QStandardItem*>* Items)
{// 显示基本的信息QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pLayer->getProtocol()).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pLayer->toString().c_str()));/*uint16_t portSrc;// Source TCP portuint16_t portDst;// Destination TCP port uint32_t sequenceNumber;// Sequence number uint32_t ackNumber;// Acknowledgment number uint16_t reserved : 4,dataOffset : 4,// Specifies the size of the TCP header in 32-bit words finFlag : 1,// FIN flag synFlag : 1,// SYN flag rstFlag : 1,// RST flag pshFlag : 1,// PSH flag ackFlag : 1,// ACK flag urgFlag : 1,// URG flag eceFlag : 1,// ECE flag cwrFlag : 1;// CWR flaguint16_t windowSize;// The size of the receive window, which specifies the number of window size units (by default, bytes) uint16_t  headerChecksum;// The 16-bit checksum field is used for error-checking of the header and data uint16_t  urgentPointer;// If the URG flag (@ref tcphdr#urgFlag) is set, then this 16-bit field is an offset from the sequence number indicating the last urgent data byte */pcpp::tcphdr* tcpHeader = pLayer->getTcpHeader();addSubItems(siLayerType, QString("Source TCP port:"), QString("%1").arg(ntohs(tcpHeader->portSrc)));addSubItems(siLayerType, QString("Destination TCP port:"), QString("%1").arg(ntohs(tcpHeader->portDst)));addSubItems(siLayerType, QString("Sequence number :"), QString("%1").arg(ntohs(tcpHeader->sequenceNumber)));addSubItems(siLayerType, QString("Acknowledgment number :"), QString("%1").arg(ntohs(tcpHeader->ackNumber)));addSubItems(siLayerType, QString("Flags:"), QString("SYN:%1,SYN:%2,RST:%3,PSH:%4,ACK:%5,URG:%6,ECE:%7,CWR:%8").arg(ntohs(tcpHeader->finFlag)).arg(ntohs(tcpHeader->synFlag)).arg(ntohs(tcpHeader->rstFlag)).arg(ntohs(tcpHeader->pshFlag)).arg(ntohs(tcpHeader->ackFlag)).arg(ntohs(tcpHeader->urgFlag)).arg(ntohs(tcpHeader->eceFlag)).arg(ntohs(tcpHeader->cwrFlag)));addSubItems(siLayerType, QString("receive window size:"), QString("%1").arg(ntohs(tcpHeader->windowSize)));addSubItems(siLayerType, QString("header Checksum:"), QString("0x%1").arg(QString::number(ntohs(tcpHeader->headerChecksum),16).toUpper()));addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pLayer->getDataLen()));addSubItems(siLayerType, QString("Data:"), QString("%1").arg(pcpp::byteArrayToHexString(pLayer->getData(), pLayer->getDataLen()).c_str()));Items->append(siLayerType);Items->append(siLayerInfo);
}

2.3.7 UDP协议分析

关键代码如下:

void PacketHandler::LayerHandler(const pcpp::UdpLayer* pLayer, QList<QStandardItem*>* Items)
{// 显示基本的信息QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pLayer->getProtocol()).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pLayer->toString().c_str()));/*        uint16_t portSrc;// Source portuint16_t portDst;// Destination portuint16_t length;// Length of header and payload in bytesuint16_t headerChecksum;//  Error-checking of the header and data
*/pcpp::udphdr* udpHeader = pLayer->getUdpHeader();addSubItems(siLayerType, QString("Source UDP port:"), QString("%1").arg(ntohs(udpHeader->portSrc)));addSubItems(siLayerType, QString("Destination UDP port:"), QString("%1").arg(ntohs(udpHeader->portDst)));addSubItems(siLayerType, QString("Length:"), QString("%1").arg(ntohs(udpHeader->length)));addSubItems(siLayerType, QString("headerChecksum:"), QString("0x%1").arg(QString::number(ntohs(udpHeader->headerChecksum),16).toUpper()));// 数据的处理addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pLayer->getDataLen()));addSubItems(siLayerType, QString("Data:"), QString("%1").arg(pcpp::byteArrayToHexString(pLayer->getData(), pLayer->getDataLen()).c_str()));Items->append(siLayerType);Items->append(siLayerInfo);
}

2.3.8 HTTP协议分析

分为Http request 与http response.

关键代码如下:

void PacketHandler::LayerHandler(const pcpp::HttpRequestLayer* pLayer, QList<QStandardItem*>* Items)
{// 显示基本的信息QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pLayer->getProtocol()).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pLayer->toString().c_str()));// 数据的处理addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pLayer->getDataLen()));addSubItems(siLayerType, QString("Data:"), QString("%1").arg(std::string((char*)pLayer->getData(), pLayer->getDataLen()).c_str()));Items->append(siLayerType);Items->append(siLayerInfo);
}

HTPP响应包

关键代码如下

void PacketHandler::LayerHandler(const pcpp::HttpResponseLayer* pLayer, QList<QStandardItem*>* Items)
{// 显示基本的信息QStandardItem* siLayerType = new QStandardItem(QString(getStrProtocolType(pLayer->getProtocol()).c_str()));QStandardItem* siLayerInfo = new QStandardItem(QString(pLayer->toString().c_str()));// 数据的处理addSubItems(siLayerType, QString("Data Length:"), QString("%1").arg(pLayer->getDataLen()));// addSubItems(siLayerType, QString("Data:"), QString("0x%1").arg(pcpp::byteArrayToHexString(pLayer->getData(), pLayer->getDataLen()).c_str()));addSubItems(siLayerType, QString("Data:"), QString("%1").arg(std::string((char*)pLayer->getData(), pLayer->getDataLen()).c_str()));Items->append(siLayerType);Items->append(siLayerInfo);
}

2.3.9 其他协议分析

还有很其他没有数据包没有进行详细的解析,但也作了一个简单的协议的识别与简单的解析。如DNS,ssl等,但如果下层协议是已经解析的协议,则会对下层的协议进行协议解析。

2.4 文件的读写功能

本功能实现了.pcap格式文件的读写功能。可将抓取的包保存成一个pcap格式的文件,保存的文件与Wireshark保存文件可以通用。在以下情况下可以触发文件保存功能:

  1. 点击保存按钮时
  2. 清除数据时
  3. 关闭有数据窗口时

文件的打开功能:

在有一个数据文件的情况下,可以利用打开功能,将一个pcap文件打开,并显示在窗口中。

点击打开文件按钮

选择保存的文件:

打开文件:

三、后续扩展

1.增加过滤规则的设置

当前已经为数据包的过滤规则设置留了界面接口。但在功能实现上,还未能实现,在后期,如果需要,可以利用该接口,进行过滤的实现。

2.增加更多协议类型的解析能力

在协议解析方面,当前只做了有数的几种,但代码中由一个重载的函数实现,可以十分方便的在后续进行拓展。

3.界面的美化

界面主要是可以从显示与易用的方面进行考虑。尤其是对列表的分协议颜色设置。在代码中与功能按键上也设计了接口,但当前该功能尚未实现。

4.代码整体性能的调整

代码虽说是利用了多线程,但在数据的处理,尤其是显示与数据的处理上,还有一定的耦合度,在数据量比较大的时候,存在一定的卡顿现象。后续可以进一步的解耦合,以提高界面的显示速度。

四、源代码:

地址:源代码

c++环境下qt+pcpp(winpcap)实现的网络抓包(sniff)程序相关推荐

  1. WinPcap网络抓包分析程序--总结

    应付大作业写的一个程序,先给出程序的运行界面 程序的核心内容是抓包然后分析数据,我做的最多的也是协议分析这块内容.上面首先给出的是当前网络的上传下载速度,这块内容我是参考Windows性能计数器来写的 ...

  2. 网络抓包-winpcap

    1. winpcap 1. winpcap简介 (windows packet capture)是windows平台下一个免费,公共的网络访问系统.开发winpcap这个项目的目的在于为win32应用 ...

  3. Python下的网络抓包库

    一直以来对于Python下的网络抓包库很疑惑,搞不清楚pylibpcap.pypcap.pycap这些库之间是什么关系,混沌了很长时间,在网上G了很久慢慢搞清楚了,其实这些都是libpcap的Pyth ...

  4. 硬干货!一张图弄清楚在ESXi下如何进行网络抓包

    对于网络问题,抓包一直是一个比较简单方便的"大招".由于在esxi环境下可以在不同的层面下抓包,因此在什么地方抓包,怎么抓包一直让我觉得很复杂,于是每次操作之前我都要再检查一次手册 ...

  5. esxi vsphere的端口_硬干货!一张图弄清楚在ESXi下如何进行网络抓包

    对于网络问题,抓包一直是一个比较简单方便的"大招".由于在esxi环境下可以在不同的层面下抓包,因此在什么地方抓包,怎么抓包一直让我觉得很复杂,于是每次操作之前我都要再检查一次手册 ...

  6. Charles网络抓包新手入门教程-(二)软件配置与环境安装(ios14-IOS系统安装配置)

    目录 一.环境配置 二.开启电脑代理设置 三.给IPhone手机设置代理服务器 四.Iphone手机下载并信任证书 五.Charles抓取手机数据包 六.总结 一.环境配置 1.Win10系统 2.C ...

  7. 安卓抓包工具 linux,Android 下使用tcpdump网络抓包方法

    Android 下使用tcpdump网络抓包方法 抓包需要tcpdump以及Root权限,tcpdump在本文后有下载. 首先把tcpdump传进手机,用adb命令(放SD卡有时会有问题,我一次可以用 ...

  8. 嵌入式 linux usbmon,浅析linux下替代usbhound的usb总线sniffer抓包模块usbmon安装和使用...

    浅析linux下替代usbhound的usb总线sniffer抓包模块usbmon安装和使用 操作系统: ubuntu 8.10 内核版本: 2.6.27-7-generic ubuntu 8.10内 ...

  9. 网络抓包技术备忘 - Wireshark/Fiddler/Libpcap/Npcap/WinPcap/SharpPcap

    本文链接:网络抓包技术备忘-俊哥V-CSDN博客 1.常用工具 浏览器自带,如谷歌浏览器的开发人员工具. Fiddler:主要是捕获HTTP.HTTPS数据包. Wireshark:网络协议分析工具, ...

最新文章

  1. 【Qt】Qt动态库和静态库的创建和使用
  2. LeetCode Pow(x, n)
  3. RequestWindowFeature
  4. 大小端模式,stm32采用小端模式
  5. C语言bcd码减法过程,bcd码的减法运算规则举例.ppt
  6. 有趣的js匿名函数写法(function嵌套)
  7. 求数组中数对的最大值
  8. createsolidcaret 后 很快就不闪烁了_为什么LED灯会越用越暗?为什么会闪烁?
  9. mysql note级别_Mysql5.7 的错误日志中最常见的note级别日志解释
  10. everedit 格式化json_Mac Init
  11. Nagios下载安装配置
  12. 通讯录系统图形化界面(C++,Qt5.12)(Visual Studio2019,QtCreator)(初学)
  13. 2020年毕业水平测试计算机内容,2020年高中信息技术学业水平测试指导
  14. doodoo.js快速入门教程 1
  15. 计算机网络(16)数据链路层:数据链路层的功能
  16. 使用GUID分区表(GPT)的笔记本硬盘做移动硬盘,windowsXP系统不识别的问题
  17. vue判断身份证是否合法
  18. 0基础趣学SEO,引爆流量,让客户主动找上门的躺赚神技
  19. i3 1005g1和i5 10210u哪个好
  20. IDEA之翻译器的妙用Translation

热门文章

  1. 仿淘宝闲鱼的 TabBar
  2. python turtle画小兔子图片_如何用Python画一只兔子——turtle库circle()画圆函数的详细用法介绍...
  3. 力扣 1816. 截断句子
  4. Gromacs g_mmpbsa结合能分析
  5. 160809610袁韬淳
  6. 电脑上如何使用Excel提升工作效率?
  7. Web简易图片浏览器
  8. 协议是www客户端与www服务器,( )协议是WWW客户端与WWW服务器之间的应用层传输协议。...
  9. ssm+jsp计算机毕业设计大学生收书系统j7k68(程序+LW+源码+远程部署)
  10. 中国企业直播市场发展趋势