diff options
-rw-r--r-- | mainwindow.cpp | 18 | ||||
-rw-r--r-- | pcapplusplus.cpp | 16 |
2 files changed, 19 insertions, 15 deletions
diff --git a/mainwindow.cpp b/mainwindow.cpp index d4aeac2..edd8dfd 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -155,11 +155,8 @@ MainWindow::MainWindow(QWidget *parent) connect(ui->actionOpen, &QAction::triggered, this, [this, enableTableButtons, enableMenuButtons, enableHexEditButtons](bool){ QString fileName = QFileDialog::getOpenFileName(this, tr("Open PCAP File"), "", tr("PCAP Files (*.pcap);;All Files (*.*)")); if (fileName.length() > 0) { - if (ppp) { - delete ppp; - ppp = nullptr; - } ui->lineEdit->clear(); + ui->tableWidget->clearSelection(); ui->tableWidget->clear(); ui->tableWidget->setRowCount(0); myHexEdit.editor.data().data_ptr()->clear(); @@ -167,6 +164,11 @@ MainWindow::MainWindow(QWidget *parent) enableMenuButtons(this, true); enableHexEditButtons(this, false); ui->actionSave_Selection->setEnabled(false); + + if (ppp) { + delete ppp; + ppp = nullptr; + } ppp = new PcapPlusPlus(fileName.toStdString()); if (ppp) emit processPcap(); } @@ -205,6 +207,7 @@ MainWindow::MainWindow(QWidget *parent) pcapWriter.writePacket(*rawPacket); } pcapWriter.flush(); + pcapWriter.close(); } } }); @@ -220,10 +223,15 @@ MainWindow::MainWindow(QWidget *parent) if (!pcapWriter.open()) throw std::runtime_error("Could not open file " + fileName.toStdString() + " for writing."); { - for (const auto & selected : ui->tableWidget->selectedRanges()) { + QList<QTableWidgetSelectionRange> selection(ui->tableWidget->selectedRanges()); + std::sort(selection.begin(), selection.end(), [](const QTableWidgetSelectionRange & a, const QTableWidgetSelectionRange & b){ + return a.topRow() < b.topRow(); + }); + for (const auto & selected : selection) { pcapWriter.writePacket(ppp->getRawPacket(selected.topRow())); } pcapWriter.flush(); + pcapWriter.close(); } } }); diff --git a/pcapplusplus.cpp b/pcapplusplus.cpp index 004db71..d8b3a1c 100644 --- a/pcapplusplus.cpp +++ b/pcapplusplus.cpp @@ -125,8 +125,7 @@ bool PcapPlusPlus::randomizeIp(size_t index, bool isSourceIp) { std::default_random_engine generator(std::chrono::system_clock::now().time_since_epoch().count()); auto retval = false; - pcpp::RawPacket rawPacket(getRawPacket(index)); - pcpp::Packet parsedPacket(&rawPacket); + auto parsedPacket = pcpp::Packet(&getRawPacket(index)); auto * ip4Layer = parsedPacket.getLayerOfType<pcpp::IPv4Layer>(); auto * ip6Layer = parsedPacket.getLayerOfType<pcpp::IPv6Layer>(); @@ -134,9 +133,9 @@ bool PcapPlusPlus::randomizeIp(size_t index, bool isSourceIp) std::uniform_int_distribution<unsigned int> ip4Distribution(0, 0xFFFFFFFF); if (isSourceIp) - ip4Layer->setSrcIPv4Address(pcpp::IPv4Address(ip4Distribution(generator))); + ip4Layer->getIPv4Header()->ipSrc = pcpp::IPv4Address(ip4Distribution(generator)).toInt(); else - ip4Layer->setDstIPv4Address(pcpp::IPv4Address(ip4Distribution(generator))); + ip4Layer->getIPv4Header()->ipDst = pcpp::IPv4Address(ip4Distribution(generator)).toInt(); retval = true; } @@ -146,17 +145,14 @@ bool PcapPlusPlus::randomizeIp(size_t index, bool isSourceIp) unsigned long long int newIp6Addr[2] { ip6Distribution(generator), ip6Distribution(generator) }; if (isSourceIp) - ip6Layer->setSrcIPv6Address(reinterpret_cast<uint8_t *>(newIp6Addr)); + std::memcpy(ip6Layer->getIPv6Header()->ipSrc, reinterpret_cast<uint8_t *>(newIp6Addr), 16); else - ip6Layer->setDstIPv6Address(reinterpret_cast<uint8_t *>(newIp6Addr)); + std::memcpy(ip6Layer->getIPv6Header()->ipDst, reinterpret_cast<uint8_t *>(newIp6Addr), 16); retval = true; } - rawPackets.erase(rawPackets.cbegin() + index); - rawPackets.insert(rawPackets.cbegin() + index, rawPacket); - parsedPackets.erase(parsedPackets.cbegin() + index); - parsedPackets.insert(parsedPackets.cbegin() + index, parsedPacket); + parsedPackets.at(index) = parsedPacket; return retval; } |