赞
踩
本软件是利用c++语言基于Qt与PcapPlusPlus(以下简称PcPP)库在vs2019中开发的一个单一的windows应用。Qt是一个良好的跨平台界面设计库,简单易用,可移植性好;PcapPcapPlus是一个多平台的c++库,用于捕获、解析和制作网络数据包,功能强大,易于使用,简洁高效。本程序使用在开发过程中,利用异步抓包的方式,将ui线程作为主线程,抓包及数据处理线程作为子线程,保证用户体验的一个连贯性,同时,保证抓包的效率。
更新时间:
2022年9月2日14:27:09:添加代码信息
软件的基本运行如下图所示:
在运行本程序前,需要安装WinPcap 。
在安装WinPcap之后,直接点击 下图中的应用程序可以直接运行。
其他功能在正面介绍时会具体的演示。
软件当前已经基本上实现了获取当前主机的网卡、抓包、协议分析(包括以太网、ARP、IPv4、IPv6、TCP、UDP、HTTP、ICMP等)、pcap文件的保存与打开等功能。正面将对各个功能模块及主要代码进行说明。
网卡列表功能主要是获取当前主机上所有的网卡列表,功能实现如下图所示:
关键代码实现如下:
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());
- }
-
- }
在单击开始抓包按钮后,或通过菜单中的开始抓包子菜单启动一次抓包。获取到的数据包会直接显示在基本信息列表栏中 。可以看简略的数据包信息,包括源地址、目的地址、数据包的最上层协议类型、数据的总长度(根据以太网数据包的长度计算的)及基本的信息。
开始抓包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 packets
- if (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_view
- QStandardItemModel* model = new QStandardItemModel(this);
-
- //设置表头
- model->setHorizontalHeaderLabels(QStringList() << QString::fromLocal8Bit("协议层") << QString::fromLocal8Bit("信息"));
-
- //设置model
- ui.wTree_data->setModel(model);
- }
协议分析的所有的代码逻辑如下:
在选中数据列表中的一个数据包的情况下,获取选中数据包的行号,根据行号,取出缓存的数据包,并将数据的原始数据转换一个十六进制的字符串,显示在正面的输出框中。同时,根据不同层的协议,选择不同的解析函数,对数据包进行逐层解析。
关键代码如下:
- 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);
-
- }
协议分析,主要实现了以下的协议分析功能:
以太网层的协议分析比较简单,只对目的地址、源地址、数据长度及帧中所有数据进行取出。
关键代码如下:
- 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);
-
- }
对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);
- }
解析如下图所示:
关键代码如下:
- 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);
- }
关键代码如下:
- 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 : 4
- uint8_t ipVersion : 4
- uint8_t typeOfService
- uint16_t totalLength
- uint16_t ipId
- uint16_t fragmentOffset
- uint8_t timeToLive
- uint8_t protocol
- uint16_t headerChecksum
- uint32_t ipSrc
- uint32_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);
- }
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);
- }
如下图所示:
关键代码如下:
- 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 port
- uint16_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 flag
- uint16_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);
- }
关键代码如下:
- 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 port
- uint16_t portDst;// Destination port
- uint16_t length;// Length of header and payload in bytes
- uint16_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);
- }
分为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);
- }
还有很其他没有数据包没有进行详细的解析,但也作了一个简单的协议的识别与简单的解析。如DNS,ssl等,但如果下层协议是已经解析的协议,则会对下层的协议进行协议解析。
本功能实现了.pcap格式文件的读写功能。可将抓取的包保存成一个pcap格式的文件,保存的文件与Wireshark保存文件可以通用。在以下情况下可以触发文件保存功能:
文件的打开功能:
在有一个数据文件的情况下,可以利用打开功能,将一个pcap文件打开,并显示在窗口中。
点击打开文件按钮
选择保存的文件:
打开文件:
当前已经为数据包的过滤规则设置留了界面接口。但在功能实现上,还未能实现,在后期,如果需要,可以利用该接口,进行过滤的实现。
在协议解析方面,当前只做了有数的几种,但代码中由一个重载的函数实现,可以十分方便的在后续进行拓展。
界面主要是可以从显示与易用的方面进行考虑。尤其是对列表的分协议颜色设置。在代码中与功能按键上也设计了接口,但当前该功能尚未实现。
代码虽说是利用了多线程,但在数据的处理,尤其是显示与数据的处理上,还有一定的耦合度,在数据量比较大的时候,存在一定的卡顿现象。后续可以进一步的解耦合,以提高界面的显示速度。
四、源代码:
地址:源代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。