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

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

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

    AlexPNZ New Member

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

    }
     
Загрузка...
Статус темы:
Закрыта.

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