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
相关产品推荐
相关产品推荐

