Pregunta

Datos a menudo se almacena en archivos binarios específicos del programa para los cuales hay poca o ninguna documentación. Un ejemplo típico en nuestro campo son los datos que provienen de un instrumento, pero sospecho que el problema es general. ¿Qué métodos existen para tratar de comprender e interpretar los datos?

Para establecer algunos límites. Los archivos no están encriptados y no hay DRM. El tipo y el formato del archivo es específico para el escritor del programa (es decir, no es un "archivo estándar", como * .tar, cuya identidad se ha perdido). No hay (probablemente) ofuscación deliberada, pero puede haber algunos esfuerzos de aficionados para ahorrar espacio. Podemos suponer que tenemos un conocimiento general de lo que son los datos y podemos reconocer algunos, pero probablemente no todos, de los campos y matrices.

Suponga que la mayoría de los datos son numéricos, con escalares y matrices (probablemente de 1 y 2 dimensiones y, a veces, irregulares o triangulares). También habrá algunas cadenas de caracteres, probablemente nombres de personas, sitios, fechas y quizás algunas palabras clave. Habrá código en el programa que lee el archivo binario, pero no tenemos acceso a la fuente o al ensamblador. Como ejemplo, puede haber sido escrito por un programa VAX Fortran o algún Unix temprano o por Windows como objetos OLE. Los números pueden ser big-o little-endian (que no se conoce al principio) pero probablemente sea consistente. Nosotros puede tener diferentes versiones en diferentes máquinas (por ejemplo, Cray).

Podemos suponer que tenemos un corpus de archivos razonablemente grande, algunos cientos, por ejemplo.

Podemos asumir dos escenarios:

  1. Podemos volver a ejecutar el programa con diferentes entradas para poder hacer experimentos.
  2. No podemos volver a ejecutar el programa; tenemos un conjunto fijo de documentos. Esto tiene una similitud suave con la decodificación de documentos históricos en un idioma desconocido (por ejemplo, Lineal B).

Una solución parcial puede ser aceptable, es decir, puede haber algunos campos que ninguna persona viva comprende ahora, pero la mayoría de los otros son interpretables.

Solo me interesan los enfoques de código abierto.

ACTUALIZACIÓN Hay una pregunta SO relacionada ( Cómo aplicar ingeniería inversa a los formatos de archivos binarios por motivos de compatibilidad ), pero el énfasis es algo diferente. ACTUALIZACIÓN Sugerencia inteligente de @brianegge a la dirección (1). Use truss (o posiblemente strace en Linux) para volcar todas las llamadas write () y similares en el programa. Esto debería permitir al menos la recopilación de registros escritos en el disco.

¿Fue útil?

Solución

Esta es una pregunta interesante, creo que la respuesta es que los formatos binarios de ingeniería inversa son una habilidad adquirida, pero existen herramientas que pueden ayudar.

Una herramienta es WinOLS , que está diseñado para interpretar y editar imágenes binarias de computadora de gestión del motor del vehículo (principalmente los datos numéricos en sus tablas de búsqueda). Tiene soporte para varios formatos endian (aunque no PDP, creo) y para ver datos en varios anchos y desplazamientos, definiendo áreas de matriz (mapas) y visualizándolos en 2D o 3D con todo tipo de opciones de escala y desplazamiento. También tiene un buscador de mapas automático heurístico / estadístico, que podría funcionar para usted.

Es una herramienta comercial, pero la demostración gratuita le permitirá hacer todo menos guardar los cambios en el binario y usar las funciones de administración del motor que no necesita. Dijiste que solo te interesan las soluciones de código abierto, pero este es Stackoverflow y alguien más podría no ser tan exigente.

Otros consejos

todos los archivos tienen un encabezado. Comience desde allí, vea qué similitudes tiene entre 2 archivos, elimine las " firmas " Y trabajar con las diferencias. Deben marcar el número de registros, la fecha de exportación y cosas similares.

Las partes comunes entre los dos encabezados pueden considerarse firmas generales y supongo que puede ignorarlas

Si está en un sistema que ofrece truss , simplemente observe las llamadas de su sistema para escribir y probablemente tendrá una buena idea. También es posible que el programa vaya a mapear un archivo y copiarlo directamente desde la memoria, pero eso es menos común.

$ truss -t write echo foo
foowrite(1, " f o o", 3)                                = 3
write(1, "\n", 1)                               = 1

También puede tener sentido echar un vistazo al binario. En los sistemas Unix, puede usar objdump para ver el diseño del binario. Esto apuntará a las secciones de código y datos. Luego puede abrir el binario es un editor hexadecimal e ir a los desplazamientos específicos. Puede estar interesado en mi consejos para los archivos binarios de Solaris .

  • Diff 2 o más archivos para buscar similitudes. A menudo, esto le ayuda a identificar los bloques de encabezado y diferentes secciones del archivo.

  • El endianness suele ser bastante fácil de calcular: los bytes más significativos tienden a ser cero mucho más a menudo que los menos significativos, por lo que si ves un patrón como " 00 78 " o " 78 00 " Puedes hacer una buena conjetura de qué byte es el msb. Sin embargo, esto solo sirve de ayuda cuando ha averiguado (aproximadamente) cuáles son los datos anteriores, para que sepa cómo se alinean los datos.

  • Busque datos que se identifiquen fácilmente: las cadenas son el primer lugar para comenzar porque puede detectarlas fácilmente. Estos a menudo le dan pistas, ya que generalmente están incrustados cerca de datos relacionados, utilizados como elementos estándar en los encabezados, etc. Si las cadenas son unicode, por lo general verá las letras del texto separadas por cero bytes, lo que le ayudará a identificar la endianidad. y la alineación de datos en ese punto en los datos.

  • Un enfoque de formato común (como IFF) es almacenar fragmentos de datos, cada uno con un encabezado pequeño (por ejemplo, un ID de 2 o 4 bytes, luego un tamaño de 2 o 4 bytes para el bloque, luego los datos de el bloque). En general, la gente usa identificadores de trozos significativos (para ellos), por lo que pueden ser fáciles de detectar. Si encuentra lo que parece una etiqueta, verifique los siguientes datos para ver si parece una longitud (vea que hay muchos bytes en los datos). para ver si parece que hay otro encabezado). Si puede identificar dicho formato, rompe el " un archivo grande " Problema abajo en un " muchos archivos pequeños " problema que lo hace mucho más fácil. (Sin embargo, una gran cantidad de datos de dispositivos tienden a ser optimizados para hacerlos compactos, en cuyo caso los programadores a menudo desechan formatos extensibles convenientes y abarrotan todo, empaquetando bits y, en general, hacen las cosas mucho más difíciles para usted)

  • Busca valores conocidos. Si su dispositivo muestra " temperatura: 40 " entonces es posible que encuentre ese valor directamente almacenado en el archivo. (También es común usar factores de escala o valores de punto fijo, por lo que 40 pueden representarse como (por ejemplo) 40 * 10 = 400 o 40 * 256 = 10240)

  • Si puedes controlar el dispositivo lo suficiente: crea algunos archivos simples. Lo que estás tratando de lograr es los archivos más pequeños que puedes sacar del dispositivo para minimizar los datos que tienes que examinar. Luego realice un cambio en el dispositivo que hace que cambie el archivo (intente minimizar el número de cambios) y vuelva a capturar el archivo. Si el formato del archivo es " abierto " (no comprimido ni encriptado), entonces debería poder identificar los bytes que han cambiado.

  • Si puede " cargar " de nuevo en el dispositivo, también puede crear sus propios archivos, simplemente cambiando un valor para ver si puede notar algún cambio de comportamiento en el dispositivo. Si logras alcanzar valores simples, esto puede funcionar bien, pero a menudo es posible que simplemente rompas el formato del archivo y que el dispositivo no pueda leer los datos en absoluto.

Esperaba que hubiera una utilidad mágica que pudiera resolver patrones, probar diferentes tipos de endianidad, etc. ¡Pero parece que no existe!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top