Перехват IP пакета
От: shedon Россия http://it2read.ru
Дата: 06.05.03 06:53
Оценка:
Есть небольшой код который ловит 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;

recv( s, Buffer, sizeof(Buffer), 0 );

IPHeader* hdr = (IPHeader *)Buffer;


Как прочитать сам пакет ? И узнать порт по которому он шел ?
(Используется winsock2)


06.05.03 12:11: Перенесено из 'C/C++'
Re: Перехват IP пакета
От: Muchacho США  
Дата: 06.05.03 16:28
Оценка:
Здравствуйте, shedon, Вы писали:

S>Как прочитать сам пакет ? И узнать порт по которому он шел ?

S>(Используется winsock2)
S>

используй raw сокеты, тема уже обсуждалась, например,здесь — http://www.rsdn.ru/Forum/?mid=238171
Автор: Linuxoid
Дата: 10.04.03
Re: Перехват IP пакета
От: _Hooter Россия  
Дата: 06.05.03 19:47
Оценка:
Здравствуйте, shedon, Вы писали:

S>Есть небольшой код который ловит IP пакеты и читает их заголовки:

<...>
S> typedef struct IPHeader {
S> UCHAR iph_verlen; // версия и длина заголовка
<...>
S> UCHAR iph_protocol; // протокол
<...>
S>} IPHeader;
<...>
S>IPHeader* hdr = (IPHeader *)Buffer;

сам ip-пакет идет сразу за заголовком, т. е. смещаешь указатель на количество байт, равное длине ip-заголовка и разбираешь дальше, чего там лежит. как правило это tcp, udp или icmp... более точно тебе скажет поле iph_protocol. эти протоколы и содежат информацию о портах.

длина ip-заголовка есть в структуре IPHeader (iph_verlen). как ее использовать читай RFC.
Re[2]: Перехват IP пакета
От: shedon Россия http://it2read.ru
Дата: 07.05.03 05:00
Оценка:
Здраствуйте вы написали:
Но в iph_protocol у меня приходит только протокол. А портов там нету.
Re[3]: Перехват IP пакета
От: Muchacho США  
Дата: 07.05.03 15:44
Оценка:
Здравствуйте, shedon, Вы писали:

S>Но в iph_protocol у меня приходит только протокол. А портов там нету.


Их там нет, потому что порты относятся к следующему уровню сетевой модели (т.е. к TCP или UDP протоколу — какой протокол определяешь исходя из значения поля iph_protocol)

struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN
u_char ip_hl:4, /* header length */
ip_v:4; /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
u_char ip_v:4, /* version */
ip_hl:4; /* header length */
#endif
u_char ip_tos; /* type of service */
short ip_len; /* total length */
u_short ip_id; /* identification */
short ip_off; /* fragment offset field */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_char ip_ttl; /* time to live */
u_char ip_protocol; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};

struct tcphdr {
u_short th_sport; /* source port */
u_short th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
u_char th_x2:4, /* (unused) */
th_off:4; /* data offset */
u_char th_flags;
u_short th_win; /* window */
u_short th_sum; /* checksum */
u_short th_urp; /* urgent pointer */
};

struct udphdr{
u_short uh_sport; /* source port */
u_short uh_dport; /* destination port */
u_short uh_ulen; /* udp length */
u_short uh_sum; /* udp checksum */
};

if(IPhdr->ip_protocol == 0x06)
tcphdr* TCPhdr = IPhdr + IPhdr->ip_hl*4;

if(IPhdr->ip_protocol == 0x11)
udphdr* UDPhdr = IPhdr + IPhdr->ip_hl*4;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.