๋ฐ˜์‘ํ˜•

PcapPlusPlus๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„ ๋‹จ๊ณ„๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

[Wireshark] Visual Studio์—์„œ PcapPlusPlus ์‚ฌ์šฉ์„ ์œ„ํ•œ ์ค€๋น„ ๋‹จ๊ณ„์™€ ์˜ˆ์ œ ์ฝ”๋“œ ์‹คํ–‰ํ•˜๊ธฐ

์˜ˆ์ œ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

๋ณธ๋ฌธ์˜ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ๋ณ„๋กœ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์‹ค์‹œ๊ฐ„ ๊ฐ์ง€๊ฐ€ ํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์„ ํƒํ•˜๊ธฐ
  • ์„ ํƒ๋œ ๋„คํŠธ์›Œํฌ ์–ด๋Œ‘ํ„ฐ๋กœ ๋“ค์–ด์˜ค๋Š” ์‹ค์‹œ๊ฐ„ ํŒจํ‚ท์„ ์ฝ˜์†” ์ฐฝ์— ๋ณด์—ฌ์ฃผ๊ธฐ
  • ํ•ด๋‹น ํŒจํ‚ท์„ pcapng ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ธฐ

1. ๋„คํŠธ์›Œํฌ ์–ด๋Œ‘ํ„ฐ ๋ชฉ๋ก ์–ป๊ธฐ

์™€์ด์–ด์ƒคํฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ œ์ผ ๋จผ์ € ๋ณด์ด๋Š” ๊ฒƒ์ด ์–ด๋Œ‘ํ„ฐ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์–ด๋Œ‘ํ„ฐ๋ฅผ ์„ ํƒํ•˜๊ณ  ์—ด๊ฒŒ ๋˜๋ฉด ์บก์ฒ˜๊ฐ€ ์‹œ์ž‘๋˜์ง€์š”.

์™€์ด์–ด์ƒคํฌ์˜-์บก์ณ-๋ชฉ๋ก
์™€์ด์–ด์ƒคํฌ์˜ ์บก์ณ ๋ชฉ๋ก

PcapPlusPlus๋กœ ๋„คํŠธ์›Œํฌ ๋ชฉ๋ก์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ์•„์ฃผ ์‰ฝ์Šต๋‹ˆ๋‹ค.

#include <PcapLiveDevice.h>
#include <PcapLiveDeviceList.h>

std::cout << "===== Device List =====" << std::endl;
int index = 0;
//auto ํƒ€์ž…์€ std::vector<pcpp::PcapLiveDevice*> ์ž…๋‹ˆ๋‹ค.	
auto list = pcpp::PcapLiveDeviceList::getInstance().getPcapLiveDevicesList();
for (const auto& dev : list)
{
	std::cout << "[" << index++ << "] " << dev->getDesc() << std::endl;
}

์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ ์–ป์–ด์ง„ ๋ชฉ๋ก์„ ์ฝ˜์†” ์ฐฝ์— ์ถœ๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PcapPlusPlus๋กœ-์–ป์–ด์ง„-๋„คํŠธ์›Œํฌ-๋ชฉ๋ก
PcapPlusPlus๋กœ ์–ป์–ด์ง„ ๋„คํŠธ์›Œํฌ ๋ชฉ๋ก

2. ์–ด๋Œ‘ํ„ฐ ์—ด๊ณ  ๋‹ซ๊ธฐ

๋ชฉ๋ก์—์„œ ์–ป์–ด์ง„ PcapLiveDevice ๊ฐ์ฒด์˜ open() ํ•จ์ˆ˜๋กœ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ, ํƒ€์ž„์•„์›ƒ์ด๋‚˜ ๋ฒ„ํผ ํฌ๊ธฐ, ๋ฌด์ฐจ๋ณ„๋ชจ๋“œ(Promiscuous mode) ๋“ฑ์„ ์„ค์ •ํ•˜๊ธฐ ์›ํ•œ๋‹ค๋ฉด, DeviceConfiguration์„ ์ธ์ž๋กœ ๋„˜๊ฒจ ์„ค์ •๊ณผ ๋™์‹œ์— ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pcpp::PcapLiveDevice* dev;
//Select capture device
dev->open();
//or
pcpp::PcapLiveDevice::DeviceConfiguration config;
config.mode = pcpp::PcapLiveDevice::DeviceMode::Promiscuous;
config.packetBufferTimeoutMs = 1000;
dev->open(config);

 

์บก์ฒ˜๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด, ๊ฐ„๋‹จํ•˜๊ฒŒ close()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

dev->close();

3. ์บก์ฒ˜ ์‹œ์ž‘ํ•˜๊ณ  ๋ฉˆ์ถ”๊ธฐ

์–ด๋Œ‘ํ„ฐ๋ฅผ ์—ด์—ˆ๋‹ค๋ฉด, ํŒจํ‚ท์„ ํš๋“ํ•˜๊ธฐ ์œ„ํ•ด ์บก์ฒ˜ ์‹œ์ž‘์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์บก์ฒ˜๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋Š” startCapture()๋กœ, 4๊ฐœ์˜ ์˜ค๋ฒ„๋กœ๋”ฉ ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๋ชฉ์ ์ด ์—†๋‹ค๋ฉด, ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ธฐ๋ณธํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท์ด ์บก์ฒ˜๋  ๋•Œ๋งˆ๋‹ค ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค.

startCapture-๊ธฐ๋ณธ-ํ•จ์ˆ˜
startCapture ๊ธฐ๋ณธ ํ•จ์ˆ˜

์บก์ฒ˜๋ฅผ ์ •์ง€ํ•˜๋ ค๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ stopCapture()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

//์–ด๋Œ‘ํ„ฐ์—์„œ ํŒจํ‚ท์ด ํš๋“๋  ๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
void packetArrives(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev, void* cookie)
{
	//rawPacket์—๋Š” ํš๋“๋œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.
}

//...
dev->startCapture(packetArrives, nullptr);

//...
dev->stopCapture();

4. ์บก์ฒ˜๋œ ํŒจํ‚ท ๋ถ„์„ํ•˜๊ธฐ

์บก์ฒ˜๋œ RawPacket์—๋Š” ์™€์ด์–ด์ƒคํฌ์—์„œ ๋ณด์ด๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค. pcpp::Packet ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฐ ๋ ˆ์ด์–ด์˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

void packetArrives(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev, void* cookie)
{
    pcpp::Packet packet(rawPacket);
}

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒจํ‚ท์˜ ์ด๊ธธ์ด
  • ํ”„๋กœํ† ์ฝœ ํƒ€์ž…
  • Source IP, Destination IP Address ๋ฐ Port
  • ์ฒดํฌ์„ฌ ๊ณ„์‚ฐ
  • Payload ๋ฐ์ดํ„ฐ
  • TCP Flag ๋“ฑ

์ด ์™ธ์— ์ง์ ‘ ๋ฐ์ดํ„ฐ ํŽธ์ง‘์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, Data Pointer๋ฅผ ์–ป์–ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ํŒจํ‚ท ๊ธฐ๋กํ•˜๊ธฐ(Dump)

PcapPlusPlus๋„ ์™€์ด์–ด์ƒคํฌ์ฒ˜๋Ÿผ ์บก์ฒ˜๋œ ํŒจํ‚ท์„ pcap ๋˜๋Š” pcapng ํŒŒ์ผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <PcapFileDevice.h>

pcpp::PcapFileWriterDevice dumper("test.pcapng");
dumper.open();

//...
dumper.writePacket(rawPacket);
//...

dumper.close();

๋งŒ์•ฝ, ์ด๋ฏธ ์ €์žฅ๋œ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€ ๊ธฐ๋ก๋œ ํŒจํ‚ท์„ ๊บผ๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. pcap๊ณผ pcapng ํŒŒ์ผ์˜ ์ฝ๊ณ  ์“ฐ๊ธฐ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

//pcap ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
pcpp::PcapFileReaderDevice pcapReader("input.pcap");
pcapReader.open();

//pcapng ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ
pcpp::PcapNgFileWriterDevice pcapNgWriter("output.pcapng");
pcapNgWriter.open();

//raw packet ๊ฐ์ฒด
pcpp::RawPacket rawPacket;

//pcap ํŒŒ์ผ์˜ ํŒจํ‚ท์„ ์ฝ์–ด๋“ค์ธ ํ›„ pcapng ํŒŒ์ผ์— ์“ฐ๊ธฐ
while (pcapReader->getNextPacket(rawPacket)) {
  pcapNgWriter.writePacket(rawPacket);
}

pcapNgReader.close();
pcapNgWriter.close();

์˜ˆ์ œ ํ”„๋กœ์ ํŠธ ์„ค๋ช…

๋ณธ๋ฌธ์˜ ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์€ ๋„คํŠธ์›Œํฌ ์–ด๋Œ‘ํ„ฐ์— ์—ฐ๊ฒฐํ•œ ํ›„ 100๊ฐœ์˜ ํŒจํ‚ท์„ ํš๋“ํ•˜๊ณ  pcapng ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๋™์ž‘์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์šฉ๋Ÿ‰ ๋ฌธ์ œ๋กœ, ์ฒจ๋ถ€๋œ ํŒŒ์ผ์—๋Š” npcap๊ณผ pcapplusplus ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์€ ์ œ์™ธํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

ExamPcapPlusPlus.zip
0.00MB
์˜ˆ์ œ-ํ”„๋กœ๊ทธ๋žจ-์‹คํ–‰-ํ™”๋ฉด
์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ™”๋ฉด

์ •๋ฆฌํ•˜๋ฉฐ

๋ณธ๋ฌธ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ค„๋ดค์Šต๋‹ˆ๋‹ค. Pcap++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒจํ‚ท ์บก์ฒ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž์„ธํžˆ ๋ชจ๋ฅด๋”๋ผ๋„ ์•„์ฃผ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์ž˜ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์™€์ด์–ด์ƒคํฌ ๋ชป์ง€์•Š์€ ํŒจํ‚ท ๋ชจ๋‹ˆํ„ฐ๋ง์ด ๊ฐ€๋Šฅํ•˜๊ฒ ์ฃ ?

๋ฐ˜์‘ํ˜•