funcion getPayloadTcp() en C

Iniciado por soyloqbuskas, 28 Septiembre 2012, 00:14 AM

0 Miembros y 1 Visitante están viendo este tema.

soyloqbuskas

¡Buenas a todos!

Necesito hacer una funcion que me permita sacar el payload (campo de datos) de un paquete TCP.
La funcion seria asi....

char * getPayloadTcp(char* buffer){
     
     //separar la cabecera del campo de datos....
     //¿como puedo hacer esto? no quiero codigo, solo el nombre de funciones que me permita hacerlo


    return payload;
}


Estoy trabajando con C en linux.

Un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

soyloqbuskas

#1
Estoy probando ha hacer lo siguiente, pero no me sale bien....me da fallo de segmentacion



char* getPayloadTcp(char* buffer){
       int i=0;
       int f=0;
       int longitud=strlen((char*)buffer); //tamaño total del paquete

       struct iphdr *iph = (struct iphdr *)(buffer  + sizeof(struct ethhdr));
       int iphdrlen = iph->ihl*4;  //tamaño de la cabecera ip
       int ethhdrlen= sizeof(struct ethhdr); //tamaño de la cabecera ethernet
       int tcphdrlen= sizeof(struct tcphdr); //tamaño de la cabecera tcp
       int totalhdrlen=(tcphdrlen + iphdrlen + ethhdrlen); //suma de todas las cabeceras
       char * datos="";

       for(f=totalhdrlen;f<longitud;f++){  
               datos[i]=buffer[f];
               i++;
       }
       datos[i]='\0';
       printf("datos: %s\n", datos);
     
       return datos;
}
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

0xDani

El fallo de segmentacion creo que te lo da por la forma en que usas la variable datos. Prueba a reservarle memoria.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

soyloqbuskas

¡Buenas 0xDani !

He probado con un malloc y diclarandome la variable datos como un array de caracteres, y de ambas formas no me da fallo de segmentacion. El tema esta en que la variable datos se queda vacia, cuando deberia contener datos de la capa de aplicacion.


char* getPayloadTcp(char* buffer){
        int i=0;
        int f=0;
        int longitud=sizeof((char*)buffer); //tamaño total del paquete (tambien he probado con strlen(buffer))

        struct iphdr *iph = (struct iphdr *)(buffer  + sizeof(struct ethhdr));
        int iphdrlen = iph->ihl*4;  //tamaño de la cabecera ip
        int ethhdrlen= sizeof(struct ethhdr); //tamaño de la cabecera ethernet
        int tcphdrlen= sizeof(struct tcphdr); //tamaño de la cabecera tcp
        int totalhdrlen=(tcphdrlen + iphdrlen + ethhdrlen); //suma de todas las cabeceras
        char  *datos=(char *) malloc(65565);
        printf("cabecera: %d\npaquete: %d\n",totalhdrlen, longitud);
        for(f=totalhdrlen;f<longitud;f++){
                datos[i]=buffer[f];
                i++;
        }
        datos[i]='\0';
        printf("datos: %s\n", datos);

        return datos;
}


He hecho unos printf() de la variable totalhdrlen y de longitud y el resultado es 54 y 4 respectivamente....Cuando en realidad longitud deberia ser siempre mayor que totalhdrlen...algo debo estar haciendo mal...
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

0xDani

¿Que quieres hacer en esta linea?

struct iphdr *iph = (struct iphdr *)(buffer  + sizeof(struct ethhdr));

Le asignas a un puntero a iphdr buffer (que es un puntero a char) mas el tamaño de otra estructura?
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

soyloqbuskas

#5
Uuuups! vaya fallo.

otra cosa mas....
la variable buffer es un puntero a un malloc(). ¿Como puedo imprimir el contenido del malloc?

ejemplo:


int data_size=0;
char * buffer=(char *)malloc(65536);
data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , (socklen_t*)&saddr_size);
printf("data_size: %d\n", data_size);
printf("strlen: %d\n",strlen(buffer));
printf("sizeof: %d\n",sizeof(buffer)); // sizeof strlen y datasize no son iguales....por que?
printf("buffer: \n%s\n", buffer); //aqui me imprime el puntero buffer, pero no el contenido del malloc

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

0xDani

¿A que te refieres con imprimir el contenido del malloc()? ¿Que es lo que te imprime?
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

soyloqbuskas

Pues....haber supuestamente al hacer el printf(buffer); deberia imprimirme el paquete completo...se que lo va a imprimir mal porque va intentar imprimir en ascii todo el buffer, pero si el tamaño del bufer es de 208 bytes, deberia imprimirme 208 caracteres ascii. Pêro no es asi....cuando hago un printf(buffer) solo me imprime 7 caracteres:
CitarL���puܸ"

Y esto no deberia ser asi porque la funcion rcevfrom(); me retorna 208 bytes.
data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , (socklen_t*)&saddr_size);

Por tanto si data_size=208 pero al hacer un printf(buffer); no imprime 208 caracteres...es porque algo falla.....y no doy con ello...
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

0xDani

Yo creo que va bien, lo que pasa es que algunos caracteres te los va a imprimir y otros no. No estoy seguro pero creo que algunos caracteres la consola directamente no los imprime.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

soyloqbuskas

¡Buenas!

La funcion getPayload ya la tengo bien hecha solo tengo una duda. Para calcular la suma de todas las cabeceras y que funcione correctamente debo hacer lo siguiente.
int hdrSize=( sizeof (struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr) + 12 );

¿El 12 magico porque debo sumarselo?

Creo que esos 12 bytes son 8 de la cabecera ethernet y 4 de la cabecera tcp. Cocretamente son:

7 bytes del preambulo de la cabecera ethernet
1 byte del delimitador del inicio de trama de la cabecera ethernet
4 bytes del campo de opciones de la cabera tcp.

Esto creo que se debe a que el struct ethhdr solo tiene los campos srcMAC destMAC y protocolo, y el strcut tcphdr no inculye el campo de opciones....

¿mis sospechas son correctas?

Un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw