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
>}