Какие байты я должен передать в 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")