Ip Пакеты, Чтение Содержимого

Тема в разделе "MS Visual C++", создана пользователем AlexPNZ, 25 авг 2014.

Статус темы:
Закрыта.
  1. AlexPNZ

    AlexPNZ New Member

    Репутация:
    0
    Регистрация:
    5 янв 2013
    Сообщения:
    4
    Симпатии:
    0
    Попробовал написать маленький сниффер, по примеру, вроде бы идею понял, встала задача записи пакетов, т.е. их содержимого, а не только информации из заголовка, и тут я столкнулся с тем, что не могу понять, как можно доработать программу, что бы была такая функция.
    Код:
    // 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();
    
    }
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей