Ver la versión completa : [C] Cargar asm en memoria y ejecutarlo
Lo cierto es que el ensamblador no es mi fuerte y mas si tratamos de trabajar con C y asm a la vez. Tengo un programa que reserva una cierta cantidad de memoria y en ella graba el contenido de un fichero, el caso es que ese fichero contiene instrucciones en ensamblador, pero no se como decir desde C que "salte" a esa zona, teniendo en el puntero la dirección de comienzo del trozo en ensamblador.
Muchas gracias.
civantoz
20/07/2006, 02:29
Buenas neglox.
Creo que lo que tu andas buscando es poder ejecutar codigo en asm con las funciones inline de los compiladores de C y demas, pero creo que esas funciones no las puedes obtener desde un fichero de texto, sino que deben estar compiladas de antemano en el binario que generes (y digo creo). Para ver como puedes hacer esto mirate por ejemplo esta pagina
http://atc.ugr.es/docencia/udigital/13.html
aqui viene como introducir intrucciones asm dentro de codigo C normal, puedes encontrar muchos mas ejemplos buscando asm c inline y demas cosas asi en google, ya contaras si eso te sirve y sino especifica algo mas lo que pretendes hacer a ver que se puede conseguir :D
Venga un saludo y suerte con lo que estes haciendo
Gracias por la web, tiene bastante información para tratar asm desde C, quizas no me he explicadomuy bien pero el planteamiento es el siguiente: tengo dos ficheros
programa (ejecutable)
codigo.raw (asm ARM compilado,es como un ejecutable sin cabeceras)
Lo que hace programa es leer el fichero codigo.raw y escribirlo en memoria, eso es relativamente facil con las funciones de ficheros y *alloc. Tendremos entonces un puntero (llamemoslo pCode) que tiene la dirección de inicio de ese código.
Lo que quiero conseguir y es donde me pierdo es que la siguiente instrucción a ejecutar sea la que se encuentra en la direccion de memoria que apunta pCode.
Espero que esta vez se entienda mejor.
El kernel no te va a dejar hacer directamente tal cosa. Si reservas memoria para datos, sólo podrás meter ahí datos, no código ejecutable.
Aquí te dejo un par de ejemplo que salieron hace tiempo para cargar ensamblador en el segundo micro y ejecutarlo. No recuerdo los autores. Ya se que no es eso exactamente lo que quieres, pero quizá te sirva de ayuda :)
Suponia que podria existir alguna restriccion de ese tipo pero no estaba seguro, entonces solo quedan dos opciones, desensamblar ese codigo y compilarlo para hacerlo ejecutable en la gp2x o comprender el formato ELF y añadir las cabeceras por mi cuenta, no se que es peor. Gracias de todas formas por los datos.
< - >
He conseguido escribir un codigo para x86 (en windows) con dev-c++ y ha funcionado. Es un codigo que no sirve para nada pero si alguien me puede ayudar con esta prueba de concepto para ARM se lo agradeceria realmente.
#include <stdio.h>
#include <stdlib.h>
int a;
char *pCode;
int main(int argc, char *argv[])
{
pCode=(char*)malloc(4);
*pCode=0x33;
*(pCode+1)=0xc0; //XOR AX,AX
*(pCode+2)=0x40; //INC AX
*(pCode+3)=0xc3; //RET
__asm("mov %ax,_a"); //recuperamos valor AX
printf("%x\n",a);
__asm("mov _pCode,%eax");
__asm("call %eax"); //llamada al codigo de pCode
__asm("mov %ax,_a"); //recuperamos valor AX
printf("%x\n",a);
}
El codigo lo unico que hace es ver el valor de AX,hacer un xor con el mismo, AX=0, e incrementarlo en 1. Como lo pasamos para que sea compatible con nuestra negrita? Muchas gracias.
civantoz
21/07/2006, 00:47
Bueno WinterN a ver si me puedes poner al dia, es que programacion en linux no la he tratado mucho para este tipo de cosas y no estoy puesto en que limitaciones pone el kernel, pero cuando yo me mozeaba y hacia algo de cracking en windows habia una tecnica que era inyeccion de codigo sobre el mismo ejecutable buscando una zona lo suficientemente amplia vacia para poder poner las instrucciones necesarias ya codeadas, guardar en la pila el sitio de la direccion desde la que se saltaba a esa nueva direccion de memoria con nuestro codigo y hacer un retorno normal, que nos llevaria a donde se produjo la llamada... hay alguna parida similar en linux ?
Lo que quieres hacer encaja perfectamente en la definición de "Virus" que teníamos en los años 80/90 gracias a intel y microsoft :quepalmo: :risas:
Neogelox, si me cuentas un poco más detalladamente que es lo que quieres hacer exactamente creo que podré ayudarete...
Respecto a las restriccion esdel kernel de linux, nosotro sen el emulador estamo sgenerando codigo en ram y ejecutandolo asi que hay maneras de hacerlo...
Por otra parte, lo de cargar un "raw" el problema que tines es que el codigo que metas tendria que sere codigo "relocalizable" es decir que todos us saltos y acesos a variables sean relativos.
La otra pregunta es como vas a geenrar ese código, porqu elo mismo se puden usa librerias dinámicas y generarlo con el gcc...
Bueno , no se que decirte si me pones un ejemplo más concreto..
Unai.
El codigo lo voy a generar a partir de otro que es ensamblador ARM pero...no es 100% compatible con el de la gp2x ademas de que los accesos a los dispositivos IO supongo que se realizaran de forma diferente, quizas pueda hasta aprovechar las funcionalidades que da el kernel. Esta es la parte mas complicada del proyecto ciertamente, y en ella me encargare de cambiar posibles saltos absolutos a relativos ya que tengo bastante informacion de ese codigo.
Lo que pretendo es basicamente lo que has comentado una-i: el codigo introducirlo en ram y ejecutarlo, si puede pasarme algun snippet te lo agradeceria.
animanegra
11/08/2006, 20:22
Buenas:
¿Has probado a hacer un hilo con pthread_create y en el parametro de funcion le metes la direccion de memoria del codigo que has metido en ensamblador?
A fin de cuentas a la funcion pthread_create se le pasa la funcion con un void que es una direccion de memoria.
>>>>>>>>>>>>>>
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
<<<<<<<<<<<<<<<<<
como primer parametro te guardas el thread id, como segundo le metes NULL, el tercero el de la direccion de memoria de tu "funcion" y como cuarto otro NULL.
No se si funcionara este "trapi" chungo :S no lo he probado, pero igual...
Aupa
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.