You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angr将REP指令视为基本块结尾的处理方案咨询

关于Angr中REP指令导致基本块拆分的问题

问题描述

我正在开发一款基于Angr的Python脚本,用于查找二进制文件中每个函数的所有基本块。发现Angr在遇到REP指令时会拆分基本块,想了解是否可通过API设置避免该拆分,还是需要手动处理。

代码片段

import sys
import angr

p = angr.Project(sys.argv[1], auto_load_libs=False, main_opts={'base_addr': 0} )
cfg = p.analyses.CFGFast()
cfg.normalize()

for func_node in cfg.functions.values():
    for block in func_node.blocks:
        c = block.capstone
        for i in c.insns:
            # 自定义操作逻辑
            pass

另有以REP指令结尾的基本块示例截图。

解决方案

  • 尝试CFGFast参数调整
    初始化CFGFast时,添加force_complete_scan=True参数,强制进行完整扫描,可能避免REP指令触发的不必要拆分:

    cfg = p.analyses.CFGFast(force_complete_scan=True)
    

    同时可以先移除cfg.normalize()调用,因为normalize操作可能会重新调整基本块结构,导致拆分。

  • 手动合并相关基本块
    如果参数调整无效,就需要手动处理:

    1. 遍历所有基本块,筛选出以REP前缀指令(如REP MOVSB、REP STOSB)结尾的块。
    2. 检查该块的结束地址是否等于下一个块的起始地址,确认两者是连续的逻辑块。
    3. 在业务逻辑中,将这两个块视为同一个基本块进行处理,或者直接合并它们的指令序列。
  • 底层VEX选项调整
    若需要更深度的控制,可以在创建Project时通过arch_options调整VEX的转换规则,比如设置与指令拆分相关的选项。不过这种方式需要对VEX中间表示有一定了解,适合有底层需求的场景。

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:43:30