【问题标题】:Which bytes should i pass to Capstone to disassemble the executable code of a PE file我应该将哪些字节传递给 Capstone 以反汇编 PE 文件的可执行代码
【发布时间】:2016-05-25 14:07:00
【问题描述】:

我正在尝试使用 pefile 和 capstone 使用 python 反汇编 PE 可执行文件,以便稍后从该代码中获取 CFG。我的想法是获取包含可执行代码的 PE 文件部分并将所有这些字节传递给顶点。我不知道究竟应该将哪个部分传递给顶点,因此不会反汇编超过必要的代码,并且可以在构造 CFG 时解析 RVA(即 jo 0x10df9 和地址 0x10df9 在反汇编指令列表中) .我试过了

    md.disasm(pe.get_memory_mapped_image(), pe.OPTIONAL_HEADER.AddressOfEntryPoint)

但我担心它会从入口点反汇编到 PE 的末尾,我只想反汇编可执行代码。我一直在阅读有关 PE 格式的内容,并且更有可能代码将始终位于 .text 部分。我也在考虑把那部分放在:

    code_section = pe.get_section_by_rva(pe.OPTIONAL_HEADER.AddressOfEntryPoint)

然后将那个部分的数据从 EntryPoint 中的字节开始传递给顶点,我认为这可以将数据从起始点分隔到该部分的末尾。

    md.disasm(code_section.get_data(pe.OPTIONAL_HEADER.AddressOfEntryPoint))

但在本节的末尾可能是不应该反汇编的代码(我认为,不确定)。所以我要问的是我应该将哪些字节传递给 Capstone 来反汇编 PE 文件的可执行代码。

【问题讨论】:

    标签: python portable-executable disassembly capstone


    【解决方案1】:

    您不需要将参数传递给 get_data。

    这应该可以正常工作

    import pefile
    from capstone import *
    
    def disassemble(file_path):
        pe = pefile.PE(file_path)
    
        eop = pe.OPTIONAL_HEADER.AddressOfEntryPoint
        code_section = pe.get_section_by_rva(eop)
    
        code_dump = code_section.get_data()
    
        code_addr = pe.OPTIONAL_HEADER.ImageBase + code_section.VirtualAddress
    
        md = Cs(CS_ARCH_X86, CS_MODE_64)
    
        for i in md.disasm(code_dump, code_addr):
            print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
    
    disassemble("/path/to/pe/file")
    

    【讨论】:

    • 非常感谢您的回答。你能给我提供 C++ 的例子吗?提前致谢。
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 2013-03-05
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多