Показать сообщение отдельно

Вот мне делать нефиг
  #20  
Старый 03.02.2010, 04:11
Gar|k
Постоянный
Регистрация: 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 завтра уже прикручу будет еще и маки показывать хехе.
Если структуры можно красивше реализовать тыкните носом.
 
Ответить с цитированием