Анализ двоичных файлов MIPS: существует ли библиотека Python для анализа двоичных данных?

Я работаю над утилитой, которая должна преобразовать шестнадцатеричные адреса в символическое имя функции и номер строки исходного кода в двоичном файле. Утилита будет работать в Linux на x86, хотя бинарные файлы, которые она анализирует, будут предназначены для встраиваемой системы на основе MIPS. Двоичные файлы MIPS представлены в формате ELF с использованием DWARF для символической отладочной информации.

В настоящее время я планирую разветвить objdump, передав список шестнадцатеричных адресов и проанализировав вывод, чтобы получить имена функций и номера строк исходного кода. Я скомпилировал objdump с поддержкой двоичных файлов MIPS, и он работает.

Я бы предпочел иметь пакет, позволяющий мне искать что-то в исходном коде Python, не разветвляя другой процесс. Я не могу найти ни одного упоминания о libdwarf, libelf или libbfd на python.org, ни упоминания о python на dwarfstd.org.

Есть ли где-нибудь подходящий модуль?


person DGentry    schedule 05.09.2008    source источник


Ответы (6)


Пожалуйста, проверьте pyelftools — новую чистую библиотеку Python, предназначенную для этого.

person Eli Bendersky    schedule 06.01.2012

Возможно, вас заинтересует библиотека DWARF из pydevtools:

>>> from bintools.dwarf import DWARF
>>> dwarf = DWARF('test/test')
>>> dwarf.get_loc_by_addr(0x8048475)
('/home/emilmont/Workspace/dbg/test/main.c', 36, 0)
person emilmont    schedule 05.09.2010

Вы должны попробовать Construct. Очень полезно анализировать двоичные данные в объекты Python.

Существует даже пример для формата файла ELF32. .

person Ber    schedule 04.02.2009
comment
Я ищу что-то подобное и проверил Construct. То, что есть, неплохо, но проект давно не обновлялся. - person ctuffli; 06.05.2009
comment
Только что взглянул на Construct, и он кажется действительно потрясающим. Очень впечатлен. - person Craig McQueen; 09.07.2009

Я не знаю ни одного, но если ничего не помогает, вы можете использовать ctypes для прямого использования libdwarf, libelf или libbfd.

person Douglas Leeder    schedule 05.09.2008

Я разрабатывал парсер DWARF, используя Construct. В настоящее время довольно грубо, и синтаксический анализ идет медленно. Но я подумал, что должен хотя бы дать тебе знать. Это может удовлетворить ваши потребности, с небольшим количеством работы.

У меня есть код в Mercurial, размещенный на битбакете:

Construct — очень интересная библиотека. DWARF — это сложный формат (как я обнаружил) и, я думаю, доводит Construct до предела.

person Craig McQueen    schedule 30.08.2009
comment
Привет, Крейг, у тебя есть примеры использования парсера DWARF? Я просмотрел ваш репозиторий, но ничего не нашел. Как я мог сделать что-то вроде примера dwarf.get_loc_by_addr() Эмильмонта? - person Nick Toumpelis; 21.12.2011
comment
@NickToumpelis, какое-то время я больше над этим не работал, но сейчас я просто возвращаюсь к этому, так как это может быть полезно в моей работе. Я не совсем доволен решением на основе Construct, потому что оно медленно выполняет синтаксический анализ. Итак, в настоящее время нет высокоуровневого API, как вы просили. Это доходит до разбора информации о DWARF в дереве. Следующей задачей будет поиск в дереве информации, которую вы ищете. Формат DWARF настолько выразителен, что я не уверен, что это был бы хороший простой API для доступа к данным. - person Craig McQueen; 28.12.2011
comment
Крейг: pyelftools (bitbucket.org/eliben/pyelftools) создан на основе construct и использует его для низкоуровневый API, но с добавлением полнофункционального высокоуровневого API поверх - person Eli Bendersky; 06.01.2012

hachior — еще одна библиотека для анализа двоичных данных.

person Brian    schedule 11.06.2010