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;
- int error = WSAGetLastError();
- printf("error = %d\n", error);
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
- NULL,
- error,
- 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 >= (int)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 sa;
- sockaddr_in local_addr;
- 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(); }
- }
- gethostname(hostname, sizeof(hostname));
- hostinfo = gethostbyname(hostname);
- ZeroMemory(&sa, sizeof(sockaddr));
- sa.sin_family = AF_INET;
- sa.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr_list[0])->s_addr;
- local_addr.sin_family = AF_INET;
- local_addr.sin_port = htons(666);
- local_addr.sin_addr.s_addr = 0;
- if (bind(sock, (sockaddr *)&sa, sizeof(sa)) == SOCKET_ERROR)
- {
- ShowError();
- }
- ioctlsocket(sock, SIO_RCVALL, &flag);
- // 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