用途:反混淆 ARM64 二进制中被转换为间接跳转的条件分支,恢复可读控制流。
主要能力:识别 CSEL+BR 模式(CSEL 在两个目标地址间选择,中间为垃圾指令,BR 间接跳转)与 CSET+BR 跳表变体(CSET 产生 0/1 索引查表计算目标,CSET 与 BR 之间含后续基本块依赖的有用指令)。用符号执行强制 CSEL/CSET 取不同分支,得到两个 BR 目标地址;从函数入口做 BFS 遍历,记录补丁点,用 visited 集合防重复,RET 块不再继续。
使用方式:提供两个脚本,script/deinbr-v3-csel.py 处理 CSEL 变体(ELF),在 CSEL 处打 8 字节补丁(Bcond + B);script/deinbr-v3-cset.py 处理 CSET 变体(Mach-O/ELF),先定位 ADD Xn, Xn, Wm, SXTW 边界,把 ADD 与 BR 之间的有用代码上移到 CSET 位置,再追加 Bcond + B。核心函数为 analyze_br、run_until_br、do_patch,补丁用 keystone 汇编写回二进制。关键 angr 选项:CALLLESS、LAZY_SOLVES、ZERO_FILL_UNCONSTRAINED_MEMORY、ZERO_FILL_UNCONSTRAINED_REGISTERS。非平凡 Python 代码须写入文件后用 python script.py 执行,不要用 python -c 内联。
适用场景:分析被间接分支混淆的 ARM64 ELF/Mach-O 二进制,恢复控制流。
限制:必须从函数入口地址开始,否则跳表基址与偏移未初始化会导致 BR 目标无效或两个目标相同;被移动的有用代码须位置无关(SP 相对、立即数或同页 ADRP);脚本需同时处理 csel 与 cset。资料未提供安装命令、依赖版本、收费与效果数据。