Red de conocimiento informático - Conocimiento informático - Diseño del programa de interceptación de paquetes LAN

Diseño del programa de interceptación de paquetes LAN

#define RCVALL_ON 1

#define MAX_ADDR_LEN 16 //La longitud máxima de la dirección decimal con puntos

#define MAX_PROTO_TEXT_LEN 16 //Nombre del subprotocolo (como " TCP") longitud máxima

#define WINSOCK_VERSION MAKEWORD(2, 2)

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

#include lt ;stdio.hgt;

#include lt;winsock2.hgt;

#include lt;mstcpip.hgt;

#include lt;conio.hgt

typedef struct iphdr //Definir encabezado IP

{

unsigned char h_lenver; //Longitud del encabezado de 4 dígitos y número de versión de IP de 4 dígitos

unsigned char tos; //tipo de servicio de 8 bits

unsigned short total_len; //longitud total de 16 bits (bytes)

unsigned short ident; //identificación de 16 bits

unsigned short frag_and_flags; //banderas de 3 bits

unsigned char ttl; //tiempo de supervivencia de 8 bits

unsigned char proto; //Protocolo de 8 bits (TCP, UDP u otros)

suma de comprobación corta sin firmar; //suma de comprobación del encabezado IP de 16 bits

unsigned int sourceIP //32- dirección IP de origen de bits

unsigned int destIP; //dirección IP de destino de 32 bits

}IPHeader;

typedef struct _tcphdr //Definir encabezado TCP

p>

{

USHORT th_sport; //puerto de origen de 16 bits

USHORT th_dport; //puerto de destino de 16 bits

unsigned int th_seq ; //número de serie de 32 bits

unsigned int th_ack; //número de confirmación de 32 bits

unsigned char th_lenres; //longitud del encabezado de 4 bits/palabra reservada de 6 bits

unsigned char th_flag; //Bit de bandera de 6 bits

USHORT th_win; //Tamaño de ventana de 16 bits

USHORT th_sum;

USHORT th_urp; //Desplazamiento de datos de emergencia de 16 bits

}TCP_HEADER;

typedef struct _udphdr //Definir encabezado UDP

{

uh_sport corto sin firmar; // puerto de origen de 16 bits

uh_dport corto sin firmar;

/puerto de destino de 16 bits

unsigned short uh_len; //longitud de 16 bits

unsigned short uh_sum; //suma de comprobación de 16 bits

}UDP_HEADER;

typedef struct _icmphdr //Definir encabezado ICMP

{

BYTE i_type; //Tipo de 8 bits

BYTE i_code; /Código de 8 bits

USHORT i_cksum; //Suma de comprobación de 16 bits

USHORT i_id; //Número de identificación (normalmente se utiliza el número de proceso como número de identificación)

USHORT i_seq; //Número de secuencia del mensaje

ULONG timestamp; //Marca de tiempo

}ICMP_HEADER;

int iTTL, iLEN, iBYTES;

char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN];

int iSourcePort, iDestPort;

int fflag=0; //marca de archivo

# define PACKAGE_SIZE sizeof(IPHeader) 1000

void HandleError(char *func);

//funciones

int DecodeTcpPack(char *, int, FILE *) ; //Función de descompresión TCP

int DecodeUdpPack(char *, int, FILE *); //Función de descompresión UDP

int DecodeIcmpPack(char *, int, FILE *) ; //Función de descompresión ICMP

//MAIN

int main(int argc, char *argv[])

{

sockaddr_in saSource, saDest;

WSAData wsaData;

char buf[PACKAGE_SIZE];

WSAStartup(WINSOCK_VERSION, amp; wsaData); > SOCKET calcetín = socket(AF_INET, SOCK_RAW, IPPROTO_IP);

if(sock == SOCKET_ERROR)

{

HandleError("socket"); /p>

WSACleanup();

return -1;

}

//Obtener la dirección IP local

struct sockaddr_in addr;

memset(amp;addr, 0, sizeof(addr));

//addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.101" ) ;

<

p>char nombre[256];

PHOSTENT hostinfo;

if( gethostname (nombre, tamaño de (nombre)) == 0)

{

if((hostinfo = gethostbyname(nombre)) != NULL)

{

memcpy(amp;(addr.sin_addr.S_un.S_addr) , (struct in_addr *)*hostinfo-gt; h_addr_list , sizeof((struct in_addr *)*hostinfo-gt; h_addr_list ));

}

}

addr .sin_family = AF_INET;

if(bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)//bind

{

HandleError("bind");

}

//Configura SOCK_RAW en SIO_RCVALL para recibir todos los paquetes IP

int on = RCVALL_ON ;

DWORD num;

if(WSAIoctl(sock, SIO_RCVALL, & on, sizeof(on), NULL, 0, & num, NULL, NULL) == SOCKET_ERROR )

{

HandleError("wsaIoctl set");

}

struct sockaddr_in from;

int fromlen

int tamaño;

ARCHIVO *fp;

if((fp=fopen("log.txt", "w "))= =NULL)

{

printf("error de archivo abierto, no se puede guardar la lista en el archivo");

fflag=1;

}

//Escuchar paquetes IP

while(!kbhit())

{

memset(buf, 0, sizeof(num)

memset(amp; from, 0, sizeof(from));

fromlen = sizeof(from

size=recvfrom(calcetín, buf, PACKAGE_SIZE, 0, (struct sockaddr*)amp; from, amp; fromlen);

if (size == SOCKET_ERROR)

{

if (WSAGetLastError() == WSAEMSGSIZE)

{

HandleError("recvfrom");

continuar

}

}

IPHeader *iph; =(IPHeader *)buf;

/**/

//Dirección de origen

saSource.sin_addr.s_addr = iph-gt; p> p>

strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);

//Dirección de destino

saDest.sin_addr.s_addr = iph-gt;destIP ;

strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);

iTTL = iph-gt;

//Calcular la longitud de el encabezado IP

int IpHeadLen = 4 * (iph-gt; h_lenver amp; 0xf

//Llama a las funciones correspondientes según el tipo de protocolo

switch(iph- gt; proto)

{

caso IPPROTO_ICMP:

DecodeIcmpPack(buf IpHeadLen, tamaño, fp);

romper;

p>

caso IPPROTO_IGMP:

printf("IGMP ");

printf("15s: -gt;15s: " , szSourceIP, szDestIP);

printf("d", tamaño

printf("s/n", buf

break); /p>

caso IPPROTO_TCP:

DecodeTcpPack((buf IpHeadLen), tamaño, fp

descanso

caso IPPROTO_UDP:

DecodeUdpPack(buf IpHeadLen, tamaño, fp);

break;

predeterminado:

printf("datagrama desconocido de s/n", inet_ntoa(from.sin_addr));

p>

printf("s/n", buf);

break

}// interruptor final

Dormir(200);

>

}//finalizar mientras

fclose(fp);

closesocket(sock

WSACleanup(); > printf("¡Detenido!/n");

getch();

return 0

}//fin de principal

//Programa de descompresión TCP

int DecodeTcpPack(char *TcpBuf, int iBufSize, FILE *fp)

{

unsigned char FlagMask = 1 ;

int i;

TCP_HEADER *tcph;

tcph = (TCP_HEADER*)TcpBuf

//Calcular la longitud del encabezado TCP;

int TcpHeadLen = tcph-gt;th_lenresgt;gt;4;

TcpHeadLen *= sizeof(unsigned long);

char *TcpData=TcpBuf TcpHeadLen ;

iSourcePort = ntohs(tcph-gt;th_sport);

iDestPort = ntohs(tcph-gt;th_dport);

//Salida

printf("TCP ");

printf("15s: 5d -gt; 15s: 5d ", szSourceIP, iSourcePort, szDestIP, iDestPort); TTL=3d ", iTTL);

if(fflag==1)

//Juzga la bandera TCP

for( i=0; ilt ; 6; i )

{

if((tcph-gt;th_flag) y FlagMask)

printf("1");

else printf("0");

FlagMask=FlagMasklt;lt;1;

}

printf(" bytes=4d", iBufSize );

printf("/n");

if(fflag=1)//Escribir archivo

fprintf(fp, "TCP 15s :5d -gt; 15s: 5d TTL=3d ------ bytes=4d/n"

, szSourceIP, iSourcePort, szDestIP, iDestPort, iTTL, iBufSize);

regresar 0;

}

//Programa de descompresión UDP

int DecodeUdpPack(char * UdpBuf, int iBufSize, FILE *fp)

{

UDP_HEADER *udph;

udph = (UDP_HEADER*)UdpBuf;

> iSourcePort = ntohs(udph-gt; uh_sport);

iDestPort = ntohs(udph-gt; uh_dport);

//Salida

printf(" UDP ");

printf("15s:5d -gt;15s:5d ", szSourceIP, iSourcePort, szDestIP, iDestPort);

printf("TTL=3d ", iTTL

printf("Len=4d ", ntohs(udph-gt; uh_len));

printf("bytes=4d", iBufSize); p> printf("/n");

if(fflag=1)//Escribir archivo

fprintf(fp, "UDP 15s: 5d -gt; 15s: 5d TTL =3d Len=4d bytes=4d/n"

, szSourceIP, iSourcePort, szDestIP, iDestPort, iTTL, ntohs(udph-gt;uh_len), iBufSize);

devuelve 0

}

//Programa de descompresión ICMP

int DecodeIcmpPack(char *IcmpBuf, int iBufSize, FILE *fp)

{

ICMP_HEADER * icmph;

icmph = (ICMP_HEADER * )IcmpBuf;

int iIcmpType = icmph-gt; iIcmpCode = icmph-gt;i_code;

//Salida

printf("ICMP ");

printf("15s -gt;15s ", szSourceIP , szDestIP);

printf("TTL=3d ", iTTL);

printf("Type2d, d ", iIcmpType, iIcmpCode); ("bytes=4d", iBufSize);

printf("/n");

if(fflag=1)//escribir archivo

fprintf (fp, "ICMP 15s -gt; 15s TTL=3d Type2d, d bytes=4d"

, szSourceIP, szDestIP, iTTL, iIcmpType, iIcmpCode, iBufSize);

devuelve 0 ;

}

void HandleError(char *func)

{

char info[65]= {0} ;

_snprintf(info, 64, "s: d/n", func, WSAGetLastError()

printf(info

>}