E9Patch é uma poderosa ferramenta de reescrita binária estática para binários ELF x86_64
Linux. E9Patch é:
A reescrita binária estática pega um binário de entrada (executável ELF ou objeto compartilhado) e gera um binário de saída com algum patch/modificação aplicado a ele. O binário corrigido pode ser usado como um substituto imediato do original.
Para obter mais informações, consulte nosso artigo PLDI'2020:
Binários E9Patch pré-construídos podem ser baixados aqui:
Construir o E9Patch é muito fácil: basta executar o script build.sh
.
Isso criará automaticamente duas ferramentas:
e9patch
: o backend do reescritor binário; ee9tool
: uma interface de desmontagem linear para E9Patch. E9Patch pode ser usado através do frontend E9Tool.
Por exemplo, para adicionar instrumentação de impressão de instruções a todas as instruções xor
em xterm
, podemos usar o seguinte comando:
$ ./e9tool -M 'asm=/xor.*/' -P print xterm
Isto irá gerar uma versão modificada do xterm
gravada no arquivo a.out
.
O xterm
modificado pode ser executado normalmente, mas imprimirá a string assembly de cada instrução xor
executada em stderr
:
$ ./a.out
xorl %ebp, %ebp
xorl %ebx, %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %edi, %edi
...
Para obter uma lista completa de opções e modos suportados, consulte:
$ ./e9tool --help
Corrija todas as instruções de salto com instrumentação "vazia":
$ ./e9tool -M 'asm=/j.*/' -P empty xterm
$ ./a.out
Imprima todas as instruções de salto com instrumentação "print":
$ ./e9tool -M 'asm=/j.*/' -P print xterm
$ ./a.out
O mesmo que acima, mas use a sintaxe "Intel":
$ ./e9tool -M 'asm=/j.*/' -P print xterm --syntax=intel
$ ./a.out
Corrija todas as instruções de salto com uma chamada para uma função vazia:
$ ./e9compile.sh examples/nop.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@nop' xterm
$ ./a.out
Corrija todas as instruções de salto com instrumentação de contagem de instruções:
$ ./e9compile.sh examples/counter.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@counter' xterm
$ FREQ=10000 ./a.out
Corrija todas as instruções de salto com uma bela instrumentação impressa:
$ ./e9compile.sh examples/print.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry(addr,instr,size,asm)@print' xterm
$ ./a.out
Corrija todas as instruções de salto com instrumentação de "atraso" para desacelerar o programa:
$ ./e9compile.sh examples/delay.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@delay' xterm
$ DELAY=100000 ./a.out
Notas :
XTerm(322)
Alguns outros projetos que usam E9Patch incluem:
libc.so
.E9Patch é uma ferramenta de baixo nível projetada para ser integrável a outros projetos. Para saber mais, consulte a seguinte documentação:
Bugs podem ser relatados aqui:
A versão atual do E9Patch foi significativamente melhorada em comparação com o protótipo original avaliado no artigo PLDI'2020. Especificamente:
-O2
para o E9Tool.Este software foi lançado sob a Licença Pública GNU (GPL) Versão 3.
Alguns arquivos específicos são liberados sob a licença do MIT (verifique o preâmbulo do arquivo).
Este trabalho foi parcialmente apoiado pelo Satélite Nacional de Excelência em Sistemas de Software Confiáveis, financiado pela Fundação Nacional de Pesquisa (NRF) de Cingapura no âmbito do programa Nacional de P&D em Segurança Cibernética (NCR).