E9Patch es una potente herramienta de reescritura de binarios estáticos para binarios ELF de Linux x86_64
. El parche E9 es:
La reescritura binaria estática toma un binario de entrada (ejecutable ELF u objeto compartido) y genera un binario de salida con algún parche/modificación aplicado. El binario parcheado se puede utilizar como reemplazo directo del original.
Para obtener más información, consulte nuestro documento PLDI'2020:
Los binarios prediseñados de E9Patch se pueden descargar aquí:
Crear E9Patch es muy fácil: simplemente ejecute el script build.sh
.
Esto creará automáticamente dos herramientas:
e9patch
: el backend de reescritura binaria; ye9tool
: una interfaz de desmontaje lineal para E9Patch. E9Patch se puede utilizar a través de la interfaz E9Tool.
Por ejemplo, para agregar instrumentación de impresión de instrucciones a todas las instrucciones xor
en xterm
, podemos usar el siguiente comando:
$ ./e9tool -M 'asm=/xor.*/' -P print xterm
Esto generará una versión modificada de xterm
escrita en el archivo a.out
.
El xterm
modificado se puede ejecutar normalmente, pero imprimirá la cadena de ensamblaje de cada instrucción xor
ejecutada en stderr
:
$ ./a.out
xorl %ebp, %ebp
xorl %ebx, %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %edi, %edi
...
Para obtener una lista completa de opciones y modos admitidos, consulte:
$ ./e9tool --help
Parchea todas las instrucciones de salto con instrumentación "vacía":
$ ./e9tool -M 'asm=/j.*/' -P empty xterm
$ ./a.out
Imprima todas las instrucciones de salto con instrumentación "imprimir":
$ ./e9tool -M 'asm=/j.*/' -P print xterm
$ ./a.out
Igual que el anterior, pero usa la sintaxis "Intel":
$ ./e9tool -M 'asm=/j.*/' -P print xterm --syntax=intel
$ ./a.out
Parchea todas las instrucciones de salto con una llamada a una función vacía:
$ ./e9compile.sh examples/nop.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@nop' xterm
$ ./a.out
Parchea todas las instrucciones de salto con instrumentación de recuento de instrucciones:
$ ./e9compile.sh examples/counter.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@counter' xterm
$ FREQ=10000 ./a.out
Parchea todas las instrucciones de salto con una bonita instrumentación impresa:
$ ./e9compile.sh examples/print.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry(addr,instr,size,asm)@print' xterm
$ ./a.out
Parchea todas las instrucciones de salto con instrumentación de "retraso" para ralentizar el programa:
$ ./e9compile.sh examples/delay.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@delay' xterm
$ DELAY=100000 ./a.out
Notas :
XTerm(322)
Algunos otros proyectos que utilizan E9Patch incluyen:
libc.so
E9Patch es una herramienta de bajo nivel diseñada para ser integrable en otros proyectos. Para obtener más información, consulte la siguiente documentación:
Los errores se pueden informar aquí:
La versión actual de E9Patch ha mejorado significativamente en comparación con el prototipo original evaluado en el documento PLDI'2020. Específicamente:
-O2
a E9Tool.Este software ha sido lanzado bajo la Licencia Pública GNU (GPL) Versión 3.
Algunos archivos específicos se publican bajo la licencia MIT (consulte el preámbulo del archivo).
Este trabajo fue parcialmente apoyado por el Satélite Nacional de Excelencia en Sistemas de Software Confiables, financiado por la Fundación Nacional de Investigación (NRF) de Singapur en el marco del programa Nacional de I+D en Ciberseguridad (NCR).