版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
在 Unicorn 中,Hook(钩子)用于在模拟过程中拦截 CPU 指令执行、内存访问等操作,以便分析和修改执行行为。
Hook 主要类型
Unicorn 提供了多种 Hook 类型,每种类型用于不同场景:
Hook 类型 | 说明 | 示例 |
---|---|---|
UC_HOOK_CODE | 拦截每一条指令执行 | 监控指令流,反调试 |
UC_HOOK_BLOCK | 拦截每个基本块执行 | 统计基本块执行次数 |
UC_HOOK_INTR | 拦截中断指令(如 svc #0) | 监控系统调用 |
UC_HOOK_MEM_READ | 读取内存前触发 | 监视变量读取 |
UC_HOOK_MEM_WRITE | 写入内存前触发 | 监视变量修改 |
UC_HOOK_MEM_FETCH | 取指令前触发 | 捕获未映射代码执行 |
UC_HOOK_MEM_READ_UNMAPPED | 读取未映射内存 | 捕获非法内存读取 |
UC_HOOK_MEM_WRITE_UNMAPPED | 写入未映射内存 | 捕获非法内存写入 |
UC_HOOK_MEM_FETCH_UNMAPPED | 取指未映射内存 | 捕获非法指令执行 |
UC_HOOK_INSN | 拦截特定指令 | 监控 syscall、hlt 等 |
Hook 指令执行 (UC_HOOK_CODE)
用途:
-
监控所有执行的指令
-
记录寄存器变化
-
反调试
示例代码
from unicorn import *
from unicorn.arm64_const import *
# Hook 回调函数
def hook_code(mu, address, size, user_data):
print(f"Executing instruction at 0x{address:X}, size={size}")
# 初始化 Unicorn ARM64
mu = Uc(UC_ARCH_ARM64, UC_MODE_ARM)
# 分配内存
BASE = 0x1000
mu.mem_map(BASE, 0x1000)
# 写入简单的 ARM64 指令
code = b"\x20\x00\x80\xd2" # MOV X0, #1
mu.mem_write(BASE, code)
# 注册 Hook
mu.hook_add(UC_HOOK_CODE, hook_code)
# 设置 PC 并执行
mu.reg_write(UC_ARM64_REG_PC, BASE)
mu.emu_start(BASE, BASE + len(code))
输出如下:
Executing instruction at 0x1000, size=4