A seguito di uno scambio di idee con gli amici di CFItaly, mi è venuta l’idea di provare a giocare un po’ con l’analisi statistica del contenuto di un file generico. Non è una idea nuova (rif. Denis Frati), certamente no, ma al solito ogni tanto mi piace di curiosare in cose per me nuove.
Il risultato è un programmino semplicissimo, che ho chiamato Prisma.
L’idea è questa: in ogni tipologia di file la presenza di certi valori di byte non è casuale, ma è in qualche modo legata al contenuto del file stesso. Per cui un file di testo avrà una particolare distribuzione dei valori dei byte, mentre una immagine o un file eseguibile ne avranno una differente, anche in funzione della codifica. Analizzando le frequenze con cui ogni valore di byte compare nel file si potrebbero individuare anomalie nel contenuto del file stesso, come ad esempio un testo nascosto in un file audio, oppure più semplicemente file camuffati: immagini spacciate come file compressi e simili.
Funziona in questo modo: si forniscono in standard input i dati da analizzare, per esempio un file, e in uscita si hanno tre differenti tipi di output a scelta. Il primo, banale, è un file CSV con i dati di frequenza complessivi di tutti i dati forniti in ingresso. E’ utilizzabile per fare un grafico con OpenOffice Calc e simili.
L’altro output è grafico, sotto forma di immagine PNG, in due varianti: la più semplice mostra uno spettrogramma complessivo per tutti i dati in input, ed è semplicemente una differente rappresentazione dei dati forniti anche in CSV, tanto che si possono chiedere entrambi. La seconda opzione è più intrigante: produce una immagine larga 256 pixel in cui ogni riga è lo spettrogramma di un blocco di dati in input, e la dimensione del blocco è configurabile. In pratica si ha un colpo d’occhio sul contenuto del file, reso in forma grafica.

Questo è lo spettro di un file di testo (la licenza GNU GPL per la precisione).

Questo è quello che si ottiene usando un file Wave.

Questo invece è lo spettrogramma dello stesso file (clicca sull’immagine per la dimensione reale).
Il primo file è stato ottenuto col comando:
$ cat COPYING | prisma -p asciitext.png
Lo spettrogramma del file Wave invece è stato ottenuto col comando:
$ cat test.wav | prisma -p wave-big.png -b 100000
Per chi è interessato, il programma è rilasciato sotto licenza GNU GPLv2, ed il tarball dei sorgenti con il makefile per compilare ed installare il tutto, con tanto di pagine man in italiano ed inglese è scaricabile qui. Richiede le librerie e gli header di ImageMagick per la compilazione
Sono ovviamente graditi commenti e suggerimenti per il miglioramento.

#1 da Rebus il 30 May 2008 - 23:51
Affascinante. Una volta affinato lo strumento, servirà un’ampia base statistica per la taratura, dico bene? Come conti di far progredire il progetto?
#2 da Nanni Bassetti il 31 May 2008 - 08:05
Mario complimenti davvero….dovremmo testarla tutti…se la cosa ha qualche
rilevanza dovresti pubblicarlo su souceforge….e da quello che ho capito
potrebbe servire anche per popolare un database di campioni di file per
tipologia. Quindi un’eventuale evoluzione sarebbe poter fare una query di un
tipo di file e avere in output il suo spettro campione, dopodichè ad occhio
confrontarlo con lo spettro generato da Prisma e “insospettirsi” sulla vera
natura del file in analisi….bello!
ciao
PS: al convegno a Roma ne parli he? sennò te lo tiro io dalla giacchetta
#3 da Mario Pascucci il 3 June 2008 - 13:02
@Tutti
Per ora è soltanto un puro esercizio di programmazione. Considerando che vengo dal campo dell’audio, e lì cose come queste sono all’ordine del giorno, mi sembrava di vedere un possibile parallelo fra i due mondi.
Quello che rende tutto più difficile è l’immensa variabilità che ci si trova ad affrontare quando si parla di statistica, avete presente, “Lies, damn lies and statistics”.
Sto immaginando: probabilmente gli algoritmi per l’analisi potrebbero essere derivati da quelli per la speech recognition, con tutte le conseguenze del caso (falsi positivi e falsi negativi), non dimenticando che nel riconoscimento vocale ci si aiuta con un dizionario, qui non credo si possa fare.
@Rebus
Al momento non c’è nessun reale progetto. E’ appunto un semplice esercizio di curiosità.
@Nanni
Ne avevo l’intenzione, di parlarne, ma solo come possibilità *molto futura*…