Guardare dentro un archivio senza estrarlo

Un archivio, in perizia, arriva come reperto. Il gesto istintivo — doppio clic, trascina fuori, apri — è anche il primo errore: estrarre crea file nuovi con date nuove, e il gestore del sistema operativo racconta dell'archivio cose che non sono vere. Questa guida spiega che cosa c'è davvero dentro uno ZIP, e come documentarlo senza toccarlo.

Tre ragioni per non fare doppio clic

Estrarre è un atto che altera. Per guardare un file in un archivio da tremila voci, il gestore di sistema le materializza tutte: tremila file nuovi, con date nuove, su un disco dove indicizzatori e antivirus li apriranno per conto loro. Se c'era qualcosa di ostile, ora è sul tuo filesystem.

Il gestore mente. Esplora risorse di Windows presenta lo ZIP come una cartella virtuale, e traduce ogni problema nella lingua di una copia: «impossibile copiare il file», oppure «la cartella compressa non è valida» — anche su archivi perfettamente conformi alla specifica, che 7-Zip e unzip aprono senza un rilievo.

Il nome di un file non è una stringa. Dentro uno ZIP è una sequenza di byte, e programmi diversi la leggono in modi diversi. Mostrarne una sola lettura, e tacere le altre, è una perdita di informazione.

Il modulo Archivi di Probatio nasce per questi tre problemi.

Leggere l'indice, non il contenuto

In uno ZIP ogni voce compare due volte: un header locale subito prima dei dati compressi, e un record nella directory centrale, l'indice che sta in coda al file ed è chiuso da un terminatore (EOCD). I lettori conformi partono dalla fine, ed è per questo che un eseguibile autoestraente funziona: davanti c'è un programma, ma l'indice resta in fondo.

Probatio fa lo stesso. L'elenco di un archivio da molti gigabyte è quasi immediato, perché per sapere cosa contiene non tocca un solo byte compresso — e non decifra nulla: di un archivio protetto da password si vedono comunque nomi, dimensioni e date.

Uno ZIP si legge dalla fine header locale PK 03 04 dati compressi della voce qui Probatio non entra per elencare altre voci… directory centrale PK 01 02 EOCD PK 05 06 si parte dal terminatore e si risale all'indice: il record di ogni voce sta qui Il record di una voce nella directory centrale bit 11 = 0 il nome non si dichiara UTF-8 70 65 72 63 68 c3 a9 2e 74 78 74 UTF-8: perché.txt CP850: perch├®.txt data DOS 2026-03-14 10:31:06 ora locale · fuso ignoto · passo 2 s extra field NTFS 2026-03-14 09:31:07Z UTC · passo 100 ns CRC-32 dichiarato 6fecd078 CRC-32 ricalcolato sui byte 6fecd078 · coincide metodo 8 (Deflate) · 39 byte Le due date distano un'ora esatta: è compatibile con il fuso di chi ha creato l'archivio (UTC+1). Probatio le mostra entrambe e segnala che non coincidono; perché non coincidano lo stabilisce chi legge.
Contenuto d'esempio della voce: la riga «Verbale di consegna del 14 marzo 2026.» più l'a capo, 39 byte. Il CRC-32 mostrato è quello reale di quei byte.

Il formato si riconosce dai byte, non dall'estensione: un .docx è uno ZIP, un autoestraente pure, e un file rinominato non può nascondere ciò che è. Oltre allo ZIP e alla sua famiglia (docx, xlsx, apk, jar, epub, i WACZ, i bag BagIt), il modulo apre 7z, TAR e TAR compressi, gzip, bzip2, XZ e Zstandard singoli, CAB, ISO 9660, ar e pacchetti Debian, e i contenitori CFB — quelli degli installatori .msi, dei vecchi .doc e dei .msg di Outlook. In un MSI i nomi degli stream sono codificati in un alfabeto a 64 simboli che, letto alla lettera, sembra una fila di ideogrammi: Probatio li decodifica.

Prima ancora dell'elenco, Probatio calcola lo SHA-256 del file archivio. Lo fa sempre, anche quando l'apertura fallisce: un rapporto deve dire su quale file ha fallito.

Il nome di un file è una sequenza di byte

Nel record di ogni voce c'è un campo di flag, e il suo bit 11 dichiara se il nome è scritto in UTF-8. Se il bit è abbassato, la specifica PKWARE prescrive la vecchia code page del DOS, la CP437. Il guaio è che molti programmi scrivono il nome in UTF-8 senza alzare il bit. 7-Zip e unzip riconoscono l'UTF-8 da soli e mostrano il nome giusto; Windows invece, secondo il banco di prova citato più avanti, applica la code page OEM del sistema, che su un sistema italiano è la CP850.

Ecco lo stesso nome, con il bit 11 abbassato:

LetturaRisultato
Byte grezzi70 65 72 63 68 c3 a9 2e 74 78 74
UTF-8perché.txt
CP437 (quella prescritta)perché.txt
CP850 (quella di Windows in Italia)perch├®.txt

Quale sia «il» nome non ha una risposta sola, e Probatio non sceglie al posto tuo: nel dettaglio della voce mostra le tre letture, i byte grezzi in esadecimale e lo stato del bit 11, e marca la voce quando il nome è UTF-8 ma non lo dichiara. Nell'albero usa la lettura UTF-8 quando i byte sono UTF-8 validi — come fanno 7-Zip e unzip — e ricade sulla CP437 altrimenti. Se il nome è tutto ASCII le letture coincidono, e il pannello lo dice.

In relazione, quando citi il nome di una voce non ASCII con il bit 11 abbassato, riporta anche i byte. Sono l'unico dato che nessuno ha interpretato.

Due date per la stessa voce

La data principale di una voce ZIP è il DOS time: risoluzione di due secondi, ora locale della macchina che ha creato l'archivio, e nessun fuso. Nessuno registra quale fosse quell'ora locale. Molti archivi portano però anche un extra field: quello NTFS, con la data in UTC a passi di 100 nanosecondi, oppure l'Extended Timestamp Unix, in secondi UTC.

Probatio le mostra entrambe e le scrive in modo diverso: la data DOS senza suffisso, perché chiamare UTC un'ora di fuso ignoto sarebbe inventare un dato, e quella dell'extra field con la Z. Quando le due non coincidono al minuto, la voce viene marcata. Il secondo di differenza nella figura sopra non basta a marcarla: è il passo di due secondi del DOS time, non una discrepanza.

Leggere la discrepanza spetta a te. Uno scarto di ore intere è quello che ci si aspetta: è il fuso della macchina d'origine in quella data, ora legale compresa. Uno scarto diverso merita una spiegazione prima di finire in relazione. Negli altri formati: 7z e TAR registrano l'istante in UTC, il CAB è senza fuso come lo ZIP, l'ISO 9660 porta l'offset dal GMT e Probatio lo rende così com'è.

CRC-32 e impronte, senza scrivere nulla

ZIP e 7z dichiarano per ogni voce un CRC-32 dei dati non compressi. Quando calcoli le impronte di una voce, o quando la estrai, Probatio ricalcola il CRC sui byte decompressi e lo confronta con quello dichiarato. È la stessa logica dell'hash di acquisizione di un'immagine E01, applicata a ogni file del contenitore. Negli altri formati un CRC per voce non c'è, e il campo resta vuoto: vuoto, non zero.

Con lo stesso limite dell'E01: il CRC-32 non è crittografico. Una discordanza dice che il contenuto non è quello che l'archivio dichiara; una concordanza dice che l'archivio è coerente con se stesso, non che nessuno l'abbia mai toccato — chi altera una voce può ricalcolarne il CRC.

Per legare una voce a un'impronta vera servono gli hash crittografici. Probatio calcola MD5, SHA-1 e SHA-256 di una singola voce decomprimendola in memoria: il file non viene scritto su disco. Accanto, il tipo reale del contenuto, dedotto dai byte decompressi e non dal nome.

«La cartella compressa non è valida»

Il pannello «Explorer di Windows aprirà questo archivio?» traduce in una diagnosi un banco di prova a variabile singola — 19 archivi, 5 motori, Windows 11 in italiano — pubblicato nell'articolo «La cartella compressa non è valida»: cosa fa davvero Windows con gli archivi ZIP. Il risultato più sorprendente riguarda la lunghezza del nome: Explorer applica il limite dei percorsi al nome della voce isolato, cioè al percorso interno all'archivio, senza contare la cartella in cui estrarrai.

lunghezza del nome della voce, in caratteri, contando le cartelle interne all'archivio fino a 256 da 257 a 259 260 e oltre apre ed estrae la lunghezza non è un ostacolo si apre vuoto, senza errori nulla segnala che manchi qualcosa rifiutato «la cartella compressa non è valida» Basta una voce oltre soglia: anche tutte le altre diventano irraggiungibili. Soglie misurate su Windows 11 (build 26200) in italiano. Probatio le applica solo agli ZIP.
La fascia centrale è la peggiore: nessun messaggio d'errore, e un archivio che sembra non contenere niente.

La lunghezza è l'unica causa di rifiuto dell'archivio. Le altre condizioni lo lasciano aprire, ma fanno fallire l'estrazione, quasi sempre con un codice che non nomina la causa:

  • Metodi diversi da Stored (0) e Deflate (8) — BZip2, LZMA, Zstandard e gli altri: l'estrazione fallisce con 0x80004005.
  • Cifratura AES — stesso codice generico, senza nemmeno chiedere la password: sembra un archivio rotto. Per questo Probatio mostra il metodo come è registrato nell'archivio, cioè 99, e non quello interno che il 99 nasconde.
  • Caratteri che Windows non ammette (: * | ? " < >) — 0x80070057, con un'estrazione parziale e incoerente.
  • Nomi UTF-8 senza bit 11 — nomi accentati corrotti secondo la CP850.
  • Collegamenti simbolici — convertiti in silenzio in file di testo che contengono il nome del bersaglio.

Il verdetto è uno di quattro — nessun ostacolo, estrazione parziale, apparirà vuoto, lo rifiuterà — e accanto c'è il nome più lungo trovato, con la sua lunghezza. Quando un committente dice «l'archivio è danneggiato», è il primo posto in cui guardare.

Archivi frazionati, archivi dentro archivi

Gli archivi tagliati a byte — prove.7z.001, .002 e così via, oppure .zip.001 — non sono archivi a sé: sono l'originale tagliato con le forbici. Probatio li presenta come un flusso unico, senza ricomporli su disco, partendo da un pezzo qualsiasi; l'impronta mostrata è quella dell'archivio ricomposto. Un buco nella numerazione viene detto per nome — «mancano le parti 003, 007» — invece del solito «archivio danneggiato». Ma la completezza si deduce dalla numerazione: se manca l'ultimo pezzo, la sequenza sembra solo più corta.

Una voce che è a sua volta un archivio si apre come tale, fino a tre livelli. Per farlo Probatio ne mette una copia di servizio nella propria cartella di lavoro, non accanto al reperto; il limite dei tre livelli è la difesa contro le bombe di decompressione ricorsive.

Niente sparisce in silenzio

È il principio che regge tutto il modulo. Quando estrai, ogni voce che non viene scritta compare in un elenco che si apre da solo, con il motivo accanto: il nome è troppo lungo per il filesystem, il percorso sarebbe uscito dalla cartella di destinazione (lo zip slip), il rapporto di compressione supera 1000× e non hai confermato, la dimensione dichiarata supera il tetto per singolo file. Chi guarda la cartella di destinazione non avrebbe altro modo di sapere che manca qualcosa.

Allo stesso modo, un nome corretto — una risalita .. tolta, un percorso assoluto reso relativo, un nome di device riservato di Windows — viene estratto e annotato, non scartato. Un collegamento simbolico diventa un file di testo che ne dichiara il bersaglio. Una voce cifrata viene detta cifrata, non liquidata come errore. Ogni file scritto porta il suo SHA-256 e il CRC ricalcolato. E le bombe di decompressione si riconoscono prima di decomprimere, dal rapporto di compressione e dalle voci che condividono gli stessi byte compressi.

Che cosa il modulo non fa

  • RAR non si apre. Il formato è riconosciuto, ma l'unica implementazione disponibile deriva dal sorgente UnRAR di RARLAB, con una licenza incompatibile con Probatio. È un vincolo di licenza, non tecnico, e l'app lo dice invece di far credere che il file sia rotto.
  • Gli ZIP a volumi veri (.z01, .z02… più .zip) sono riconosciuti e non aperti: ogni volume ha una struttura propria e i record portano numeri di disco da rimappare, quindi concatenarli non basta.
  • CAB su più cabinet: l'elenco si legge, ma un file a cavallo di due cabinet non si estrae.
  • ISO: si legge il solo ISO 9660, con i nomi Joliet. UDF e Rock Ridge non sono interpretati: un'immagine moderna che tiene il contenuto in UDF esce quasi vuota, e Probatio lo segnala.
  • Isolamento diverso fra i sistemi. Su macOS il processo di lettura gira in una sandbox del sistema operativo — niente rete, niente esecuzione di altri programmi, scrittura solo nella cartella di lavoro e nella destinazione scelta — con limiti di memoria e di CPU. Su Windows è un processo separato con un tempo massimo, ma senza confinamento del sistema operativo e senza limiti di memoria o CPU. Le guardie sui percorsi e sulle bombe stanno nel codice e valgono ovunque.
  • La diagnosi Windows vale per gli ZIP, e le soglie sono state misurate su una versione precisa di Windows 11. Un'altra versione potrebbe comportarsi diversamente.
  • Le impronte di una voce si calcolano in memoria. Per una voce di molti gigabyte conviene estrarla e calcolarne l'impronta con il modulo Hash.

In pratica

  1. Annota l'impronta dell'archivio prima di tutto. Probatio la calcola all'apertura; per un set frazionato, calcola anche quella di ogni volume ricevuto.
  2. Documenta l'elenco prima di estrarre, con il rapporto PDF del modulo: nomi, dimensioni, metodi, date e rilievi, fissati prima di toccare qualcosa.
  3. Estrai solo ciò che ti serve, e conserva l'elenco delle voci saltate insieme ai file estratti.
  4. Riporta entrambe le date, e quella DOS senza fuso: aggiungerle una Z in relazione è un errore.
  5. Prima di scrivere «archivio danneggiato», guarda il pannello Windows. Spesso l'archivio è integro, ed è Explorer a non saperlo leggere.

Un archivio è un piccolo filesystem confezionato da qualcun altro, con le sue date, i suoi nomi e le sue bugie involontarie. Guardarlo senza estrarlo non è una cautela eccessiva: è l'unico modo di descrivere il reperto com'era, prima che lo diventi il tuo disco.