¿Cuál es la forma correcta de reemplazar porciones muy pequeñas de un archivo binario programáticamente?

StackOverflow https://stackoverflow.com/questions/2395077

Pregunta

Tengo un código de juego (del proyecto IOQUAKE3) que compila parte de los binarios de juego en la mosca (el sistema QVM). Ahora, uno podría acelerarlo cargando binarios previamente guardados de esta operación (con cualquier precauciones de cambio de archivos en su lugar).

Pero, los punteros a las funciones guardadas en estos binarios no son persistentes a través de las sesiones.

¿Cuál sería la forma correcta de cambiarlos en la marcha? (Teniendo en cuenta que uno tiene el ensamblador y el ensamblaje disponible en la aplicación principal)

¿Fue útil?

Solución

Eso es más o menos lo que hace un cargador normal para los ejecutables. Por lo general, trabajan almacenando una tabla de los lugares, hay referencias a direcciones que deberán cambiarse en función de dónde se carga el archivo. Por lo general, almacenan una dirección relativa en cada una de esas ubicaciones, por lo que para cargar el archivo, mira la tabla y agrega la dirección de carga base a lo que hay en cada una de esas direcciones, y coloca ese resultado en la imagen a medida que se carga en la memoria.

Otros consejos

Pase una tabla de punteros de función relevante como parámetro. Alternativamente, puede haber generado el código confiado en un área de datos que se coloca en una ubicación fija, en relación con el código.

Recuerdo que cuando estaba jugando con estas cosas, configuré una página de memoria de lectura/escritura/ejecución, usé la primera mitad para el código generado y la segunda mitad para los datos. El código, una vez que obtuvo el control, iría así:

call l
l:
pop eax ; eax has the current eip
and eax, 0fffff000h ;round down to the page size, 4K AKA 0x1000
add eax, 800h ;now eax points at the data area

...y así.

Para el código generado a gran escala, es posible que desee almacenarlo como DLL de soplado completo y hacer uso de los servicios de reubicación y direcciones proporcionados por el sistema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top