
патчинг двоичных файлов из Python
Применяет патчи к ELF-бинарному файлу с помощью одного или нескольких простых скриптов на Python.
Использование:
patch <binary> <patchdir|file> [patchdir|file...]
Содержит один или несколько файлов патчей на Python, которые будут выполнены в алфавитном порядке над бинарным файлом.
Замена адреса на NOP, инъекция ассемблерной функции и перехват точки входа:
def simple_patch(pt):
# заменить NOP'ами (5 байт) jump по адресу точки входа
pt.patch(pt.entry, hex='90' * 5)
# внедрить ассемблерный код в бинарник и получить адрес
addr = pt.inject(asm='mov eax, 1; ret')
# перехватить точку входа так, чтобы она вызывала addr (ret запустит оригинальную точку входа)
pt.hook(pt.entry, addr)
Замена C-функции:
def replace_free(pt):
# предположим, что free() находится по этому адресу:
old_free = 0x804fc4
# внедрить функцию для замены free()
new_free = pt.inject(c=r'''
void free_stub(void *addr) {
printf("stubbed free(%p)\n", addr);
}
''')
# пропатчить начало free() переходом на нашу новую функцию
pt.patch(old_free, jmp=new_free)
addr = search(data)
hook(addr, new_addr)
patch(addr, *compile arg*)
addr = inject(*compile arg*)
*compile arg* может быть любым из следующих:
raw='data'
hex='0bfe'
asm='nop'
jmp=0xaddr
c='void func() { int a; a = 1; }' (поддерживается только в inject, не в patch)
Некоторые скрипты находятся в папке ida/. Запускайте их так:
/Applications/IDA\ Pro\ 6.8/idaq.app/Contents/MacOS/idaq64 -A -Sida/allfuncs.py a.out
При таком запуске allfuncs.py создаст a.out.funcs, который используется скриптами усиления защиты.
Пока что они ориентированы на CGC и x86, но в будущем будут адаптированы для общего использования.
./deps.sh для автоматической установки.