Вы должны быть осторожны в отношении кода, поскольку база раздела кода может не содержать только код (в этом месте могут находиться данные импорта или чтения).
Лучший способ начать разборку - посмотреть в поле AddressOfEntryPoint
в поле IMAGE_OPTIONAL_HEADER
, которое указывает первый выполненный байт в PE-файле (кроме случаев, когда TLS присутствует, но это другой вопрос).
Очень хорошая библиотека для просмотра файлов PE в python - pefile.
Вот пример, чтобы получить первые 10 байт в точке входа в программу:
#!/usr/local/bin/python2
# -*- coding: utf8 -*-
from __future__ import print_function
import sys
import os.path
import pefile
def find_entry_point_section(pe, eop_rva):
for section in pe.sections:
if section.contains_rva(eop_rva):
return section
return None
def main(file_path):
print("Opening {}".format(file_path))
try:
pe = pefile.PE(file_path, fast_load=True)
# AddressOfEntryPoint if guaranteed to be the first byte executed.
eop = pe.OPTIONAL_HEADER.AddressOfEntryPoint
code_section = find_entry_point_section(pe, eop)
if not code_section:
return
print("[+] Code section found at offset: "
"{:#x} [size: {:#x}]".format(code_section.PointerToRawData,
code_section.SizeOfRawData))
# get first 10 bytes at entry point and dump them
code_at_oep = code_section.get_data(eop, 10)
print("[*] Code at EOP:\n{}".
format(" ".join("{:02x}".format(ord(c)) for c in code_at_oep)))
except pefile.PEFormatError as pe_err:
print("[-] error while parsing file {}:\n\t{}".format(file_path,
pe_err))
if __name__ == '__main__':
if len(sys.argv) < 2:
print("[*] {} <PE_Filename>".format(sys.argv[0]))
else:
file_path = sys.argv[1]
if os.path.isfile(file_path):
main(file_path)
else:
print("[-] {} is not a file".format(file_path))
Просто передать имя файла PE в качестве первого аргумента.
В приведенном выше коде переменная code_at_oep
содержит первые несколько байтов точки входа. Оттуда вы можете передать эти байты в двигатель capstone.
Обратите внимание, что эти первые байты могут быть просто инструкцией jmp
или call
, поэтому вам нужно будет выполнить выполнение кода, чтобы правильно разобрать. Разборка правильно программа по-прежнему остается открытой проблемой в информатике ...
Спасибо. Вы ответили на вопрос, который я должен был задать в конце вашего ответа. Я работаю с файлами PE, и вы ясно дали понять, что я ищу, это свалка раздела .text. Но, для жизни меня, я не могу найти раздел .text среди всей информации, которую выводит библиотека pefile. –
@AsaHunt Извините, я не очень хорошо знаком с pefile. Я собираюсь изменить ваш вопрос, чтобы попытаться привлечь еще более подходящих людей. –