2010-02-22 18 views
12

Solo por curiosidad, me pregunto si es posible reubicar un código durante la ejecución de un programa durante . Por ejemplo, tengo una función y esta función debe reemplazarse en la memoria cada vez que se haya ejecutado. Una idea que nos vino a la mente es usar código de auto modificación para hacer eso. De acuerdo con algunos recursos en línea, el código de auto modificación se puede ejecutar en Linux, pero todavía no estoy seguro de si es posible dicha reubicación dinámica. ¿Alguien ha experimentado con eso?Reubicación dinámica de la sección de código

+0

Como sugiere rleir, ¿no sería más fácil intercambiar punteros de funciones en lugar de reubicar cosas? – joveha

Respuesta

8

Sí, la reubicación dinámica es definitivamente posible. Sin embargo, debe asegurarse de que el código sea completamente independiente o de que acceda a las funciones globales/externas mediante referencias absolutas. Si su código puede ser completamente independiente de posición, es decir, las únicas referencias que hace son relativas a sí mismo, está configurado. De lo contrario, tendrá que hacer las correcciones usted mismo en el momento de la carga.

Con GCC, puede usar -fpic para generar código de posición independiente. Al pasar -q o --emit-relocs al vinculador se emitirá la información de reubicación. El ELF specification (enlace PDF) tiene información sobre cómo usar esa información de reubicación; si no está utilizando ELF, deberá encontrar la documentación adecuada para su formato.

0

Si todas estas funciones diferentes existen en tiempo de compilación, entonces simplemente podría usar un puntero de función para realizar un seguimiento de la siguiente que se va a llamar. Si tiene que modificar la función en tiempo de ejecución y esa modificación no se puede realizar en su lugar, también puede usar un puntero de función que se actualiza con la dirección de la nueva función cuando se crea/carga. El resto de su sistema llamará a la función de modificación automática a través del puntero de función y, por lo tanto, no tiene que saber o preocuparse por el código de modificación automática y solo tiene que hacer la corrección en un solo lugar.

3

Como dice Carl, se puede hacer, pero estás abriendo una lata de gusanos. En la práctica, las únicas personas que se toman la molestia de hacer esto son académicos o autores de malware (que ahora se ponen mi capa a prueba de llamas).

Puede copiar un código en una región de montón malloc, luego llamarlo a través de punteros de función, pero dependiendo del sistema operativo puede que tenga que habilitar la ejecución en el segmento. Puede intentar copiar algún código en el segmento de código (teniendo cuidado de no sobrescribir la siguiente función), pero es probable que el sistema operativo haya convertido este segmento en de solo lectura. Es posible que desee ver el kernel de Linux y ver cómo carga sus módulos.

+1

+1 resume algunos puntos agradables. Acerca de los modos de página para escribir/ejecutar: puede cambiar esos sobre la marcha con VirtualProtect en win32 y mprotect en Linux. Y todas las páginas legibles deberían ser ejecutables también porque nuestros antepasados ​​entendieron mal algo – joveha

Cuestiones relacionadas