LIEF 使用记录.
参考了以下文章:
LIEF 在 CTFpatch 常用 API
基于 LIEF 的 InlineHook 实现
[翻译] 可执行文件操作工具 ——LIEF 使用教程(一)
官方示例
注入代码
libmain.so 为待注入的 so,libhook.so 提供函数代码并注入到 libmain.so 里.
1 2 3 4 5 6 7 8 9 10 11 12 import lieflib_src = lief.parse("libmain.so" ) lib_code = lief.parse("libprintText.so" ) segment_added = lib_src.add(lib_code.segments[1 ]) code_printText = lib_code.get_symbol("printText" ) //要注入的函数名 lib_src.add_exported_function(segment_added.virtual_address + code_printText.value, "printText" ) lib_src.write("libinject.so" )
注入结果
可以发现,只需要修正 BL 指令的地址即可.
静态 Hook
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import lieflibm = lief.parse("libmain.so" ) hook = lief.parse("libprintText.so" ) main_symbol = libm.get_symbol("main" ) //待替换的函数 hook_symbol = hook.get_symbol("printText" ) //要注入的函数 code_segment = hook.segment_from_virtual_address(hook_symbol.value) segment_added = libm.add(code_segment) print ("Hook inserted at VA: 0x{:06x}" .format (segment_added.virtual_address))hook_offset = hook_symbol.value - code_segment.virtual_address new_addr = segment_added.virtual_address + hook_offset print (f"Change {main_symbol.name} !{main_symbol.value:x} -> {main_symbol.name} !{new_addr:x} " )main_symbol.value = new_addr libm.write("libhooked.so" )
Hook 结果
同样也需要修正 BL 指令