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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:01:17