2008-09-05 19 views
10

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

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

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

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

ответ

4

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

3

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

4

Попробуйте сделать Construct. Очень полезно разбирать двоичные данные в объекты python.

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

+0

Я ищу что-то подобное и проверил Construct. Что там довольно хорошо, но проект не обновлялся довольно долго. – ctuffli 2009-05-05 23:49:04

+0

Просто взглянул на Construct, и это кажется действительно потрясающим. Очень впечатлен. – 2009-07-09 04:28:01

3

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

Я получил код в Mercurial, размещенный на BitBucket:

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

2

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

8

Вы могли бы быть заинтересованы в 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)