Más datos de carga útil del paquete
-
22-09-2019 - |
Pregunta
tengo el siguiente código
int ParseData (unsigned char * paquete, int len) { struct ethhdr * ethernet_header; struct iphdr * ip_header; struct tcphdr tcp_header *; datos sin firmar char *; int DATA_LEN;
/* Check if any data is there */
if(len > (sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr)))
{
ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr));
data = (packet + sizeof(struct ethhdr) + ip_header->ihl*4 + sizeof(struct tcphdr));
data_len = ntohs(ip_header->tot_len) - ip_header->ihl*4 - sizeof(struct tcphdr);
if(data_len)
{
printf("Data Len : %d\n", data_len);
PrintData("Data : ", data, data_len);
printf("\n\n");
return 1;
}
else
{
printf("No Data in packet\n");
return 0;
}
}
}
Estoy tratando de imprimir en ASCII la carga útil y con una función simple como esto
PrintData (char * mesg, unsigned char * p, int len) { printf (mesg);
while(len--)
{
if(isprint(*p))
printf("%c", *p);
else
printf(".");
p++;
}
}
El código de buena apariencia, no hay problemas de compilación / advertencia. El problema es que la primera carga útil personaje no está siendo impresa en la posición 0, pero después de 12 bytes.
Yo pensaba que todos los bytes "len" son los datos exactos que tengo que imprimir.
Mis datos apuntan a datos = (paquete + sizeof (ethhdr struct) + ip_header-> DIH * 4 + sizeof (struct tcphdr)); sin embargo los datos [0] no es imprimible. ¿Cuál es el problema? ¿Me perdí algo? ¿Tengo que comprobar si la parte TCP opciones tal vez?
Gracias
Solución
Así es, la adición de la sizeof (struct tcphdr) sólo se va a conseguir que después de la cabecera, no las opciones. Para llegar a los datos reales, se debe utilizar el campo 'compensar' de la cabecera TCP. El desplazamiento se calcula a partir del inicio de la cabecera TCP y está en unidades de 4 bytes, por ejemplo si el desplazamiento es 8 entonces la longitud + opciones de cabecera es 32.