Lea los metadatos de archivos EXE, MSI y ZIP en Python en Linux

Estoy escribiendo una secuencia de comandos de Python para indexar un gran conjunto de instaladores de Windows en una base de datos.

Me gustaría saber cómo leer la información de metadatos (compañía, nombre del producto, versión, etc.) de los archivos EXE, MSI y ZIP que utilizan Python en Linux.

Software

Estoy usando Python 2.6.5 en Ubuntu 10.04 de 64 bits con Django 1.2.1.

Encontrado hasta ahora:

Utilidades de línea de comandos de Windows que pueden extraer metadatos EXE (como filever de SysUtils) u otras utilidades de CL individuales que solo funcionan en Windows. He intentado ejecutar estos a través de Wine, pero tienen problemas y no ha valido la pena el trabajo para encontrar las librerías y los marcos de los que dependen esos CL utils e intentar instalarlos en Wine / Crossover.

Módulos Win32 para Python que pueden hacer algunas cosas pero no se ejecutan en Linux (¿verdad?)

Pregunta secundaria:

Obviamente, cambiar los metadatos del archivo cambiaría el hashsum MD5 del archivo. ¿Existe un método general de hashear un archivo independiente de los metadatos además de ubicarlo y leerlo (por ejemplo, como saltarse los primeros 1024 byes)?


Este es mi primer post aquí en StackOverflow. Desde que empecé en mi último trabajo como nuevo desarrollador de Python, me impresionó mucho con Stackoverflow y siempre ha aparecido en la parte superior de las búsquedas de Google para mis consultas de Python / Django y tiene respuestas de alta calidad. Felicitaciones a esta comunidad.

Eche un vistazo a esta biblioteca: http://bitbucket.org/haypo/hachoir/wiki/Home y este progtwig de ejemplo que utiliza la biblioteca: http://pypi.python.org/pypi/hachoir-metadata/1.3.3 . El segundo enlace es un progtwig de ejemplo que utiliza la biblioteca de manipulación de archivos binarios Hachoir (primer enlace) para analizar los metadatos.

La biblioteca puede manejar estos formatos:

  • Archivos: bzip2, gzip, zip, tar
  • Audio: audio MPEG (“MP3”), WAV, audio Sun / NeXT, Ogg / Vorbis (OGG), MIDI, AIFF, AIFC, audio real (RA)
  • Imagen: BMP, CUR, EMF, ICO, GIF, JPEG, PCX, PNG, TGA, TIFF, WMF, XCF
  • Misc: Torrent
  • Progtwig: EXE
  • Video: Formato ASF (video WMV), AVI, Matroska (MKV), Quicktime (MOV), Ogg / Theora, Real media (RM)

Además, Hachoir puede realizar algunas operaciones de manipulación de archivos que supongo que incluye una manipulación de metadatos primitiva.

Los metadatos hachoir obtienen la “Versión del producto”, pero los comstackdores cambian la “Versión del archivo”. Entonces la versión devuelta no es la que necesitamos.

He encontrado una pequeña y una buena solución de trabajo:

http://pev.sourceforge.net/

Lo he probado con éxito. Es simple, rápido y estable.

Para responder a una de sus preguntas, puede usar el módulo zipfile , específicamente el objeto ZipInfo para obtener los metadatos de los archivos zip.

En cuanto al hash solo los datos del archivo, solo puede hacerlo si sabe qué partes son datos y cuáles son metadatos. No puede haber un método general ya que muchos formatos de archivo almacenan sus metadatos de manera diferente.

Para responder a su segunda pregunta: no, no hay forma de codificar un archivo PE o archivo ZIP, ignorando los metadatos, sin localizar y leer los metadatos. Esto se debe a que los metadatos en los que está interesado se almacenan en ubicaciones variables en el archivo.

En el caso de los archivos PE (EXE, DLL, etc.), se almacena en un bloque de recursos, generalmente hacia el final del archivo, y una serie de punteros y tablas al inicio del archivo proporciona la ubicación.

En el caso de los archivos ZIP, están dispersos por todo el archivo: cada archivo incluido está precedido por sus propios metadatos, y luego hay una tabla al final que da las ubicaciones de cada bloque de metadatos. Pero suena como si realmente estuvieras queriendo leer los archivos dentro del archivo ZIP y buscar EXEs si buscas metadatos del progtwig; El archivo ZIP en sí no almacena nombres de compañías o números de versión.