Testar integridade do arquivo ZIP?

12

Por mais próximo que eu possa dizer, a opção zip -T determina apenas se os arquivos podem ser extraídos - ele realmente não testa o arquivo quanto à integridade interna. Por exemplo, eu deliberadamente corrompi o CRC local (não o diretório central) de um arquivo, e o zip não se importou, reportando o arquivo como OK. Existe algum outro utilitário para fazer isso?

Há muita redundância interna em arquivos ZIP, e seria bom ter uma maneira de verificar tudo. Naturalmente, normalmente o diretório central é tudo o que você precisa, mas ao reparar um arquivo corrompido, muitas vezes tudo o que você tem é um fragmento, com o diretório central danificado ou faltando. Gostaria de saber se os arquivos criados por mim são tão recuperáveis quanto possível.

    
por Marc Rochkind 18.04.2015 / 21:47

2 respostas

13

unzip -t

Test archive files.

This option extracts each specified file in memory and compares the CRC (cyclic redundancy check, an enhanced checksum) of the expanded file with the original's stored CRC value.

[fonte: link ]

    
por 18.04.2015 / 22:30
9

A tentativa de consertar um arquivo irá comparar os CRCs locais e centrais, e combiná-lo com testes de arquivamento permitirá que todos os CRCs sejam verificados. Se você correr

unzip -t archive.zip

e

zip -F archive.zip --out archivefix.zip

e nem reclamar, isso significa que o conteúdo do arquivo corresponde aos CRCs centrais e locais. (Você pode excluir archivefix.zip depois).

Para verificar isso, começando com o código-fonte do Info-ZIP para zip 3.0, criei um arquivo da seguinte forma:

zip -9 test.zip zip.txt zipup.c

Em seguida, eu corrompi o diretório central CRC para zip.txt alterando o byte no deslocamento 0xB137. Eu tenho o comportamento oposto ao que você observou; unzip -v relatou o CRC alterado a partir do diretório central, mas unzip -t e zip -T relataram que o arquivo estava OK (verificando o CRC local).

Mas correndo

zip -F test --out testfix

relatado

Fix archive (-F) - assume mostly intact archive
Zip entry offsets do not need adjusting
 copying: zip.txt
        zip warning: Local Entry CRC does not match CD: zip.txt
 copying: zipup.c

O arquivo "corrigido" ainda listou o CRC alterado para zip.txt .

A alteração do CRC local para zip.txt no deslocamento 0x10 fez com que unzip -t e zip -T reportassem um erro de CRC, mas zip -F não detectou nada de errado.

Assim, a partir de minhas experiências, as diferenças entre o conteúdo de uma entrada de arquivo e seus CRCs podem ser detectados da seguinte forma:

  • somente local: zip -T e unzip -t ; zip -F também reclamará sobre a incompatibilidade local / central
  • local e central: zip -T e unzip -t
  • apenas central: zip -T e unzip -t não se queixam, mas zip -F indicará uma incompatibilidade entre central local

(Por padrão, zip -T simplesmente usa unzip -tqq , então zip -T e unzip -t são realmente equivalentes. Você pode ler o código fonte unzip para verificar se testar um arquivo realmente compara o CRC local, não o central, procure por extract_or_test_files() , extract_or_test_entrylist() e extract_or_test_member() , todos em extract.c .)

    
por 19.04.2015 / 00:02

Tags