No se si debería haber empezado otro tema pero creo que es una tontería empezar otro... haber si alguien me responde
o ayuda a alguien:
Averigüé como conseguir las instrucciones en código máquina (probaba con "objdump -s", pero depués de leer el man, ví que era "objdump -d") y lo hice como me ponía en
http://usuarios.multimania.es/rllopis/mainMutante.html... no funcionaba en mi ordenador, busqué por que, vi que era por que la zona en la que guardaba el código (el array de char), no tenía permisos de ejecución, busqué como dárselos, ví que tenía que usar "sys/mmap.h", la usé, y... ME FUNCIONÓ!
Este es el código (el que me funciona):
/*
-Escribe el código de la función en un archivo de texto.
-Compila la función con "gcc -c file.c".
-Usa "objdump -d file.o" para ver el código máquina.
*/
#include <sys/mman.h>
#include <string.h>
int main ()
{
int (*ptf)();
unsigned char *code; // <---- Contiene el código máquina de una función que retorna 5 (el código lo da objdump).
code = mmap(0,sizeof(code), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0);
code[0] = 0x55;
code[1] = 0x48;
code[2] = 0x89;
code[3] = 0xe5;
code[4] = 0xb8;
code[5] = 0x05; // <---- Lo que devuelve la función. Lo mutaremos más adelante.
code[6] = 0x00;
code[7] = 0x00;
code[8] = 0x00;
code[9] = 0x5d;
code[10] = 0xc3;
ptf = code;
printf("Antes de mutar: %d\n", ptf
());
code[5] = 0x06;
printf("Después de mutar: %d\n", ptf
()); return 0;
}
Mi duda es si lo de "sizeof(code)" está bien siendo code ¿un array dinámico, no?.