c++ - que - codigos de area mexico
código de llamada almacenado en el montón de vc++ (4)
En realidad, Malloc probablemente no lo cortará. En Windows probablemente necesite llamar a algo como [VirtualAlloc] ( http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx) para obtener una página de memoria ejecutable.
Comenzando pequeño:
void main(void)
{
char* p = (char*)VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
p[0] = (char)0xC3; // ret
typedef void (*functype)();
functype func = (functype)p;
(*func)();
}
El próximo paso para jugar bien con su código es preservar el registro EBP. Esto se deja como un ejercicio. :-)
Después de escribir esto, lo ejecuté con malloc y también funcionó. Eso puede ser porque estoy ejecutando una cuenta de administrador en Windows 2000 Server. Es posible que otras versiones de Windows necesiten la llamada VirtualAlloc. Quién sabe.
Imagina que estoy haciendo algo como esto:
void *p = malloc (1000);
*((char*)p) = some_opcode;
*((char*)p+1) = another_opcode; // for the sake of the example: the opcodes are ok
....
etc...
¿Cómo puedo definir un puntero a la función para llamar a p como si fuera una función? (estoy usando VC ++ 2008 express).
Gracias
Si tiene los códigos de operación correctos, las llamadas pueden ser tan simples como enviar un puntero a la función y llamarlo.
typedef void (*voidFunc)();
char *p = malloc (1000);
p[0] = some_opcode;
p[1] = another_opcode; // for the sake of the example: the opcodes are ok
p[n] = // return opcode...
((voidFunc)p)();
Sin embargo, tenga en cuenta que a menos que marque la página como ejecutable, es posible que su procesador no le permita ejecutar el código generado en el montón.
Un comentario no era suficiente espacio. Joe_Muc es correcto. No debe rellenar el código en la memoria obtenida por malloc
o new
. Te encontrarás con problemas si cambias las propiedades de página de las páginas asignadas por Windows.
Esto no es un problema porque al usar VirtualAlloc () y las API WIn32 relacionadas es muy fácil: llamar a VirtualAlloc ( ) y configurar flProtect
en [PAGE_EXECUTE_READWRITE][2]
Tenga en cuenta que probablemente deba hacer tres asignaciones, una página de guardia, las páginas que necesita para su código y luego otra página de guardia. Esto te dará un poco de protección contra el código incorrecto.
También envuelva las llamadas a su código generado con manejo estructurado de excepciones .
A continuación, el Windows X86 ABI (convenciones de llamadas) no está bien documentado (lo sé, lo he buscado). Hay información aquí , aquí , aquí. La mejor manera de ver cómo funcionan las cosas es mirar el código generado por el compilador. Esto es fácil de hacer con los conmutadores /FA
(hay cuatro).
Aquí puede encontrar las convenciones de llamadas de 64 bits.
Además, aún puede obtener Macro Assembler MASM de Microsoft aquí . Recomiendo escribir su código de máquina en MASM y ver su salida, luego haga que su generador de códigos de máquina haga cosas similares.
Los manuales de procesador de Intel y AMD son una buena referencia; consíguelos si no los tiene.
También estoy buscando la ejecución del código generado, y aunque las respuestas aquí no me dieron exactamente lo que necesitaba, ustedes me enviaron por el camino correcto.
Si necesita marcar una página como ejecutable en sistemas POSIX (Linux, BSD, etc.), revise la función mmap (2) .