Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Winsock2.h>
- #include <Windows.h>
- #include <iostream>
- #pragma comment(lib, "Ws2_32.lib")
- #define SIO_RCVALL 0x98000001
- #define MAX_PACKET_SIZE 0x10000
- typedef struct tagIPHeader
- {
- unsigned char ver_len; // версия и длина заголовка
- unsigned char tos; // тип сервиса
- unsigned short length; // длина всего пакета
- unsigned short id; // Id
- unsigned short flgs_offset; // флаги и смещение
- unsigned char ttl; // время жизни
- unsigned char protocol; // протокол
- unsigned short xsum; // контрольная сумма
- unsigned long src; // IP-адрес отправителя
- unsigned long dest; // IP-адрес назначения
- unsigned short *params; // параметры (до 320 бит)
- unsigned char *data; // данные (до 65535 октетов)
- } IPHeader;
- void ShowError()
- {
- LPVOID lpMsgBuf = NULL;
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
- NULL,
- WSAGetLastError(),
- MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
- (LPTSTR)&lpMsgBuf,0,NULL);
- std::cout << (LPCTSTR)lpMsgBuf << std::endl;
- LocalFree(lpMsgBuf);
- }
- IPHeader* sniff(SOCKET sock)
- {
- IPHeader *hdr;
- char buffer[MAX_PACKET_SIZE];
- int count = 0;
- count = recv(sock, buffer, sizeof(buffer), 0);
- if (count >= sizeof(IPHeader))
- {
- hdr = (IPHeader *)malloc(MAX_PACKET_SIZE);
- memcpy(hdr, buffer, MAX_PACKET_SIZE);
- return hdr;
- }
- else
- return 0;
- }
- int main()
- {
- WSADATA wsaData;
- char hostname[128];
- HOSTENT* hostinfo;
- SOCKADDR_IN sockaddr;
- unsigned long flag = 1;
- if(WSAStartup(0x0202, &wsaData)){ ShowError(); }
- else
- {
- std::cout << "WSAStartup - OK" << std::endl;
- SOCKET sock;
- sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); // Create raw socket
- if(sock == INVALID_SOCKET){ ShowError(); }
- {
- std::cout << "Raw scoket is created" << std::endl;
- if(closesocket(sock)== SOCKET_ERROR) { ShowError(); }
- }
- ioctlsocket(sock, SIO_RCVALL, &flag);
- gethostname(hostname, sizeof(hostname));
- hostinfo = gethostbyname(hostname);
- ZeroMemory(&sockaddr, sizeof(sockaddr));
- sockaddr.sin_family = AF_INET;
- sockaddr.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr_list[0])->s_addr;
- bind(sock, (SOCKADDR *)&sockaddr, sizeof(SOCKADDR));
- // Analyze packets
- while (true)
- {
- IPHeader* hdr = sniff(sock);
- // обработка IP-пакета
- if (hdr)
- {
- unsigned char *byte_iterator = (unsigned char *)hdr;
- for (int i = 0; i < sizeof(IPHeader); i++)
- {
- printf("%02x", *byte_iterator);
- ++byte_iterator;
- }
- }
- free(hdr);
- }
- if(WSACleanup()) { ShowError(); }
- else
- { std::cout << "WSACleanup - OK" << std::endl;}
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement