Есть сниффер , ловит пакеты записывает заголовочную информацию в файл. Препод требует допустим если udp пакет записывал еще порты , icmp - тип icmp и код icmp(все это в структуре заголовка есть). Проблема в том что в Udp src_port все время пишит "69" также в icmp type "69" в tcp src_port "128". Подскажите где косячу :(?
#pragma once
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
#include <fstream>
using std::fstream;
#include "WinSock2.h"
#include <conio.h>
#include <Windows.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <string>
#include <process.h>
#define MAX_PACKET_SIZE 30000
#define SIO_RCVALL 0x98000001
FILE* f,*f2;
char baf[20];
// Буфер для приёма данных
char Buf[MAX_PACKET_SIZE],Buf2[MAX_PACKET_SIZE]; // 64 Kb
typedef struct TCPHeader
{
unsigned short src_port; // Порт отправителя
unsigned short dst_port; // Порт получателя
unsigned int seq_n; // Номер очереди
unsigned int ack_n; // Номер подтверждения
unsigned char offset; // Смещение данных (4 бита)
// + Зарезервировано (4 бита)
unsigned char flags; // Зарезервировано (2 бита)
// + Флаги (6 бит)
unsigned short win; // Размер окна
unsigned short crc; // Контрольная сумма заголовка
unsigned short padding; // Дополнение до 20 байт
}
TCPHeader;
typedef struct ICMPHeader
{
unsigned char type; // тип ICMP- пакета
unsigned char code; // код ICMP- пакета
unsigned short crc ; // контрольная сумма
union {
struct { unsigned char uc1, uc2, uc3, uc4; } s_uc;
struct { unsigned short us1, us2; } s_us;
unsigned long s_ul;
} s_icmp; // зависит от типа
}ICMPHeader;
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;
typedef struct UDPHeader
{
unsigned short src_port ; // номер порта отправителя
unsigned short dst_port ; // номер порта получателя
unsigned short length; // длина датаграммы
unsigned short crc; // контрольная сумма заголовка
}UDPHeader;
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
unsigned short dunno;
unsigned short dunno1;
unsigned short id,summa,flags;
///////////////////
WSADATA wsadata; // Инициализация WinSock.
SOCKET s; // Cлущающий сокет.
char name[128]; // Имя хоста (компьютера).
HOSTENT* phe; // Информация о хосте.
SOCKADDR_IN sa; // Адрес хоста
SOCKADDR_IN sa22;
IN_ADDR sa1;
IN_ADDR sa2;
unsigned long flag = 1;
//////////////////
namespace Н {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Threading;
/// <summary>
/// Сводка для Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
System::Void DoWork()
{
while( !_kbhit() )
{
int count=0;
ZeroMemory(Buf,MAX_PACKET_SIZE);
count = recv( s, Buf, sizeof(Buf), 0 );//buf[count]
IPHeader* hdr1 = (IPHeader *)Buf;
UDPHeader* hdr2=(UDPHeader *)Buf;
TCPHeader* hdr3=(TCPHeader *)Buf;
ICMPHeader* hdr4=(ICMPHeader *)Buf;
sa2.s_addr = hdr1->iph_dest;// тут просто ловит нужные айпи и сохраняет переданные данные
sa3.s_addr = hdr1->iph_src;
if((sa2.S_un.S_un_b.s_b3==71)&&(sa2.S_un.S_un_b.s_b4==84)&&(sa3.S_un.S_un_b.s_b3==1)&&(sa3.S_un.S_un_b.s_b4==106))
{
f2 = fopen("C:\\test2.txt","a");
for (int i = 0; i < count; i++)
{
fprintf(f2, "%c", Buf[i]);
}
fclose(f2);
}
//тут все происходит************************************************
// обработка IP-пакета*******************************************
if( count >= sizeof(IPHeader) )
{
IPHeader* hdr = (IPHeader *)Buf;
//Начинаем разбор пакета...
id=hdr->iph_id;
itoa(id,baf,10);
f = fopen("C:\\test.txt","a");
strcpy(src,"ПакетID: ");
//CharToOem(src,dest);
//printf(dest);
fwrite(src,1,strlen(src),f);
fwrite(baf,1,strlen(baf),f);
// Преобразуем в понятный вид адрес отправителя.
fwrite(" From ",1,6,f);
sa1.s_addr = hdr->iph_src;
//printf(inet_ntoa(sa1));
fwrite(inet_ntoa(sa1),1,strlen(inet_ntoa(sa1)),f);
// Преобразуем в понятный вид адрес получателя.
//printf(" To ");
fwrite(" To ",1,5,f);
sa1.s_addr = hdr->iph_dest;
//printf(inet_ntoa(sa1));
fwrite(inet_ntoa(sa1),1,strlen(inet_ntoa(sa1)),f);
// Вычисляем протокол.
fwrite(" Protocol: ",1,12,f);
if(hdr->iph_protocol == IPPROTO_TCP)
{
//unsigned short src_port; // Порт отправителя
//unsigned short dst_port; // Порт получателя
//unsigned int seq_n; // Номер очереди
//unsigned int ack_n; // Номер подтверждения
//TCPHeader* hdr3 = (TCPHeader *)Buf;
fwrite("TCP ",1,5,f);
hdr3->src_port; // Всевремя "128" как TTL
hdr3->dst_port;
hdr3->seq_n;
hdr3->ack_n;
char c111[]=" src_port :";
//char newL[]="\r\n";
fwrite(c111,1,sizeof(c111),f);
dunno1=(hdr3->src_port);
itoa(dunno,baf,10);
fwrite(baf,1,strlen(baf),f);
char c122[]=" port_dst :";
//char newL[]="\r\n";
fwrite(c122,1,sizeof(c122),f);
dunno1=(hdr3->dst_port);
itoa(dunno1,baf,10);
fwrite(baf,1,strlen(baf),f);
char c1222[]=" seq_n :";
//char newL[]="\r\n";
fwrite(c1222,1,sizeof(c1222),f);
dunno1=(hdr3->seq_n);
itoa(dunno1,baf,10);
fwrite(baf,1,strlen(baf),f);
char c12222[]=" ack_n :";
//char newL[]="\r\n";
fwrite(c12222,1,sizeof(c12222),f);
dunno1=(hdr3->ack_n);
itoa(dunno1,baf,10);
fwrite(baf,1,strlen(baf),f);
}
if(hdr->iph_protocol == IPPROTO_UDP)
{
fwrite("UDP ",1,5,f);
hdr2->src_port; // Всевремя "69"
hdr2->dst_port;
char c1[]=" src_port :";
//char newL[]="\r\n";
fwrite(c1,1,sizeof(c1),f);
dunno=(hdr2->src_port);
itoa(dunno,baf,10);
fwrite(baf,1,strlen(baf),f);
char c2[]=" dst_port :";
//char newL[]="\r\n";
fwrite(c2,1,sizeof(c2),f);
dunno=(hdr2->dst_port);
itoa(dunno,baf,10);
fwrite(baf,1,strlen(baf),f);
}
if(hdr->iph_protocol == IPPROTO_IP) fwrite("IP ",1,4,f);
if(hdr->iph_protocol == IPPROTO_ICMP)
{
ICMPHeader* hdr4 = (ICMPHeader *)Buf;
fwrite("ICMP ",1,6,f);
char c11[]=" ICMP_type :";
//char newL[]="\r\n";
fwrite(c11,1,sizeof(c11),f);
dunno=(hdr4->type); //Всевремя "69"
itoa(dunno,baf,10);
fwrite(baf,1,strlen(baf),f);
char c12[]=" ICMP_code :";
//char newL[]="\r\n";
fwrite(c12,1,sizeof(c12),f);
dunno=(hdr4->code);
itoa(dunno,baf,10);
fwrite(baf,1,strlen(baf),f);
//unsigned char type; // тип ICMP- пакета
//unsigned char code; // код ICMP- пакета
}
// Вычисляем размер. Так как в сети принят прямой порядок
// байтов, а не обратный, то прийдётся поменять байты местами.
fwrite(" Size: ",1,7,f);
lowbyte = hdr->iph_length>>8;
hibyte = hdr->iph_length<<8;
hibyte = hibyte + lowbyte;
itoa(hibyte,baf,10);
fwrite(baf,1,strlen(baf),f);
char c[]=" TTL :";
char newL[]="\r\n";
// Вычисляем время жизни пакета.
fwrite(c,1,sizeof(c),f);
dunno=(hdr->iph_ttl);
itoa(dunno,baf,10);
fwrite(baf,1,strlen(baf),f);
char sum[]=" CRC: ";
int summa=hdr->iph_xsum;
fwrite(sum,1,strlen(sum),f);
itoa(summa,baf,10);
for(int i=0;i<20;i++)
{
if(baf[i]=='\0') //HEX
break;
fprintf(f, "%x", baf[i]);
}
hdr2->src_port; //ports===========================================
hdr2->dst_port;
//fwrite(baf,1,strlen(baf),f);
flags=hdr->iph_offset;
int gg=hdr->iph_offset;
fwrite(newL,1,2,f);
fclose(f);
}
}
....
....
....
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
t1= gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this, &Form1::DoWork));
// инициализация
WSAStartup(MAKEWORD(2,2), &wsadata);
s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
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);
t1->Start();
button1->Enabled=false;
}
private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e)
{
t1->Abort();
}
};
}
Продвижение своими сайтами как стратегия роста и независимости