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

  • Автор темы AlexPNZ
  • Дата начала
A

AlexPNZ

Попробовал написать маленький сниффер, по примеру, вроде бы идею понял, встала задача записи пакетов, т.е. их содержимого, а не только информации из заголовка, и тут я столкнулся с тем, что не могу понять, как можно доработать программу, что бы была такая функция.
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();

}

Добавлено: Прошу прощения за двойную тему, столкнулся с ошибкой форума.
 
R

rrrFer

Код не читал, но:
USHORT iph_length; // длина всего пакета

IPHeader* hdr = (IPHeader *)Buffer;

Весь пакет у тебя помещен в Buffer. В начале пакета идет заголовок, а потом данные.
(char*)(Buffer + sizeof(IPHeader)) - это начало данных, соответственно
iph_length - sizeof(IPHeader) - это длина данных

Че не понятно то?
 
A

AlexPNZ

А, понял, я почему то думал, что в буфер только заголовок записывается с него.
 
R

rrrFer

Что пытаешься делать с этими пакетами если не секрет? - зачем вся эта возня?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!