|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
С нами:
9023100
Репутация:
395
|
|
Вот мне делать нефиг
А я сидел втыкал про фрагментирование пакетов...так и не родил идею как их правильно обрабатывать (ну как определить то я понял, а как их хранить во временном буфере чтоле пакетов то много, да и вдруг мне этот пакет не нужен)... в итоге накатал сткрутурки (ну не нашел я нигде)
это как бы дополнение к снифферу что я уже выкладывал
Код:
#pragma pack(1)
#define BITTOBYTE(l) ((l*32)/8)
#define HTONS(a) (((0xFF&a)<<8) + ((0xFF00&a)>>8))
struct garik_ip {
unsigned char hdr_len:4;
unsigned char version:4;
unsigned char dscp;
unsigned short len;
unsigned short id;
unsigned char frag_offset1;
unsigned char frag_offset2:5;
// flags
unsigned char rb:1;
unsigned char df:1;
unsigned char mf:1;
unsigned char ttl;
unsigned char proto;
unsigned short checksum;
unsigned char SrcIP[4];
unsigned char DestIP[4];
};
struct garik_udp {
unsigned short srcport;
unsigned short dstport;
unsigned short length;
unsigned short checksum;
};
struct garik_tcp {
unsigned short srcport;
unsigned short dstport;
unsigned long seq;
unsigned long ack;
unsigned char reserved:4;
unsigned char hdr_len:4;
//flags;
unsigned char fin:1;
unsigned char syn:1;
unsigned char reset:1;
unsigned char push:1;
unsigned char fack:1;
unsigned char urg:1;
unsigned char ecn:1;
unsigned char cwr:1;
unsigned short window_size;
unsigned short checksum;
};
#pragma pack()
// это уже в main
garik_ip *ip;
garik_udp *udp;
garik_tcp *tcp;
// а это заместо старого цикла бесконечного
while(1)
{
if ((len = recv(raw_socket, (char *)&IPPacket,sizeof(IPPACKET),0)) < 1)
return printf("-ERR:recv()->%d,WSAErr=%i\n", len, WSAGetLastError());
if(len>=sizeof(garik_ip)) {
ip=(garik_ip *)&IPPacket.Header;
//if(ip->proto!=0x06){continue;} // фильтруем только TCP
printf("\n================================================================\n\
Internet Protocol, Src: %d.%d.%d.%d, Dst: %d.%d.%d.%d\n\
Version: %d\n\
Header length: %d bytes\n\
Differentiated Services Filed: 0x%02X\n\
Total length: %d\n\
Identification: 0x%04X (%d)\n\
Flags: 0x%02X\n\
%d.. = Reserved Bit\n\
.%d. = Don't fragment\n\
..%d = More fragments\n\
Fragment offset: %d\n\
Time to live: %d\n\
Protocol: 0x%02X\n\
Header Checksum: 0x%04X\n",
ip->SrcIP[0],ip->SrcIP[1],ip->SrcIP[2],ip->SrcIP[3],ip->DestIP[0],ip->DestIP[1],ip->DestIP[2],ip->DestIP[3],
ip->version,
BITTOBYTE(ip->hdr_len),
ip->dscp,
HTONS(ip->len),
ip->id,ip->id,
ip->rb+ip->df+ip->mf,ip->rb,ip->df,ip->mf,
MAKEWORD(ip->frag_offset1,ip->frag_offset2),
ip->ttl,
ip->proto,
ip->checksum
);
if(ip->proto==0x11){
udp=(garik_udp *)&IPPacket.Data;
printf("\n- User Datagram Protocol\n\
Source port: %d\n\
Destination port: %d\n\
Length: %d\n\
Checksum: 0x%04X\n",
HTONS(udp->srcport),
HTONS(udp->dstport),
HTONS(udp->length),udp->checksum);
}
if(ip->proto==0x06){
tcp=(garik_tcp *)&IPPacket.Data;
printf("\n- Transmission Control Protocol\n\
Source port: %d\n\
Destination port: %d\n\
Sequence number: %d\n\
Acknowledgement number: %d\n\
Header length: %d bytes\n\
Flags\n\
%d... .... = Congestion Window Reduced (CWR)\n\
.%d.. .... = ECN-Echo\n\
..%d. .... = Urgent\n\
...%d .... = Acknowledgement\n\
.... %d... = Push\n\
.... .%d.. = Reset\n\
.... ..%d. = Syn\n\
.... ...%d = Fin\n\
Window Size: %d\n\
Checksum: 0x%04X\n",
HTONS(tcp->srcport),
HTONS(tcp->dstport),
HTONS(tcp->seq),
HTONS(tcp->ack),
BITTOBYTE(tcp->hdr_len),
tcp->cwr,tcp->ecn,tcp->urg,tcp->fack,tcp->push,tcp->reset,tcp->syn,tcp->fin,
HTONS(tcp->window_size),tcp->checksum
);
}
} }
Может где накосячил в стуктурах (с флагами сложновато) ибо хз как одновременно запустить свой сниффер и Wireshark, но сравнивал все долго...
теперь в голове зреют идеи авто подстройки анализа пакетов (ну чтобы сразу лишнее отбрасывать например только tcp c определенного порта или там отслеживать конкретные соединения по SYN, ACK...)
У меня еще где-то есть структура ARP завтра уже прикручу будет еще и маки показывать хехе.
Если структуры можно красивше реализовать тыкните носом.
|