使用一个或多个简单 Python 脚本对 ELF 二进制文件进行补丁。
使用方法:
patch <二进制文件> <补丁目录|文件> [补丁目录|文件...]
包含一个或多个 Python 补丁文件,这些文件将按字母顺序对二进制文件执行。
对地址进行 NOP 填充、注入汇编函数以及挂钩入口点:
def simple_patch(pt):
# 在入口点处 NOP 填充一个跳转指令
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, *编译参数*)
addr = inject(*编译参数*)
*编译参数* 可以是以下任意一种:
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 可自动安装这些依赖。