Domanda

Dati sono spesso memorizzati in file binari specifici del programma per i quali la documentazione è scarsa o nulla. Un esempio tipico nel nostro campo sono i dati che provengono da uno strumento, ma sospetto che il problema sia generale. Quali sono i metodi per cercare di comprendere e interpretare i dati?

Per impostare alcuni limiti. I file non sono crittografati e non c'è DRM. Il tipo e il formato del file sono specifici per l'autore del programma (ovvero non è un "file standard" - come * .tar - la cui identità è andata perduta). Non c'è (probabilmente) nessuna offuscamento deliberato, ma potrebbero esserci degli sforzi amatoriali per risparmiare spazio. Possiamo presumere di avere una conoscenza generale di quali siano i dati e che possiamo riconoscere alcuni, ma probabilmente non tutti, i campi e le matrici.

Supponiamo che la maggior parte dei dati sia numerica, con scalari e matrici (probabilmente di 1 e 2 dimensioni e talvolta irregolari o triangolari). Ci saranno anche alcune stringhe di caratteri, probabilmente nomi di persone, siti, date e forse alcune parole chiave. Ci sarà codice nel programma che legge il file binario, ma non abbiamo accesso al sorgente o all'assemblatore. Ad esempio, potrebbe essere stato scritto da un programma VAX Fortran o da alcuni primi Unix o da Windows come oggetti OLE. I numeri possono essere big-o little-endian (che non è noto all'inizio) ma probabilmente sono coerenti. Noi può avere versioni diverse su macchine diverse (ad esempio Cray).

Possiamo presumere che abbiamo un corpus di file ragionevolmente grande - alcune centinaia, diciamo.

Possiamo ipotizzare due scenari:

  1. Possiamo rieseguire il programma con input diversi in modo da poter fare esperimenti.
  2. Non possiamo rieseguire il programma: abbiamo una serie fissa di documenti. Ciò ha una leggera somiglianza con la decodifica di documenti storici in una lingua sconosciuta (ad esempio Linear B).

Una soluzione parziale può essere accettabile, ad esempio potrebbero esserci alcuni campi che nessuna persona vivente ora comprende, ma la maggior parte degli altri sono interpretabili.

Sono interessato solo agli approcci Open Source.

AGGIORNAMENTO Esiste una domanda SO correlata ( Come decodificare i formati di file binari a fini di compatibilità ) ma l'enfasi è leggermente diversa. AGGIORNAMENTO Suggerimento intelligente da @brianegge all'indirizzo (1). Usa truss (o possibilmente strace su Linux) per scaricare tutte le chiamate write () e simili nel programma. Ciò dovrebbe consentire almeno la raccolta di record scritti su disco.

È stato utile?

Soluzione

Questa è una domanda interessante, penso che la risposta sia che il retroingegnerizzazione dei formati binari sia un'abilità acquisita, ma ci sono strumenti là fuori che possono aiutare.

Uno strumento è WinOLS , che è progettato per interpretare e modificare le immagini binarie dei computer di gestione dei motori dei veicoli (principalmente i dati numerici nelle loro tabelle di ricerca). Ha il supporto per vari formati di endian (anche se non PDP, penso) e la visualizzazione di dati a varie larghezze e offset, la definizione di aree di array (mappe) e la visualizzazione in 2D o 3D con tutti i tipi di ridimensionamento e opzioni di offset. Ha anche un cercatore di mappe automatico euristico / statistico, che potrebbe funzionare per te.

È uno strumento commerciale, ma la demo gratuita ti consentirà di fare tutto tranne salvare le modifiche al file binario e utilizzare le funzionalità di gestione del motore che non ti servono. Hai detto che sei interessato solo alle soluzioni open source, ma questo è StackOverflow e qualcun altro potrebbe non essere così esigente.

Altri suggerimenti

tutti i file hanno un'intestazione. Inizia da lì, scopri quali somiglianze hai tra 2 file, elimina le comuni "quotature" e lavorare con le differenze. Dovrebbero segnare il numero di registrazioni, la data di esportazione e cose simili.

Le parti comuni tra le due intestazioni possono essere considerate firme generali e immagino che tu possa ignorarle

Se utilizzi un sistema che offre truss , basta guardare le chiamate di sistema per scrivere e probabilmente avrai una buona idea. È anche possibile che il programma esegua il mmap di un file e lo copi direttamente dalla memoria, ma è meno comune.

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

Potrebbe anche avere senso dare un'occhiata al binario. Sui sistemi Unix, puoi usare objdump per visualizzare il layout del binario. Questo indicherà le sezioni di codice e dati. È quindi possibile aprire il binario è un editor esadecimale e andare agli offset specifici. Potresti essere interessato ai miei suggerimenti per i file binari di Solaris .

  • Diff 2 o più file per cercare somiglianze. Questo spesso ti aiuta a identificare i blocchi di intestazione e le diverse sezioni del file.

  • L'endianità di solito è abbastanza facile da capire - i byte più significativi tendono ad essere zero molto più spesso di quelli meno significativi, quindi se vedi uno schema come " 00 78 " o "78 00" puoi fare una buona ipotesi su quale byte sia il msb. Tuttavia, questo è solo di aiuto quando hai capito (approssimativamente) quali sono i dati precedenti, in modo da sapere come sono allineati i dati.

  • Cerca dati facilmente identificabili: le stringhe sono il primo punto da cui iniziare perché puoi individuarle facilmente. Questi spesso ti danno indizi, poiché di solito sono incorporati vicino a dati correlati, usati come elementi standard nelle intestazioni, ecc. Se le stringhe sono unicode, di solito vedrai le lettere del testo separate da zero byte, che ti aiuteranno a identificare l'endianness e l'allineamento dei dati in quel punto nei dati.

  • Un approccio di formato comune (come IFF) è quello di memorizzare blocchi di dati, ciascuno con una piccola intestazione (ad esempio un ID di 2 o 4 byte, quindi una dimensione di 2 o 4 byte per il blocco, quindi i dati di il blocco). In generale le persone usano ID blocchi significativi (per loro), quindi possono essere facili da individuare - Se trovi quello che sembra un tag, controlla i seguenti dati per vedere se sembra una lunghezza (guarda che molti byte sono presenti nei dati per vedere se sembra che ci sia un'altra intestazione). Se riesci a identificare un tale formato, rompi il " un file di grandi dimensioni " problema in un "molti file di piccole dimensioni" problema che lo rende molto più facile. (Tuttavia, molti dati del dispositivo tendono ad essere "ottimizzati" per renderlo compatto, nel qual caso i programmatori spesso buttano via formati pratici estensibili e stipano tutto insieme, impacchettando bit e generalmente rendendo le cose molto più difficili per te)

  • Cerca valori noti. Se il tuo dispositivo visualizza "temperatura: 40" quindi è possibile trovare quel valore direttamente memorizzato nel file. (È anche comune utilizzare fattori di ridimensionamento o valori in virgola fissa, quindi 40 possono essere rappresentati come (ad esempio) 40 * 10 = 400 o 40 * 256 = 10240 però)

  • Se riesci a controllare abbastanza il dispositivo: crea alcuni semplici file. Quello che stai cercando di ottenere sono i file più piccoli che puoi ottenere dal dispositivo per ridurre al minimo i dati che devi esaminare. Quindi apportare una modifica sul dispositivo che causa la modifica del file, provare a ridurre al minimo il numero di modifiche e acquisire nuovamente il file. Se il formato del file è " apri " (non compresso o crittografato), dovresti essere in grado di identificare i byte che sono stati modificati.

  • Se puoi " caricare " di nuovo i file sul dispositivo potresti anche essere in grado di creare i tuoi file, cambiando solo un valore per vedere se puoi notare qualsiasi cambiamento di comportamento sul dispositivo. Se riesci a raggiungere valori semplici questo può funzionare bene, ma spesso potresti scoprire di rompere il formato del file e il dispositivo non sarà in grado di leggere affatto i dati.

Speravo che ci fosse un'utilità magica in grado di elaborare schemi, provare diversi endianness ecc. Ma non sembra esserci!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top