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

如何使用Python从ELF文件中提取汇编代码?有可用库及示例代码吗?

ELF文件汇编提取与指令检索Python实现方案

Python标准库没有预置直接实现类objdump功能的模块,可通过两个第三方库组合完成需求:

  • pyelftools:用于解析ELF文件结构,可提取代码段、节表、符号表等核心元数据
  • capstone:多架构反汇编框架,支持x86、ARM、MIPS等主流CPU架构,可将二进制机器码转换为可读汇编指令

环境安装

执行以下命令安装依赖:
pip install pyelftools capstone

示例代码

以下代码实现了从ELF文件中提取汇编指令、检索特定指令集合的功能:

from elftools.elf.elffile import ELFFile
from capstone import *

def extract_asm_from_elf(elf_path, target_instructions=None):
    # 未指定目标指令时默认检索ret、nop指令
    if target_instructions is None:
        target_instructions = {"ret", "nop"}
    
    with open(elf_path, 'rb') as f:
        elffile = ELFFile(f)
        # 定位ELF的代码段(.text节)
        text_section = elffile.get_section_by_name('.text')
        if not text_section:
            print("ELF文件中未找到代码段")
            return []
        
        # 获取代码段二进制数据与内存加载基地址
        code_data = text_section.data()
        base_address = text_section['sh_addr']

        # 初始化反汇编器,默认适配x86_64架构
        # 32位x86架构替换为Cs(CS_ARCH_X86, CS_MODE_32)
        # ARM架构替换为Cs(CS_ARCH_ARM, CS_MODE_ARM)
        disassembler = Cs(CS_ARCH_X86, CS_MODE_64)
        disassembler.detail = True

        matched_instructions = []
        # 遍历反汇编得到的所有指令
        for insn in disassembler.disasm(code_data, base_address):
            full_insn = f"{insn.mnemonic} {insn.op_str}".strip()
            # 若需要打印所有汇编指令,取消下一行注释即可
            # print(f"0x{insn.address:x}:\t{full_insn}")
            # 匹配目标指令集合
            if insn.mnemonic in target_instructions:
                matched_instructions.append((hex(insn.address), full_insn))
    
    return matched_instructions

if __name__ == "__main__":
    # 替换为你的ELF文件路径
    input_elf = "./test.elf"
    # 自定义需要检索的指令集合
    target_insn_set = {"push", "pop", "ret", "syscall"}
    result = extract_asm_from_elf(input_elf, target_insn_set)
    print(f"共匹配到目标指令{len(result)}条:")
    for addr, insn in result:
        print(f"{addr}\t{insn}")

注意事项

  • 处理不同架构的ELF文件时,只需要调整反汇编器初始化时的架构、模式参数即可。
  • 若需要解析动态链接库、带调试信息的ELF,可通过pyelftools的对应接口提取其他节的内容进行反汇编。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:45:03