Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / !lab5 / Sniffer / Sniffer

.cpp
Скачиваний:
17
Добавлен:
17.04.2013
Размер:
5.7 Кб
Скачать
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>

#pragma comment (lib,"ws2_32.lib")

#define cmd 0x98000001 // Command to perform on the socket s. 
char Buffer[1024*64]; // Буфер для приема данных
char *HostIp(unsigned long int in); // норм. вид IP

// Структура заголовка IP-пакета
typedef struct IPHeader {
  unsigned char   hlength:4;//header length
  unsigned char   version:4;// версия длины заголовка
  unsigned char   tos;      // тип сервиса
  unsigned short  length;   // длина всего пакета
  unsigned short  id;       // идентификация
  unsigned short  offset;   // флаги и смещения
  unsigned char   ttl;      // время жизни пакета
  unsigned char   protocol; // протокол
  unsigned short  xsum;     // контрольная сумма
  unsigned int    saddr;    // IP-адрес отправителя
  unsigned int    daddr;    // IP-адрес назначения
} IPHeader;
// Структура заголовка UDP-пакета
typedef struct UDPHeader {
  unsigned short  source;   // порт отправителя
  unsigned short  dest;     // порт назначения
  unsigned short  len;      // длина датаграммы
  unsigned short  xsum;     // контрольная сумма
} UDPHeader;
// Структура заголовка TCP-пакета
typedef struct TCPHeader
{
  unsigned short  source;  // source port
  unsigned short  dest;    // destination port
  unsigned int    seq;     // sequence number
  unsigned int    ack_seq; // acknowledge sequence number
  unsigned int	  res1:4,  // can't figure this one out
		          doff:4,  // data offset
		          fin:1,   // request to close connection
		          syn:1,   // synchronization sequence numbers
		          rst:1,   // Reset Connection
		          psh:1,   // transmit without filling buffer
		          ack:1,   // acknowledge field was valid
		          urg:1,   // urgent/highpriority data
		          res2:2;  
  unsigned short  window;  // for Window Flow Control
  unsigned short  xsum;    // CheckSum
  unsigned short  urg_ptr; // valid when urg flag is set
} TCPHeader;

void main()
{
  WSADATA     wsadata;   // Инициализация WinSock.
  SOCKET      s;         // Слушающий сокет.
  SOCKADDR_IN sa;        // Адрес хоста
  unsigned long flag = 1;// Флаг

  WSAStartup(MAKEWORD(2,2), &wsadata);
  s = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
  sa.sin_family=AF_INET;
  sa.sin_addr.s_addr=inet_addr("172.16.99.252");
  bind(s,(SOCKADDR *)&sa,sizeof(SOCKADDR));
  //Прослушиваем все порты
  ioctlsocket(s,cmd,&flag);
  //Бесконечный цикл приема IP-пакетов. До тех пор, пока не будет нажата любая кнопка.
  while(!_kbhit())
  {
	int count;
	count = recv(s,Buffer,sizeof(Buffer),0);
    // Обработка IP-пакета
    if(count >= sizeof(IPHeader))
    {
      IPHeader* IpHdr = (IPHeader *)Buffer;
      UDPHeader* UdpHdr = (UDPHeader *)Buffer;
	  TCPHeader* TcpHdr = (TCPHeader *)Buffer;
	
	printf("\n\nIpHeader: version=%d hlength=%d tos=%d length=%d id=%d "
               "offset=%d ttl=%d\nprotocol=%d xsum=%d saddr=%lx "
               "daddr=%lx\n",
               IpHdr->version,                         
               IpHdr->hlength,                             
               IpHdr->tos,                              		
               ntohs(IpHdr->length), 
               ntohs(IpHdr->id),                                      
               ntohs(IpHdr->offset),    
               IpHdr->ttl,                                   
			   IpHdr->protocol,                              
               ntohs(IpHdr->xsum), 
               HostIp(IpHdr->saddr), 
               HostIp(IpHdr->daddr));  
	// Если это UDP-пакет, выводим UDP-информацию.
	if(IpHdr->protocol==17)
	{
        printf("\nUDP: source=%d dest=%d len=%d xsum=%d\n",
                     ntohs(UdpHdr->source),ntohs(UdpHdr->dest),
                     ntohs(UdpHdr->len),ntohs(UdpHdr->xsum));
        printf("s_host:%s s_port:%d\n",
                     HostIp(IpHdr->saddr),
                     ntohs(UdpHdr->source));   
        printf("d_host:%s d_port:%d\n",
                     HostIp(IpHdr->daddr),
                     ntohs(UdpHdr->dest));   
        printf("\n");
    }		
	// Если это TCP-пакет, выводим TCP-информацию.
	if(IpHdr->protocol==6)             
    {
        printf("\nTCP: source=%d dest=%d seq=%lx "
               "ack_seq=%lx doff=%d\n[flags] window=%d xsum=%d "
               "urg_ptr=%d\n", 
               ntohs(TcpHdr->source), 
               ntohs(TcpHdr->dest), 
               ntohl(TcpHdr->seq), 
               ntohl(TcpHdr->ack_seq), 
               TcpHdr->doff,                        
               ntohs(TcpHdr->window), 
               ntohs(TcpHdr->xsum),
               ntohs(TcpHdr->urg_ptr));
               printf("Flags: ");
               if(TcpHdr->urg) printf("URG ");
               if(TcpHdr->ack) printf("ACK ");
               if(TcpHdr->psh) printf("PSH ");
               if(TcpHdr->rst) printf("RST ");
               if(TcpHdr->syn) printf("SYN ");
               if(TcpHdr->fin) printf("FIN ");
               printf("\n");
               printf("s_host:%s s_port:%d\n",
                     HostIp(IpHdr->saddr),
                     ntohs(TcpHdr->source));
               printf("d_host:%s d_port:%d\n",
                     HostIp(IpHdr->daddr),
                     ntohs(TcpHdr->dest));
	}
   }
  }
  closesocket(s);
  WSACleanup();
}

// норм. вид IP
char *HostIp(unsigned long int in)
{
    static char szHostName[512] = "";
    struct in_addr iaddr;
    memset(&iaddr,0,sizeof(iaddr));
    iaddr.s_addr=in;
    strcpy(szHostName,inet_ntoa(iaddr));
    return (szHostName);
}
Соседние файлы в папке Sniffer
  • #
    17.04.20131.21 Кб17ReadMe.txt
  • #
    17.04.20135.7 Кб17Sniffer.cpp
  • #
    17.04.20134.55 Кб16Sniffer.dsp
  • #
    17.04.2013537 б16Sniffer.dsw
  • #
    17.04.201358.37 Кб16Sniffer.ncb
  • #
    17.04.201353.76 Кб16Sniffer.opt
  • #
    17.04.2013914 б17Sniffer.plg