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
Respuesta
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.
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.
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 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
- 1. reubicación interna no reparada
- 2. Herramienta para modificar la sección dinámica de un binario ELF
- 3. excepción Python de reubicación/reincidencia
- 4. InnoSetup: Obtener AppName en la sección [Código]
- 5. Excluir sección de código del formato de código
- 6. Actualizar una sección después de la adición de HTML de forma dinámica a jQuery Mobile
- 7. ¿Cómo uso "código" en la sección [Archivos] de Inno Setup?
- 8. Reubicación de una implementación de ClickOnce
- 9. ¿Qué significa la reubicación R_X86_64_32S y R_X86_64_64?
- 10. Reubicación de sucursales remotas en Git
- 11. Mac PackageMaker - Permitir Reubicación Cuestiones
- 12. ASP.NET inserta código de forma dinámica en la cabecera
- 13. Constante Inno Setup en el Código Sección
- 14. ¿Qué significa este código de sección de renderizado?
- 15. sección Html5 o no a la sección?
- 16. Sección dentro de una sección - UITableView -
- 17. Netbeans: Formato automático: evitarlo para una sección de mi código
- 18. asignación dinámica de la memoria
- 19. definen una sección de programa en código C (GCC)
- 20. la conversión dinámica de oponerse
- 21. Contratos de código + Castillo de arena: ¿hay alguna forma de personalizar la sección de excepciones?
- 22. ¿Cómo puedo evaluar el código de C# de forma dinámica?
- 23. Compilación de código de forma dinámica con C#
- 24. Speeding tabla dinámica que filtra código VBA
- 25. Bigote: variables de lectura de la sección primaria en la sección secundaria
- 26. GNU ld quita la sección
- 27. reubicación R_X86_64_32 contra un error de símbolo local
- 28. Cómo usar reubicación en flujos de trabajo asíncronos en F #?
- 29. Usando Google Closure Compiler puede excluir una sección de código fuente de la versión compilada?
- 30. ¿La mayoría de las bibliotecas portátiles para la generación dinámica de código?
Como sugiere rleir, ¿no sería más fácil intercambiar punteros de funciones en lugar de reubicar cosas? – joveha