用途:使用 Unicorn 引擎调试和仿真特定代码片段或函数,适合只想模拟目标函数而非整个二进制的逆向场景。
主要能力:优先以原始字节加载文件并直接映射进 Unicorn 内存,不解析 ELF/PE/Mach-O 头;仅在原始加载失败时最小化解析所需段。分析目标代码的外部调用(JNI、syscalls、libc、导入函数)并通过 hook 提供模拟响应。大量使用回调进行调试、追踪、错误恢复与环境模拟。
环境模拟:按地址 hook 外部依赖并在 Python 中模拟,如 libc(malloc、free、memcpy、strlen、printf)、JNI(GetStringUTFChars、FindClass、GetMethodID,可构建伪 JNIEnv 函数表并写入 RET 桩)、系统调用(hook UC_HOOK_INTR 按号分发)、C++ 运行时(operator new、__cxa_throw)及库调用(pthread_mutex_lock、dlopen)。常用模式为注册 UC_HOOK_CODE,PC 命中已知导入地址时执行 Python 模拟并将 PC 设为 LR 跳过原函数。
回调类型:UC_HOOK_CODE 拦截导入调用与窄范围指令级追踪;UC_HOOK_BLOCK 块级追踪(优先);UC_HOOK_MEM_UNMAPPED 自动映射缺失页;UC_HOOK_MEM_READ/WRITE 追踪指定数据范围;UC_HOOK_INTR 拦截 SVC/INT 模拟系统调用。
迭代调试流程:运行至崩溃,读取回调输出定位出错地址与类型,诊断(缺代码页则映射、缺数据段或未初始化指针则映射或 hook、命中导入桩则加模拟 hook、死循环则加计数 hook 超阈值停止),修复后重跑直至目标函数完成。
架构参考:ARM64(UC_ARCH_ARM64,SP/X30/X0-X7/X0,X8+SVC #0)、ARM32(UC_ARCH_ARM,SP/LR/R0-R3/R0,R7+SVC #0)、x86-64(UC_ARCH_X86,RSP/栈/RDI,RSI,RDX,RCX,R8,R9/RAX,RAX+syscall)、x86-32(ESP/栈/EAX,EAX+int 0x80)、MIPS32(UC_ARCH_MIPS,$sp/$ra/$a0-$a3/$v0,$v0+syscall)。
限制:追踪输出应保持精简,优先块级而非指令级,仅在小范围启用指令追踪;具体安装命令与版本要求资料未提供。