elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  funcion getPayloadTcp() en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: funcion getPayloadTcp() en C  (Leído 3,093 veces)
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
funcion getPayloadTcp() en C
« en: 28 Septiembre 2012, 00:14 am »

¡Buenas a todos!

Necesito hacer una funcion que me permita sacar el payload (campo de datos) de un paquete TCP.
La funcion seria asi....
Código
  1. char * getPayloadTcp(char* buffer){
  2.  
  3.      //separar la cabecera del campo de datos....
  4.      //¿como puedo hacer esto? no quiero codigo, solo el nombre de funciones que me permita hacerlo
  5.  
  6.  
  7.     return payload;
  8. }
  9.  

Estoy trabajando con C en linux.

Un saludo.


« Última modificación: 28 Septiembre 2012, 00:15 am por soyloqbuskas » En línea

"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

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #1 en: 28 Septiembre 2012, 01:05 am »

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

Código
  1.  
  2. char* getPayloadTcp(char* buffer){
  3.        int i=0;
  4.        int f=0;
  5.        int longitud=strlen((char*)buffer); //tamaño total del paquete
  6.  
  7.        struct iphdr *iph = (struct iphdr *)(buffer  + sizeof(struct ethhdr));
  8.        int iphdrlen = iph->ihl*4;  //tamaño de la cabecera ip
  9.        int ethhdrlen= sizeof(struct ethhdr); //tamaño de la cabecera ethernet
  10.        int tcphdrlen= sizeof(struct tcphdr); //tamaño de la cabecera tcp
  11.        int totalhdrlen=(tcphdrlen + iphdrlen + ethhdrlen); //suma de todas las cabeceras
  12.        char * datos="";
  13.  
  14.        for(f=totalhdrlen;f<longitud;f++){  
  15.                datos[i]=buffer[f];
  16.                i++;
  17.        }
  18.        datos[i]='\0';
  19.        printf("datos: %s\n", datos);
  20.  
  21.        return datos;
  22. }
  23.  


« Última modificación: 28 Septiembre 2012, 01:32 am por soyloqbuskas » En línea

"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


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #2 en: 28 Septiembre 2012, 12:48 pm »

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

Saludos.
En línea

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

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #3 en: 29 Septiembre 2012, 18:32 pm »

¡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.

Código
  1. char* getPayloadTcp(char* buffer){
  2.        int i=0;
  3.        int f=0;
  4.        int longitud=sizeof((char*)buffer); //tamaño total del paquete (tambien he probado con strlen(buffer))
  5.  
  6.        struct iphdr *iph = (struct iphdr *)(buffer  + sizeof(struct ethhdr));
  7.        int iphdrlen = iph->ihl*4;  //tamaño de la cabecera ip
  8.        int ethhdrlen= sizeof(struct ethhdr); //tamaño de la cabecera ethernet
  9.        int tcphdrlen= sizeof(struct tcphdr); //tamaño de la cabecera tcp
  10.        int totalhdrlen=(tcphdrlen + iphdrlen + ethhdrlen); //suma de todas las cabeceras
  11.        char  *datos=(char *) malloc(65565);
  12.        printf("cabecera: %d\npaquete: %d\n",totalhdrlen, longitud);
  13.        for(f=totalhdrlen;f<longitud;f++){
  14.                datos[i]=buffer[f];
  15.                i++;
  16.        }
  17.        datos[i]='\0';
  18.        printf("datos: %s\n", datos);
  19.  
  20.        return datos;
  21. }
  22.  

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...
En línea

"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


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #4 en: 29 Septiembre 2012, 20:19 pm »

¿Que quieres hacer en esta linea?

Código
  1. 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?
En línea

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

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #5 en: 29 Septiembre 2012, 22:50 pm »

Uuuups! vaya fallo.

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

ejemplo:

Código
  1. int data_size=0;
  2. char * buffer=(char *)malloc(65536);
  3. data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , (socklen_t*)&saddr_size);
  4. printf("data_size: %d\n", data_size);
  5. printf("strlen: %d\n",strlen(buffer));
  6. printf("sizeof: %d\n",sizeof(buffer)); // sizeof strlen y datasize no son iguales....por que?
  7. printf("buffer: \n%s\n", buffer); //aqui me imprime el puntero buffer, pero no el contenido del malloc
  8.  
« Última modificación: 30 Septiembre 2012, 00:32 am por soyloqbuskas » En línea

"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


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #6 en: 30 Septiembre 2012, 13:38 pm »

¿A que te refieres con imprimir el contenido del malloc()? ¿Que es lo que te imprime?
En línea

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

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #7 en: 30 Septiembre 2012, 16:25 pm »

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:
Citar
L���puܸ"

Y esto no deberia ser asi porque la funcion rcevfrom(); me retorna 208 bytes.
Código
  1. 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...
En línea

"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


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #8 en: 30 Septiembre 2012, 16:40 pm »

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.
En línea

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

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: funcion getPayloadTcp() en C
« Respuesta #9 en: 4 Octubre 2012, 13:55 pm »

¡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.
Código
  1. 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.
En línea

"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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
manejo de argumentos en funcion dentro de funcion ???
PHP
SpiderNet 2 3,432 Último mensaje 30 Septiembre 2008, 03:01 am
por SpiderNet
Duda con funcion dentro de funcion en un echo
PHP
N4X 6 5,864 Último mensaje 21 Enero 2010, 18:12 pm
por N4X
Función que retorna el valor de retorno de otra función
Programación C/C++
naderST 7 4,747 Último mensaje 7 Diciembre 2011, 23:45 pm
por naderST
Evaluar Una Funcion dentro de otra funcion Python
Scripting
cristiantorres 1 10,375 Último mensaje 14 Abril 2012, 06:20 am
por cristiantorres
[javascript] llamar a funcion que se recibe por parametro de la funcion
Desarrollo Web
Graphixx 0 5,642 Último mensaje 24 Abril 2012, 19:36 pm
por Graphixx
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines