E9Patch ist ein leistungsstarkes statisches Binär-Rewriting-Tool für x86_64
Linux ELF-Binärdateien. E9Patch ist:
Beim statischen Binärumschreiben wird eine Eingabebinärdatei (ausführbare ELF-Datei oder ein gemeinsam genutztes Objekt) verwendet und eine Ausgabebinärdatei mit einigen darauf angewendeten Patches/Änderungen generiert. Die gepatchte Binärdatei kann als Ersatz für das Original verwendet werden.
Weitere Informationen finden Sie in unserem PLDI'2020-Papier:
Vorgefertigte E9Patch-Binärdateien können hier heruntergeladen werden:
Das Erstellen von E9Patch ist sehr einfach: Führen Sie einfach das Skript build.sh
aus.
Dadurch werden automatisch zwei Tools erstellt:
e9patch
: das Binär-Rewriter-Backend; Unde9tool
: ein lineares Demontage-Frontend für E9Patch. E9Patch ist über das E9Tool-Frontend nutzbar.
Um beispielsweise allen xor
-Anweisungen in xterm
eine Anweisungsdruckinstrumentierung hinzuzufügen, können wir den folgenden Befehl verwenden:
$ ./e9tool -M 'asm=/xor.*/' -P print xterm
Dadurch wird eine modifizierte Version von xterm
generiert, die in die a.out
Datei geschrieben wird.
Das geänderte xterm
kann wie gewohnt ausgeführt werden, gibt jedoch die Assembly-Zeichenfolge jeder ausgeführten xor
Anweisung an stderr
aus:
$ ./a.out
xorl %ebp, %ebp
xorl %ebx, %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %edi, %edi
...
Eine vollständige Liste der unterstützten Optionen und Modi finden Sie unter:
$ ./e9tool --help
Patchen Sie alle Sprunganweisungen mit „leerer“ Instrumentierung:
$ ./e9tool -M 'asm=/j.*/' -P empty xterm
$ ./a.out
Drucken Sie alle Sprunganweisungen mit der Instrumentierung „Drucken“ aus:
$ ./e9tool -M 'asm=/j.*/' -P print xterm
$ ./a.out
Wie oben, aber mit „Intel“-Syntax:
$ ./e9tool -M 'asm=/j.*/' -P print xterm --syntax=intel
$ ./a.out
Patchen Sie alle Sprunganweisungen mit einem Aufruf einer leeren Funktion:
$ ./e9compile.sh examples/nop.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@nop' xterm
$ ./a.out
Patchen Sie alle Sprunganweisungen mit der Anweisungsanzahl-Instrumentierung:
$ ./e9compile.sh examples/counter.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@counter' xterm
$ FREQ=10000 ./a.out
Patchen Sie alle Sprunganweisungen mit hübscher Druckinstrumentierung:
$ ./e9compile.sh examples/print.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry(addr,instr,size,asm)@print' xterm
$ ./a.out
Patchen Sie alle Sprunganweisungen mit „Verzögerungs“-Instrumentierung, um das Programm zu verlangsamen:
$ ./e9compile.sh examples/delay.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@delay' xterm
$ DELAY=100000 ./a.out
Hinweise :
XTerm(322)
Einige andere Projekte, die E9Patch verwenden, sind:
libc.so
E9Patch ist ein Low-Level-Tool, das in andere Projekte integrierbar ist. Weitere Informationen finden Sie in der folgenden Dokumentation:
Fehler können hier gemeldet werden:
Die aktuelle Version von E9Patch ist im Vergleich zum ursprünglichen Prototyp, der im PLDI'2020-Papier bewertet wurde, deutlich verbessert. Speziell:
-O2
an E9Tool.Diese Software wurde unter der GNU Public License (GPL) Version 3 veröffentlicht.
Einige bestimmte Dateien werden unter der MIT-Lizenz veröffentlicht (siehe Dateipräambel).
Diese Arbeit wurde teilweise vom National Satellite of Excellence in Trustworthy Software Systems unterstützt, finanziert von der National Research Foundation (NRF) Singapur im Rahmen des National Cybersecurity R&D (NCR)-Programms.