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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


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


Desconectado Desconectado

Mensajes: 438


Ver Perfil
puntero a funcion
« en: 3 Septiembre 2012, 21:55 pm »

buenas a todos,

ando investigando el tema de los punteros a funciones y sus utilidades, y una que me ha llamado la atencion es la de cambiar el codigo en tiempo de ejecucion, sin tener que volver a compilar. estaba haciendo un pequeño ejemplo sacado de una web, y no se por que me da error de segmentation fault. el code es el siguiente:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. int (*pfn)();
  6. char codigo[]={0x55,0x48,0x89,0xe5,0xb8,0x01,0x00,0x00,0x00,0xc9,0xc3};
  7.  
  8. pfn=&codigo[0];
  9. printf("Valor inicial: %d\n", pfn());
  10. codigo[5]=0x05;
  11. printf("Valor cambiado: %d\n", pfn());
  12.  
  13. return 0;
  14. }

la cadena "codigo" la he hecho escribiendo la siguiente funcion:

Código
  1. int funcion() {
  2. return 0x01;
  3. }

en un archivo a parte, creando luego el archivo objeto con: gcc -c funcion.c, y luego viendo su codigo binario en la terminal con una utilidad en mac llamada otool semejante a objdump.

el tema es que escribo el mismo programa que el de la web y no se por que a mi me falla... la web es esta:

http://usuarios.multimania.es/rllopis/mainMutante.html

alguien sabe que puede pasar? este es un tema completamente nuevo para mi, y con un par de buenos links de ayuda para leer ya estaria mas que satisfecho. llevo un par de horas dando vueltas por google y sigo casi como he empezado...

gracias y un saludo!


« Última modificación: 3 Septiembre 2012, 22:43 pm por xiruko » En línea

soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: puntero a funcion
« Respuesta #1 en: 3 Septiembre 2012, 22:47 pm »

¡Buenas xiruko!

La verdad es que a ese codigo no le veo mucho sentido....no termino de entender que es lo que se pretende....pero echate un vistazo a este enlace que tiene ejemplos de punteros a funciones:

http://copstone.com/2010/01/punteros-a-funciones/

De todas formas si te da un Segment Fault (fallo de segmentacion) esto se debe a tu programa esta intentado a acceder a posiciones de memoria no permitidas. Y probablemente el fallo este en estas 2 lineas:

Código
  1. pfn=&codigo[0];
  2. printf("Valor inicial: %d\n", pfn());
  3.  

Al puntero pfn le estas asginado el puntero que apunta a codigo[0] (y esta posicion no esta apuntando a ninguna funcion probablemente). Por eso cuando haces el printf() y se va a ejecutar la funcion, lo que hace el programa es irse a la posicion que le has asignado al puntero (que vete a saber cual es) y resulta que alli no hay ninguna funcion y encima puede que estes accediendo a una posicion fuera del mapa de memoria asignado a tu programa.....

De hecho al compilarlo me ha dado un warning...(yo en mi caso he metido el main y la funcion en el mismo fichero...)
Citar
####@%%%%:/home/%%%%%/Escritorio# gcc -Wall prueba.c -o prueba
prueba.c: In function ‘main’:
prueba.c:13:5: warning: assignment from incompatible pointer type [enabled by default]
Creo que ese codigo no esta bien....

Un saludo.


« Última modificación: 3 Septiembre 2012, 22:52 pm 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
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: puntero a funcion
« Respuesta #2 en: 3 Septiembre 2012, 22:58 pm »

gracias por el link, lo he mirado por encima y mas o menos eso ya es lo que habia visto, aunque ahora le dedicare un rato a leerlo bien e intentare entenderlo del todo, ya que por los comentarios parece buen material.

pero el tema es, figura que en "codigo" esta la funcion funcion() (tendria que haber cogido otro nombre...) en codigo maquina, y por lo tanto al hacer pfn=&codigo[0] lo que en teoria se esta haciendo y que ademas parece logico segun lo que hacen en la web, es decirle que el puntero a funcion apunte a donde comienza la funcion funcion(), y seguira avanzando por ahi hasta que se encuentre el return no? no se si me he liado escribiendo... pero bueno eso es lo que me gustaria realmente aprender, por eso si tienes algun link que hable sobre codigos mutantes aunque sea en ingles estaria muy agradecido.

un saludo!

edito: bueno... que no esta bien esta claro si da un segmentation fault... xD

Citar
encima puede que estes accediendo a una posicion fuera del mapa de memoria asignado a tu programa.....

fuera del mapa? pero si estoy accediento a la posicion de la variable "codigo" la cual forma parte de mi programa, entonces no estoy yendo fuera no? lo de que no se encuentra ninguna funcion alli si que puede ser, aunque seguro que debe haber alguna manera de hacer algo parecido.
« Última modificación: 3 Septiembre 2012, 23:04 pm por xiruko » En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: puntero a funcion
« Respuesta #3 en: 3 Septiembre 2012, 23:44 pm »

Viendo el link que has puesto, es reseñable el hecho de que en el ejemplo del citado link se modifica la posicion 4 del array, no la 5.

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
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: puntero a funcion
« Respuesta #4 en: 4 Septiembre 2012, 00:06 am »

en mi caso el valor de retorno esta en la posicion 5 y en la suya el 4. aunque eso es lo de menos, he quitado la parte del codigo que cambia el numero quedandome solo con la asignacion del puntero y el primer printf, y sigue dando error.

el caso es, si declaro la variable "codigo" como local dentro del main, el error es de seg fault; en cambio si la declaro global, el error es bus error. sigo investigando y al menos he encontrado algo que puede arrojar algo de luz sobre el asunto. si consigo algo ya posteare, un saludo
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: puntero a funcion
« Respuesta #5 en: 4 Septiembre 2012, 01:29 am »

Guao yo no había tocado este tema en C , te dejo esto para que lo mires: http://publications.gbdirect.co.uk/c_book/chapter5/function_pointers.html , en C++ hay problemas con los cast de tipos a (void*)() , y es un coñazo, os dejo la salida y  confirmo que funciona, por cierto que modifique el código en la posición del array no importa , pues el valor de retorno son los 4 bytes esos, lo que pasa es que les hace un cast a int.
Código:
Valor retornado por f antes de mutar   ... f() = 1
Valor retornado por f despues de mutar ... f() = 8

Process returned 0 (0x0)   execution time : 0.009 s
Press any key to continue.
« Última modificación: 4 Septiembre 2012, 01:51 am por avesudra » En línea

Regístrate en
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: puntero a funcion
« Respuesta #6 en: 4 Septiembre 2012, 01:49 am »

 :o

el que funciona?? el codigo de la web? y como lo has hecho? xD

Citar
Guao yo no había tocado este tema en C

ni yo, y es una pasada lo que se puede llegar a hacer ;-)
« Última modificación: 4 Septiembre 2012, 01:52 am por xiruko » En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: puntero a funcion
« Respuesta #7 en: 4 Septiembre 2012, 01:52 am »

:o

el que funciona?? el codigo de la web? y como lo has hecho? xD
No he hecho nada xD , qué compilador estais usando ? yo el gcc (mingw para ser exactos y bajo windows 7), esto es lo que he puesto:
CUIDADIN:
Mirad lo que pone encima de la pagina web :
CODIGO C AUTOMUTANTE.
           
            COMPILADO CON GNU GCC SOBRE CYGWIN PARA WINDOWS-98.

           
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    //Declaro una variable de tipo puntero a función:
  6.    int (*pfn)();
  7.  
  8.    /* Escribo el código máquina de la función:
  9.  
  10.         int mutante()
  11.         {
  12.             return 0x01;
  13.         }
  14.  
  15.         NOTA IMPORTANTE:
  16.  
  17.         Para obtener el código máquina de una función hacemos lo siguiente:
  18.  
  19.             1.Escribir un archivo fuente con el código C de la funcion.
  20.  
  21.             2.Compilar el archivo fuente para obtener el archivo objeto:
  22.               ($ es el prompt del sistema)
  23.  
  24.                $ cc -c mutante.c -o mutante.o
  25.  
  26.             3.Una vez tenemos el archivo objeto,vemos su codigo binario:
  27.  
  28.                $ objdump -s mutante.o
  29.  
  30.             4.Y ya está; sólo falta copiar la salida del comando anterior y
  31.               ponerlo en un array de chars.
  32.  
  33.     */
  34.  
  35.    //código máquina equivalente de la función anterior:
  36.    char codigo[]={
  37.        0x55,//0
  38.        0x89,//1
  39.        0xe5,//2
  40.        0xb8,//3
  41.  
  42.        0x01,//4 <-- esto lo voy a mutar después (es el entero que retorna pfn).
  43.        0x00,//5
  44.        0x00,//6
  45.        0x00,//7
  46.  
  47.        0x5d,//8
  48.        0xc3,//9
  49.        0x90,//10
  50.        0x90,//11
  51.  
  52.        0x90,//12
  53.        0x90,//13
  54.        0x90,//14
  55.        0x90 //15
  56.    };
  57.  
  58.    //ahora hago que el puntero a función apunte al primer elemento del array:
  59.    pfn = &codigo[0];
  60.  
  61.    //comprobemos que efectivamente muta:
  62.    printf("Valor retornado por f antes de mutar   ... f() = %d\n",pfn());
  63.  
  64.    //Mutar el código.Para ello,cambio el valor que retorna pfn en el array de código:
  65.    codigo[4] = 0x8;
  66.  
  67.    printf("Valor retornado por f despues de mutar ... f() = %d\n",pfn());
  68.  
  69.    return 0;
  70. }
  71.  
« Última modificación: 4 Septiembre 2012, 01:57 am por avesudra » En línea

Regístrate en
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: puntero a funcion
« Respuesta #8 en: 4 Septiembre 2012, 01:56 am »

pues a mi me da segmentation fault...  :huh:
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: puntero a funcion
« Respuesta #9 en: 4 Septiembre 2012, 01:59 am »

pues a mi me da segmentation fault...  :huh:
Mira lo que he puesto en el post de antes , lo he modificado.
En línea

Regístrate en
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
puntero a funcion
Programación C/C++
kondrag_X1 2 3,343 Último mensaje 30 Abril 2011, 19:49 pm
por leogtz
Funcion y puntero
Programación C/C++
gonzalo_C 2 2,280 Último mensaje 9 Febrero 2012, 17:01 pm
por gonzalo_C
Arreglo y puntero en una funcion [No me corre]
Programación C/C++
barnix456 9 4,375 Último mensaje 12 Noviembre 2012, 15:29 pm
por barnix456
Devolver puntero a cadena en función
ASM
silver2050 2 2,812 Último mensaje 22 Mayo 2013, 00:31 am
por silver2050
Necesito ayuda con Puntero a función miembro.(Solucionado)
Programación C/C++
anonimo12121 0 1,676 Último mensaje 24 Junio 2013, 18:01 pm
por anonimo12121
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines