如何在IDA Pro 7.7sp1 Python脚本中将反汇编指令转为Opcode字节?
解决方案
要将反汇编指令转换为Opcode字节,核心是先获取每条指令的字节长度,再读取对应地址的字节数据。你之前使用idc.get_bytes无效,大概率是因为没有传入正确的指令长度参数。
以下是修改后的脚本,新增了Opcode字节的提取与输出逻辑:
import sys import idc import idautils f = open(idc.ARGV[1], 'w') if len(idc.ARGV) > 1 else sys.stdout log = f.write # log current file path log(idc.get_input_file_path() + '\n') # wait for auto-analysis to complete idc.auto_wait() # count functions log( 'count %d\n' % len(list(idautils.Functions())) ) for func in idautils.Functions(): flags = idc.get_func_attr(func, FUNCATTR_FLAGS) if flags & FUNC_LIB or flags & FUNC_THUNK: continue dism_addr = list(idautils.FuncItems(func)) for line in dism_addr: # 获取指令的字节长度 insn_size = idc.get_item_size(line) # 读取指令对应的Opcode字节 opcode_bytes = idc.get_bytes(line, insn_size) # 将字节转换为十六进制字符串(空格分隔) opcode_hex = ' '.join(f'{byte:02X}' for byte in opcode_bytes) # 获取反汇编指令 disass = idc.generate_disasm_line(line, 0) # 输出地址、Opcode、反汇编内容 log(f"0x{line:08X}: {opcode_hex} | {disass}\n") # if logging to a file, close it and exit IDA Pro if f != sys.stdout: f.close() idc.qexit(0)
关键说明
idc.get_item_size(line):获取指定地址处指令的字节长度,确保get_bytes能读取完整的指令字节。idc.get_bytes(line, insn_size):读取从line地址开始、长度为insn_size的字节数据,返回bytes类型对象。- 用列表推导式将每个字节格式化为两位十六进制字符串,并用空格分隔,方便阅读。
你可以直接替换原脚本中的对应逻辑,在批处理模式下运行即可得到每条指令的Opcode字节与反汇编内容的对应输出。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

