|
|
|
|
Strumenti |
05-09-2017, 09:24 | #1 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
[C++] Player di File System
ciao,
l'idea mi è venuta per risolvere un problema su un disco il cui file system è VxFS di Veritas. Cercando in rete ho trovato l'header che credo rappresenti la struttura di tale file system però, prima di tentare qualcosa magari troppo oneroso in termini di tempo, vi chiedo se qualcuno ha già sperimentato programmazione del genere e magari, sgambiarci due idee costruttive. Preciso che non ho intenzione di scrivere codice che accede al drive in quanto, attraverso una utility (g4l), mi sono procurato un file raw che rappresenta di fatto il contenuto dell'intero HD; ora si tratta di capire come è strutturato per leggere file e directory. Grazie |
05-09-2017, 16:29 | #2 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
Quote:
|
|
05-09-2017, 16:56 | #3 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Riguardo l'implementazione di un lettore per quel filesystem, come hai gia' detto, le informazioni sono qui https://github.com/torvalds/linux/tr...er/fs/freevxfs Alla fin fine si tratta di interpretare strutture dati, estrarre gli offset dei file interessanti, spostarsi in quella posizione sul drive fisico o sul file immagine che hai creato e prelevare i dati di quei file. Implementa pure le extent, per cui puo' essere necessario leggere all'interno dei blocchi le info sugli offset di ulteriori blocchi. Cioe' non tutte le informazioni utili per reperire tutti i blocchi le trovi nella "FAT"/inode. |
|
05-09-2017, 17:12 | #4 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
Quote:
L'unica via è studiarsi la struttura vxfs e provare a leggere. Unico dubbio è l'offset del file raw da 9 GB: da che byte si inizia a leggere? Osservando la struct vxfs_sb { } sembra dall'inizio e poi attraverso i vari campi ci si sposta nelle directory e nei vari file e qui, ci sarà un qualche campo, a modi albero binario, che dice dove si trovano i vari blocchi che costituiscono il file di interesse in quanto, potrebbe essere sparpagliato nei vari cluster. |
|
06-09-2017, 08:50 | #5 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Li' dentro ci sono i valori vs_emap e vs_imap che indicano gli offset della mappa delle extent e degli inode. La struct del superblocco e' definita nel file vxfs.h. Se non ti trovi a tuo agio a spulciare il codice, procurati il libro Unix Filesystems di Pate, ex dipendente Veritas, proprio gli ideatori di VxFS. Li' c'e' un capitolo molto dettagliato proprio su questo filesystem. |
|
06-09-2017, 11:39 | #6 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
grazie ad entrambi, mi viene un dubbio: l'hd era collegato ad un PC HP con cpu risc e se non ricordo male, dovrebbe entrare in gioco l'ordine dei bit bigendian e littlendian o non è così?
Ultima modifica di misterx : 07-09-2017 alle 06:23. |
07-09-2017, 15:02 | #7 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
a partire dal byte 8192 non trovo nulla, quindi ho effettuato una ricerca ed il risultato è il seguente:
offset=103485792 A501FCF5 offset=119226720 A501FCF5 offset=148194816 A501FCF5 offset=366755852 A501FCF5 offset=367833092 A501FCF5 offset=368476932 A501FCF5 offset=368478084 A501FCF5 offset=472752132 A501FCF5 offset=476155908 A501FCF5 offset=2725093380 A501FCF5 offset=2726662148 A501FCF5 ci sono più superblocchi, forse una sorta di backup? la stranezza è che facendo un fseek con 368478084 diminuendo il risultato di 4 byte fseek( fp, 368478080, SEEK_SET ); ottengo: magic number = F5FC01A5 (ordine inverso) block size = 56 |
07-09-2017, 15:13 | #8 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Si, i superblocchi hanno parecchi backup. Il primo e' quello normalmente usato.
Tieni conto dell'endianness. x86 e' little endian dopo tutto e a te serve per forza usare tipi word o quad word per estrarre gli offset. |
07-09-2017, 16:52 | #9 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
Quote:
è il magic number non mi convince. Cercando con ultraedit nel raw file per sincerarmene, ne trovo n, e li trovo anche nella medesima posizione con un semplice programma in C dove ho implementato un semplice buffer LIFO questo in quanto, il magic number non si trova ad una distanza partendo da zero divisibile per 4, si devono costruire parole da 4 byte scorrendo i byte uno ad uno e scartando ogni volta il primo entrato nel buffer: sistema arcaico ma funziona. Però, ottenuti gli offset, il primo a 8192 ci può stare che sia andato perduto forse dopo una esecuzione maldestra del comando fsck -F vxfs -a full ...... ma, non mi è chiaro come mai riesco a trovari i magic number nell'ordine 0xa501FCF5 ma quando poi effettuo il salto con la fseek e riempio la struttura struct vxfs_s e visualizzo il campo vs_magic, questo è reversato Ultima modifica di misterx : 07-09-2017 alle 16:55. |
|
09-09-2017, 18:53 | #10 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
è strano ne lsenso che, se visualizzi il file raw con ultredit vedi il magic number little endian, se fai una lettura dal C con la fread hai big endian, magari mi sfugge qualcosa.
|
10-09-2017, 12:51 | #11 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
|
10-09-2017, 15:12 | #12 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
Quote:
printf("%x", c & 0xff); fread(&c, sizeof(c), 1, fp); printf("%x", c & 0xff); fread(&c, sizeof(c), 1, fp); printf("%x", c & 0xff); fread(&c, sizeof(c), 1, fp); printf("%x\n", c & 0xff); ottengo quello che dici Quindi tutto quello che leggo dal file raw va reversato in ambiente intel, è così? Ultima modifica di misterx : 10-09-2017 alle 15:41. |
|
10-09-2017, 17:35 | #13 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
Quote:
per la conversione little<->big uso questa già fatta da altri: Codice:
swapped = ((num>>24)&0xff) | // move byte 3 to byte 0 ((num<<8)&0xff0000) | // move byte 1 to byte 2 ((num>>8)&0xff00) | // move byte 2 to byte 1 ((num<<24)&0xff000000); // byte 0 to byte 3 |
|
12-09-2017, 12:34 | #14 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
ci sto lavorando,
sto leggendo il libro di Pate ma lo trovo troppo superficiale, non esiste qualcosa di più approfondito che spieghi meglio le varie strutture come sono connesse tra loro? p.s. come non detto http://h20565.www2.hpe.com/hpsc/doc/...r_na-c05189468 Ultima modifica di misterx : 12-09-2017 alle 15:23. |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:52.