0%

LIEF注入和修改Android二进制文件

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 lief

lib_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 lief

libm = 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))

# Offset of the function 'hook' within the CODE segment
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 指令