2010-03-29 46 views
8

Tengo un puntero a una función (que obtengo de un vtable) y deseo editar la función cambiando el código del ensamblador (cambiando algunos bytes) en tiempo de ejecución. Intenté usar memset y también intenté asignar el nuevo valor directamente (algo así como mPtr [0] = X, mPtr [1] = Y etc.) pero sigo recibiendo errores de segmentación. ¿Cómo puedo cambiar el código?Cambio de código en tiempo de ejecución

(estoy usando C++)

sistema operativo es Windows.

+1

¿Qué sistema operativo? – elcuco

+1

¿Por qué estás tratando de hacer esto? seguramente la única razón es reducir la cantidad de memoria de trabajo ya que puede cargar secciones de código desde el disco. Si explica lo que está tratando de hacer, tal vez podamos ayudarlo. – thecoshman

+0

Código de auto-modificación es difícil. Este SO se escribió completamente en ensamblador porque ningún lenguaje de nivel medio tiene sintaxis para permitir el código de modificación automática: http://valerieaurora.org/synthesis/SynthesisOS/abs.html. –

Respuesta

6

En general: si la memoria se asigna con API, llame VirtualAlloc que puede cambiar los atributos de memoria con la llamada API VirtualProtect. Compruebe los primeros atributos de memoria con la llamada API VirtualQuery

+0

Gracias, esto es exactamente lo que estaba buscando – polo

3

Según el sistema operativo y/o la arquitectura, puede o no escribir en páginas ejecutables.

Consulte la documentación sobre cómo marcar páginas como ejecutables o de solo lectura en los manuales de Intel (IA-32e). El código puede estar ubicado en una sección de solo lectura, por lo tanto, no puede escribir en él.

Puede marcar el código para que no resida en páginas de solo lectura, pero es específico del compilador (los compiladores JIT lo hacen).

En MSVC, puede usar el #pragma section para crear una sección de lectura y escritura y usar #pragma alloc_text para poner funciones en él.

-1

Las secciones de memoria donde reside su código generalmente se marcan como de solo lectura. Es por eso que obtienes una falla de segmentación. Puede intentar eliminar este indicador de la sección mediante claves especiales para el compilador (no estoy seguro de eso) o modificando el archivo binario (de nuevo, no es 100% posible)

0

En general, está intentando escribir en el segmento de código, algo nuevo que los sistemas operativos le impedirán hacer. Esta es la forma en que algunos virus funcionaron.

Existen API para eliminar esa protección, pero dependen del sistema operativo.

Cuestiones relacionadas