From a3e5d1e5e553591c8a431adbd2616df4d9183728 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Mon, 5 Sep 2022 09:48:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=97:=20=D0=A3=D1=80=D0=BE=D0=BA=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson_02/README.md | 46 ++++++++++++++++++++++ lesson_02/main.cpp | 90 ++++++++++++++++++++++++++++++++++++++++++++ lesson_02/test.pcap | Bin 0 -> 1046 bytes 3 files changed, 136 insertions(+) create mode 100644 lesson_02/README.md create mode 100644 lesson_02/main.cpp create mode 100644 lesson_02/test.pcap diff --git a/lesson_02/README.md b/lesson_02/README.md new file mode 100644 index 0000000..fbae2fc --- /dev/null +++ b/lesson_02/README.md @@ -0,0 +1,46 @@ +# simple sniffer + +Для запуска: + +```sh +./lesson_2 +``` + +Результат: + +```sh +./lesson_2 192.168.0.103 +Информация о сетевом интерфейсе: + Интерфейс: wlp3s0 + Описание: + MAC адрес: 64:6e:69:d4:ea:f5 + Шлюз: 192.168.0.254 + DNS сервер: 192.168.0.254 + +Тип слоя: Ethernet; Общие данные: 90 [байт]; Данные слоя: 14 [байт]; Полезная нагрузка слоя: 76 [байт] +Тип слоя: IPv4; Общие данные: 76 [байт]; Данные слоя: 20 [байт]; Полезная нагрузка слоя: 56 [байт] +Тип слоя: TCP; Общие данные: 56 [байт]; Данные слоя: 32 [байт]; Полезная нагрузка слоя: 24 [байт] +Тип слоя: Unknown; Общие данные: 24 [байт]; Данные слоя: 24 [байт]; Полезная нагрузка слоя: 0 [байт] + IP-адрес источника: 192.168.0.103 + IP-адрес назначения: 184.104.202.139 + IP ID: 12940 + TTL: 64 + +Тип слоя: Ethernet; Общие данные: 66 [байт]; Данные слоя: 14 [байт]; Полезная нагрузка слоя: 52 [байт] +Тип слоя: IPv4; Общие данные: 52 [байт]; Данные слоя: 20 [байт]; Полезная нагрузка слоя: 32 [байт] +Тип слоя: TCP; Общие данные: 32 [байт]; Данные слоя: 32 [байт]; Полезная нагрузка слоя: 0 [байт] + IP-адрес источника: 192.168.0.103 + IP-адрес назначения: 184.104.202.139 + IP ID: 12941 + TTL: 64 + +Тип слоя: Ethernet; Общие данные: 54 [байт]; Данные слоя: 14 [байт]; Полезная нагрузка слоя: 40 [байт] +Тип слоя: IPv4; Общие данные: 40 [байт]; Данные слоя: 20 [байт]; Полезная нагрузка слоя: 20 [байт] +Тип слоя: TCP; Общие данные: 20 [байт]; Данные слоя: 20 [байт]; Полезная нагрузка слоя: 0 [байт] + IP-адрес источника: 184.104.202.139 + IP-адрес назначения: 192.168.0.103 + IP ID: 0 + TTL: 57 + +... +``` \ No newline at end of file diff --git a/lesson_02/main.cpp b/lesson_02/main.cpp new file mode 100644 index 0000000..a1b3d72 --- /dev/null +++ b/lesson_02/main.cpp @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include + +std::string getProtocolTypeAsString(pcpp::ProtocolType protocolType) +{ + switch (protocolType) + { + case pcpp::Ethernet: + return "Ethernet"; + case pcpp::IPv4: + return "IPv4"; + case pcpp::TCP: + return "TCP"; + case pcpp::HTTPRequest: + case pcpp::HTTPResponse: + return "HTTP"; + default: + return "Unknown"; + } +} + +static bool onPacketArrivesBlockingMode(pcpp::RawPacket *packet, pcpp::PcapLiveDevice *dev, void *cookie) +{ + pcpp::Packet parsedPacket(packet); + + for (pcpp::Layer *curLayer = parsedPacket.getFirstLayer(); curLayer != NULL; curLayer = curLayer->getNextLayer()) + { + std::cout << "Тип слоя: " << getProtocolTypeAsString(curLayer->getProtocol()).c_str() + << "; Общие данные: " << (int) curLayer->getDataLen() + << " [байт]; Данные слоя: " << (int) curLayer->getHeaderLen() + << " [байт]; Полезная нагрузка слоя: " << (int) curLayer->getLayerPayloadSize() + << " [байт]" << std::endl; + } + + pcpp::IPv4Layer *ipLayer = parsedPacket.getLayerOfType(); + if (ipLayer == nullptr) + { + std::cerr << "Что-то пошло не так, не удалось найти уровень IPv4" << std::endl; + exit(4); + } + + std::cout << "\tIP-адрес источника: " << ipLayer->getSrcIPv4Address().toString() << std::endl + << "\tIP-адрес назначения: " << ipLayer->getDstIPv4Address().toString() << std::endl + << "\tIP ID: " << ntohs(ipLayer->getIPv4Header()->ipId) << std::endl + << "\tTTL: " << static_cast(ipLayer->getIPv4Header()->timeToLive) << std::endl << std::endl; + + return false; +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) + { + std::cerr << "Необходимо указать IP адрес в качестве аргумента" << std::endl; + exit(1); + } + + std::string interfaceIPAddr = argv[1]; + pcpp::PcapLiveDevice *dev = pcpp::PcapLiveDeviceList::getInstance().getPcapLiveDeviceByIp(interfaceIPAddr.c_str()); + if (dev == nullptr) + { + std::cerr << "Не удается найти интерфейс с IPv4-адресом " << interfaceIPAddr.c_str() << std::endl; + exit(2); + } + + std::cout << "Информация о сетевом интерфейсе: " << std::endl + << "\tИнтерфейс: " << dev->getName() << std::endl + << "\tОписание: " << dev->getDesc() << std::endl + << "\tMAC адрес: " << dev->getMacAddress().toString() << std::endl + << "\tШлюз: " << dev->getDefaultGateway().toString() << std::endl; + if (dev->getDnsServers().size() > 0) + std::cout << "\tDNS сервер: " << dev->getDnsServers().at(0).toString() << std::endl; + + std::cout << std::endl; + + if (!dev->open()) + { + std::cerr << "Не удается открыть устройство" << std::endl; + exit(3); + } + + dev->startCaptureBlockingMode(onPacketArrivesBlockingMode, nullptr, 0); + + return 0; +} diff --git a/lesson_02/test.pcap b/lesson_02/test.pcap new file mode 100644 index 0000000000000000000000000000000000000000..e094817cdf728c13d3ffe0a57aab88c5703b8d06 GIT binary patch literal 1046 zcmca|c+)~A1{MYcU}0bcawb3cowR!mCqopF4Z!pnNLEM8dkRGS9KCapV2Hi7Mc*ax(Ufx$;2 z#DT#|aBVWk7LaWW)j+!}=Fe1NWPA>^0_0pq_kdsqpos#NGTNaqlR@+nzL^qSF;!BbXSab4|6LT0Cco-O2L4w5x1VL<&)l4tg8Nz|OK$wvs z4sJErlb&0zI57MdR6Yvw-~*r>#F|9`BwLfXl8?a-s0)O_K4gOXknchv1BVqMA2PKv zO!y13b_USVj+Z$Zw18|7hL{7588!w+4hA-0VuA31&W3~t1IPm)odL)?ky8&$C)8aa z^$0U&19b|E@-cJ)?E_(m3_RU2Fx32D1ExE+9iKq@>=e6#_uDb z(`ilR0|y3UHWx{dt3a+}+`Hcn!vga0K;r0EX-o%L9PP;c=jIu literal 0 HcmV?d00001