2008-09-05 22 views
10

Estoy trabajando en una utilidad que necesita para resolver direcciones hexadecimales a un nombre de función simbólica y número de línea de código fuente dentro de un binario. La utilidad se ejecutará en Linux en x86, aunque los binarios que analiza serán para un sistema integrado basado en MIPS. Los binarios de MIPS están en formato ELF, utilizando DWARF para la información de depuración simbólica.Analizando binarios MIPS: ¿hay una biblioteca Python para analizar datos binarios?

Actualmente tengo la intención de desembolsar objdump, pasando de una lista de direcciones hexagonales y analizando la salida para obtener los nombres de funciones y números de línea fuente. He compilado un objdump con soporte para binarios MIPS, y está funcionando.

preferiría tener un paquete que me permite mirar las cosas de forma nativa a partir del código Python sin que se bifurcan otro proceso. No puedo encontrar ninguna mención de libdwarf, libelf o libbfd en python.org, ni ninguna mención de python en dwarfstd.org.

¿Hay un módulo adecuado disponible en alguna parte?

Respuesta

4

favor verifique pyelftools - una nueva biblioteca de Python pura intención de hacerlo.

3

No conozco ninguno, pero si todo lo demás falla, puede usar ctypes para usar libdwarf, libelf o libbfd directamente.

4

Debe dar Construct intentarlo. Es muy útil analizar datos binarios en objetos Python.

incluso hay un ejemplo para el formato de archivo ELF32.

+0

Estoy buscando algo similar y comprobé Construct. Lo que hay allí es bastante bueno, pero el proyecto no se ha actualizado en bastante tiempo. – ctuffli

+0

Acabo de echar un vistazo a Construct, y parece realmente genial. Muy impresionado. –

3

he estado desarrollando un programa de análisis ENANO usando Construct. Actualmente es bastante difícil, y el análisis es lento. Pero pensé que debería al menos hacerte saber. Puede adaptarse a sus necesidades, con un poco de trabajo.

Tengo el código en Mercurial, alojado en bitbucket:

Construct es una biblioteca muy interesante. DWARF es un formato complejo (como estoy descubriendo) y creo que Construye hasta sus límites.

+0

Hola Craig, ¿tienes algún ejemplo de cómo usar tu analizador DWARF? He consultado su repositorio pero no he podido encontrar ninguno. ¿Cómo podría hacer algo como el ejemplo dwarf.get_loc_by_addr() de emilmont? –

+0

@NickToumpelis, no he trabajado más en esto por un tiempo, pero ahora estoy volviendo, ya que podría ser útil en mi trabajo. No estoy del todo contento con la solución basada en constructo, porque es lento para hacer el análisis sintáctico. Por lo tanto, actualmente no hay API de alto nivel como usted solicitó. Se llega a analizar la información DWARF en un árbol. La siguiente tarea sería buscar en el árbol la información que estás buscando.El formato DWARF es tan expresivo que no estoy seguro de cuál sería una buena API simple para acceder a los datos. –

+1

Craig: pyelftools (https://bitbucket.org/eliben/pyelftools) está construido sobre 'construct', usándolo para la API de bajo nivel, pero agregando una API de alto nivel completa en la parte superior –

2

hachior es otra biblioteca para analizar los datos binarios

8

Usted puede estar interesado en el enano de la biblioteca de 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)