E9Patch — это мощный статический инструмент перезаписи двоичных файлов для двоичных файлов ELF Linux x86_64
. E9Patch — это:
Статическая перезапись двоичных файлов берет входной двоичный файл (исполняемый файл ELF или общий объект) и генерирует выходной двоичный файл с примененными к нему некоторыми исправлениями/модификациями. Исправленный двоичный файл можно использовать в качестве замены оригинала.
Более подробную информацию можно найти в нашем документе PLDI'2020:
Готовые двоичные файлы E9Patch можно скачать здесь:
Собрать E9Patch очень просто: просто запустите скрипт build.sh
.
Это автоматически создаст два инструмента:
e9patch
: серверная часть перезаписи двоичных файлов; иe9tool
: интерфейс линейной дизассемблирования для E9Patch. E9Patch можно использовать через интерфейс E9Tool.
Например, чтобы добавить инструменты печати инструкций ко всем инструкциям xor
в xterm
, мы можем использовать следующую команду:
$ ./e9tool -M 'asm=/xor.*/' -P print xterm
Это создаст модифицированную версию xterm
, записанную в файл a.out
.
Модифицированный xterm
можно запустить как обычно, но он выведет ассемблерную строку каждой выполненной инструкции xor
в stderr
:
$ ./a.out
xorl %ebp, %ebp
xorl %ebx, %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %edi, %edi
...
Полный список поддерживаемых опций и режимов см.:
$ ./e9tool --help
Исправьте все инструкции перехода с «пустыми» инструментами:
$ ./e9tool -M 'asm=/j.*/' -P empty xterm
$ ./a.out
Распечатайте все инструкции по прыжкам с помощью инструментов «печати»:
$ ./e9tool -M 'asm=/j.*/' -P print xterm
$ ./a.out
То же, что и выше, но используйте синтаксис Intel:
$ ./e9tool -M 'asm=/j.*/' -P print xterm --syntax=intel
$ ./a.out
Исправьте все инструкции перехода вызовом пустой функции:
$ ./e9compile.sh examples/nop.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@nop' xterm
$ ./a.out
Исправьте все инструкции перехода с помощью инструментов подсчета инструкций:
$ ./e9compile.sh examples/counter.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@counter' xterm
$ FREQ=10000 ./a.out
Исправьте все инструкции по переходу красивыми печатными инструментами:
$ ./e9compile.sh examples/print.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry(addr,instr,size,asm)@print' xterm
$ ./a.out
Исправьте все инструкции перехода с помощью инструментов «задержки», чтобы замедлить работу программы:
$ ./e9compile.sh examples/delay.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@delay' xterm
$ DELAY=100000 ./a.out
Примечания :
XTerm(322)
Некоторые другие проекты, использующие E9Patch, включают:
libc.so
E9Patch — это инструмент низкого уровня, предназначенный для интеграции в другие проекты. Чтобы узнать больше, ознакомьтесь со следующей документацией:
Сообщить об ошибках можно здесь:
Текущая версия E9Patch значительно улучшена по сравнению с исходным прототипом, описанным в документе PLDI'2020. Конкретно:
-O2
в E9Tool.Это программное обеспечение выпущено под лицензией GNU Public License (GPL) версии 3.
Некоторые конкретные файлы выпускаются под лицензией MIT (проверьте преамбулу файла).
Эта работа частично поддерживалась Национальным спутником передового опыта в области надежных программных систем, финансируемым Национальным исследовательским фондом (NRF) Сингапура в рамках Национальной программы исследований и разработок в области кибербезопасности (NCR).