Testar a integridade do arquivo ZIP?

21

Pelo que sei, a opção zip -T determina apenas se os arquivos podem ser extraídos - na verdade, não testamos a integridade interna do arquivo. Por exemplo, corrompi deliberadamente o CRC local (não o diretório central) de um arquivo, e o zip não se importava, relatando o arquivo como OK. Existe algum outro utilitário para fazer isso?

Há muita redundância interna nos arquivos ZIP, e seria bom ter uma maneira de verificar tudo. Obviamente, 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 bloqueado ou ausente. Gostaria de saber se os arquivos criados são o mais recuperáveis ​​possível.

Marc Rochkind
fonte
2
Que tal unzip -t?
precisa saber é o seguinte
Mesmo comportamento que o zip.
Marc Rochkind

Respostas:

20

descompacte -t

Teste os arquivos compactados.

Essa opção extrai cada arquivo especificado na memória e compara o CRC (verificação de redundância cíclica, uma soma de verificação aprimorada) do arquivo expandido com o valor CRC armazenado no original.

[fonte: https://linux.die.net/man/1/unzip ]

Theophrastus
fonte
Existem 2 CRCs por arquivo: local e central. unzip -tapenas testa o último.
Marc Rochkind
2
não sei o que você quer dizer com "local" versus "central" (central para o quê?), mas quando executo "unzip -t myzip_file.zip", vejo uma saída de linha para comentar a integridade de cada arquivo compactado , como (imagine melhor formatação): "teste: teste AARiseTransitSet.cpp OK: testando AARiseTransitSet.h OK: teste AASaturn.cpp OK: AASaturn.h OK ...
Theophrastus
Não é o lugar para explicar a estrutura interna dos arquivos ZIP. O artigo da Wikepedia é muito bom nisso. Como eu disse, é um relatório enganoso que você está vendo.
Marc Rochkind
Se eu for para um arquivo zip com um editor hexadecimal e alterar um byte, vejo um arquivo: testing: AA_sphere.htm CRC 7952862e inválido (deve ser 44c6f7f8) enquanto o restante está listado como "OK". você continuará declarando isso como "enganoso", mas é exatamente o que espero de uma verificação CRC arquivo a arquivo de um arquivo zip. agora ... boa sorte para você senhor.
Teofrasto
Eu acho que você mudou o diretório central CRC, no final. Tente alterar o local, antes ou depois do arquivo.
Marc Rochkind
12

Tentar corrigir um arquivo compactado comparará os CRCs locais e centrais e combiná-lo com os 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 nenhuma reclamação, isso significa que o conteúdo do arquivo corresponde aos CRCs centrais e locais. (Você pode excluir archivefix.zipposteriormente.)

Para verificar isso, começando com o código-fonte Info-ZIP para zip3.0, criei um arquivo da seguinte maneira:

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

Eu então corrompi o diretório central CRC zip.txtalterando o byte no deslocamento 0xB137. Eu tenho o comportamento oposto ao que você observou; unzip -vrelatou o CRC alterado a partir do diretório central, mas unzip -te zip -Trelatou que o arquivo foi OK (verificação contra 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 listava a CRC alterada para zip.txt.

Alterar o CRC local para o zip.txtdeslocamento 0x10 causou os dois unzip -te zip -Trelatou um erro do CRC, mas zip -Fnão detectou nada de errado.

Assim, a partir de minhas experiências, as incompatibilidades entre o conteúdo de uma entrada de arquivo e seus CRCs podem ser detectadas da seguinte maneira:

  • somente local: zip -Te unzip -t; zip -Ftambém reclamará da incompatibilidade local-central
  • local e central: zip -Teunzip -t
  • somente central: zip -Te unzip -tnão irá reclamar, mas zip -Findicará uma incompatibilidade local-central

(Note que por padrão zip -Tsimplesmente usa unzip -tqq, por isso zip -Te unzip -trealmente são equivalentes Você pode ler o. unzipCódigo fonte para verificar se testar um arquivo realmente compara o CRC local, e não a um central; olhar para extract_or_test_files(), extract_or_test_entrylist()e extract_or_test_member(), tudo em extract.c.)

Stephen Kitt
fonte
Complicado. E, sem dúvida, muito dependente de quais versões (GNU, BSD, etc.) E o CRC é apenas uma das inúmeras verificações de integridade que podem ser executadas.
Marc Rochkind
1
Não existem muitas versões zipe estão unzipdisponíveis em plataformas semelhantes ao Unix; Info-ZIP é usado praticamente em todos os lugares ...
Stephen Kitt
1
Na medida em que é complicado, são necessários apenas dois comandos; se ambos unzip -te zip -Fexecutar sem erro, você está bem e os dois CRCs foram verificados.
Stephen Kitt
Obrigado! Irá verificar isso. Além disso, esqueci de mencionar: os arquivos ZIP são ZIP64.
Marc Rochkind