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

Angr脚本开发求助:如何按单指令输出反汇编与操作码字节

解决Angr脚本逐行输出指令反汇编与对应Opcode字节的问题

问题分析

你当前的脚本是按代码块(Block)整体输出反汇编和字节,导致两个问题:行首带地址、Opcode字节是整块输出而非单指令对应。核心原因是没有遍历到单条指令层级,而是直接处理块级数据。

解决方案

利用Angr中Block对象的Capstone接口,直接访问每条指令的详细信息(助记符、操作数、原始字节),实现逐行精准输出。

修改后的脚本

import sys
import angr

base_addr = 0x100000
# 初始化项目,关闭自动加载库并设置基地址
p = angr.Project(sys.argv[1], auto_load_libs=False, load_options={'main_opts': {'base_addr': base_addr}})
# 生成快速控制流图
cfg = p.analyses.CFGFast()
cfg.normalize()

# 用with语句自动管理文件,避免遗漏关闭
with open(sys.argv[2], 'w') as output_file:
    # 遍历所有函数节点
    for func_node in cfg.functions.values():
        # 遍历函数内的每个代码块
        for block in func_node.blocks:
            # 遍历块内的每条Capstone指令实例
            for insn in block.capstone.insns:
                # 拼接完整的反汇编指令(助记符+操作数)
                disasm_content = f"{insn.mnemonic} {insn.op_str}".strip()
                # 获取当前指令的十六进制字节串
                opcode_hex = insn.bytes.hex()
                # 按要求格式写入文件
                output_file.write(f"{disasm_content}\t{opcode_hex}\n")

代码说明

  • block.capstone.insns:返回当前代码块内所有指令的Capstone实例,每个实例包含单条指令的完整元数据
    • insn.mnemonic:指令的助记符(如sub、mov)
    • insn.op_str:指令的操作数部分(如rsp, 8)
    • insn.bytes:指令对应的原始二进制字节序列,通过.hex()转为十六进制字符串
  • 输出格式严格匹配需求:每条指令的反汇编内容与对应Opcode字节用制表符分隔,无多余地址前缀

示例输出

endbr64	f30f1efa
sub rsp, 8	4883ec08
mov rax, qword ptr [rip + 0x2fd9]	488b05d92f0000
test rax, rax	4885c0
je 0x101016	7402

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:05:31