2015-04-20 6 views
1

Итак, я пытаюсь написать базовый дизассемблер для школьного проекта с использованием Python. Я использую библиотеки pydasm и capstone. Я не понимаю, как я могу получить доступ к инструкциям по сборке программы с помощью Python. Эти библиотеки позволяют мне разбирать инструкции, но я не могу понять, как получить доступ к инструкциям программы в Python. Может ли кто-нибудь дать мне какое-то направление?Как я могу получить инструкции PE-файла с помощью Python?

Спасибо.

ответ

1

Это зависит от того, какую ОС вы используете. У вас есть другие вопросы о Linux, поэтому я предполагаю, что вы это используете. В Linux исполняемые файлы, как правило, находятся в формате ELF, поэтому вам понадобится python library to read that, либо использовать другой инструмент для извлечения части файла ELF, который вы хотите.

Фактические инструкции хранятся в разделе .text, поэтому, если вы извлекаете содержимое этого раздела, это должны быть необработанные байты, которые вы хотите разобрать.

+0

Спасибо. Вы ответили на вопрос, который я должен был задать в конце вашего ответа. Я работаю с файлами PE, и вы ясно дали понять, что я ищу, это свалка раздела .text. Но, для жизни меня, я не могу найти раздел .text среди всей информации, которую выводит библиотека pefile. –

+0

@AsaHunt Извините, я не очень хорошо знаком с pefile. Я собираюсь изменить ваш вопрос, чтобы попытаться привлечь еще более подходящих людей. –

1

Вы должны быть осторожны в отношении кода, поскольку база раздела кода может не содержать только код (в этом месте могут находиться данные импорта или чтения).

Лучший способ начать разборку - посмотреть в поле 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, поэтому вам нужно будет выполнить выполнение кода, чтобы правильно разобрать. Разборка правильно программа по-прежнему остается открытой проблемой в информатике ...

 Смежные вопросы

  • Нет связанных вопросов^_^