Какие байты я должен передать в Capstone, чтобы разобрать исполняемый код PE-файла

Я пытаюсь разобрать исполняемый файл PE с python, используя pefile и capstone, чтобы позже получить CFG из этого кода. Моя идея - взять часть PE-файла, содержащего исполняемый код, и передать все эти байты в capstone. Что я не знаю, так это то, какую именно часть я должен передать capstone, поэтому не разбирается больше кода, чем необходимо, и RVA могут быть разрешены при построении CFG (то есть 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)

а затем передать в capstone данные этого раздела, начиная с байтов в EntryPoint, которые, я думаю, могут разграничить данные от начальной точки до конца этого раздела.

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

Но в конце раздела может быть код, который не нужно разбирать (думаю, не уверен). Итак, я спрашиваю, какие байты я должен передать Capstone, чтобы разобрать исполняемый код PE-файла.

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")
Другие вопросы по тегам