A
AlexPNZ
Попробовал написать маленький сниффер, по примеру, вроде бы идею понял, встала задача записи пакетов, т.е. их содержимого, а не только информации из заголовка, и тут я столкнулся с тем, что не могу понять, как можно доработать программу, что бы была такая функция.
Добавлено: Прошу прощения за двойную тему, столкнулся с ошибкой форума.
C++:
// s2.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <fstream>
#include <pcap.h>
#pragma comment(lib,"wpcap.lib")
#pragma comment(lib,"Packet.lib")
#pragma comment(lib,"ws2_32.lib")
using namespace std;
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#define MAX_PACKET_SIZE 0x10000000
#define SIO_RCVALL 0x98000001
// Буфер для приёма данных
CHAR Buffer[MAX_PACKET_SIZE]; // 64 Kb
CHAR Buffer1[0x9999999];
//Структура заголовка IP-пакета
typedef struct IPHeader {
UCHAR iph_verlen; // версия и длина заголовка
UCHAR iph_tos; // тип сервиса
USHORT iph_length; // длина всего пакета
USHORT iph_id; // Идентификация
USHORT iph_offset; // флаги и смещения
UCHAR iph_ttl; // время жизни пакета
UCHAR iph_protocol; // протокол
USHORT iph_xsum; // контрольная сумма
ULONG iph_src; // IP-адрес отправителя
ULONG iph_dest; // IP-адрес назначения
} IPHeader;
char src[64];
char dest[64];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
void main()
{
WSADATA wsadata; // Инициализация WinSock.
SOCKET s; // Cлущающий сокет.
char name[128]; // Имя хоста (компьютера).
HOSTENT* phe; // Информация о хосте.
SOCKADDR_IN sa; // Адрес хоста
IN_ADDR sa1; //
unsigned long flag = 1; // Флаг PROMISC Вкл/выкл.
// инициализация
WSAStartup(MAKEWORD(2,2), &wsadata);
s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
gethostname(name, sizeof(name));
phe = gethostbyname( name );
ZeroMemory( &sa, sizeof(sa) );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
// Включение promiscuous mode.
ioctlsocket(s, SIO_RCVALL, &flag);
while( !_kbhit() )
{
int count;
count = recv( s, Buffer, sizeof(Buffer1), 0 );
//обработка ip пакета
if( count >= sizeof(IPHeader) )
{ //cout<<count;
// std::cout<<std::hex<<count;
int j;
IPHeader* hdr = (IPHeader *)Buffer;
int a=hdr->iph_length;
//разбор пакета
sprintf(src,"Пакет: ");
CharToOem(src,dest);
printf(dest);
// Преобразуем в понятный вид адрес отправителя.
printf("From ");
sa1.s_addr = hdr->iph_src;
printf(inet_ntoa(sa1));
// Преобразуем в понятный вид адрес получателя.
printf(" To ");
sa1.s_addr = hdr->iph_dest;
printf(inet_ntoa(sa1));
// Вычисляем протокол. Полный список этих констант
// содержится в файле winsock2.h
printf(" Prot: ");
if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
// Вычисляем время жизни пакета.
printf("\n");
}
}
closesocket( s );
WSACleanup();
}
Добавлено: Прошу прощения за двойную тему, столкнулся с ошибкой форума.