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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top