Tratando de no operación de una instrucción
-
16-09-2019 - |
Pregunta
¿Es posible el uso de herramientas GNU (gcc, binutils, etc) para modificar todas las apariciones de una instrucción de montaje en un no-op? Específicamente, gcc con la opción -pg genera el siguiente conjunto (ARM):
0x0: e1a0c00d mov ip, sp
0x4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
0x8: e24cb004 sub fp, ip, #4 ; 0x4
0xc: ebfffffe bl 0 <mcount>
Quiero grabar la dirección de esta última instrucción y, a continuación, cambiar a un nop como en el siguiente código
0x0: e1a0c00d mov ip, sp
0x4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
0x8: e24cb004 sub fp, ip, #4 ; 0x4
0xc: e1a00000 nop (mov r0,r0)
El núcleo de Linux puede hacer algo similar a esto en tiempo de ejecución, pero estoy buscando una solución en tiempo de compilación.
Solución
Esto sin duda será más fácil con un formato de instrucciones de longitud fija RISC-ish que por ejemplo, x86.
Debería ser relativamente fácil de usar libelf (buen tutorial aquí: http : //people.freebsd.org/~jkoshy/download/libelf/article.html ) o libbfd ( http://sourceware.org/binutils/docs-2.19/bfd/index.html ) para abrir el archivo de objeto, modificar las instrucciones dentro de la sección .text, y escribirlo de nuevo utilizando las API proporcionadas. Si vale la pena el esfuerzo o no dependerá de consideraciones no técnicas (soy un poco de curiosidad, aunque ...).
Vale la pena mencionar que podría haber algunas arrugas con el uso de libelf o libbfd si esto tiene que trabajar en un entorno de desarrollo transversal.
Otros consejos
Se puede compilar el código con gcc -S
para emitir una lista ensamblador, en lugar de compilar plenamente en un archivo objeto o ejecutable. A continuación, basta con sustituir las instrucciones deseadas sin-ops (por ejemplo utilizando sed
), y continuar la compilación de allí.
Si usted también quiere hacer esto para los archivos de objetos o bibliotecas que no tienen el código fuente original para, en su lugar se le tienen que utilizar una herramienta como objdump(1)
para desmontarlas y obtener las direcciones de las instrucciones que desea reemplazar. A continuación, analizar las cabeceras de los archivos objeto de encontrar los desplazamientos dentro del archivo de esas instrucciones, y luego vuelva a colocar las instrucciones de la máquina sin-ops directamente en los archivos de objetos. Esto es un poco más difícil, pero factible.