Uji integritas file ZIP?

21

Sedekat yang saya tahu opsi zip -T hanya menentukan apakah file dapat diekstraksi - itu tidak benar-benar menguji arsip untuk integritas internal. Sebagai contoh, saya sengaja merusak CRC lokal (bukan direktori pusat) untuk sebuah file, dan zip tidak peduli sama sekali, melaporkan arsip sebagai OK. Apakah ada utilitas lain untuk melakukan ini?

Ada banyak redundansi internal pada file ZIP, dan alangkah baiknya untuk memeriksa semuanya. Tentu saja, biasanya direktori pusat adalah semua yang Anda butuhkan, tetapi ketika memperbaiki arsip yang rusak sering kali yang Anda miliki hanyalah sebuah fragmen, dengan direktori pusat musnah atau hilang. Saya ingin tahu apakah arsip yang saya buat dapat dipulihkan semaksimal mungkin.

Marc Rochkind
sumber
2
Bagaimana dengan unzip -t?
FloHimself
Perilaku yang sama seperti zip.
Marc Rochkind

Jawaban:

20

unzip -t

Tes file arsip.

Opsi ini mengekstraksi setiap file yang ditentukan dalam memori dan membandingkan CRC (cyclic redundancy check, checksum yang ditingkatkan) dari file yang diperluas dengan nilai CRC yang disimpan asli.

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

Theophrastus
sumber
Ada 2 CRC per file: lokal dan pusat. unzip -thanya menguji yang terakhir.
Marc Rochkind
2
saya tidak tahu apa yang Anda maksud dengan "lokal" versus "pusat" (pusat untuk apa?) tetapi ketika saya menjalankan "unzip -t myzip_file.zip" saya melihat output baris untuk mengomentari integritas setiap file zip. , seperti (bayangkan format lebih baik): "pengujian: AARiseTransitSet.cpp pengujian OK: AARiseTransitSet.h pengujian OK: AASaturn.cpp pengujian OK: AASaturn.h OK ...
Theophrastus
Bukan tempat untuk menjelaskan struktur internal file ZIP. Artikel Wikepedia cukup bagus dalam hal ini. Seperti yang saya katakan, itu adalah laporan yang menyesatkan yang Anda lihat.
Marc Rochkind
Jika saya masuk ke file zip dengan hex-editor dan mengubah satu byte, maka saya melihat untuk satu file: pengujian: AA_sphere.htm bad CRC 7952862e (harus 44c6f7f8) sedangkan sisanya terdaftar sebagai "OK". Anda akan terus mendeklarasikan ini sebagai "menyesatkan", tetapi itulah yang saya harapkan untuk pemeriksaan file-by-file dari file zip. sekarang ... semoga beruntung Pak.
Theophrastus
Saya pikir Anda telah mengubah direktori pusat CRC, pada akhirnya. Coba ubah yang lokal, sebelum atau setelah file.
Marc Rochkind
12

Mencoba untuk memperbaiki arsip akan membandingkan CRC lokal dan pusat, dan menggabungkannya dengan tes arsip akan memungkinkan semua CRC diperiksa. Jika Anda berlari

unzip -t archive.zip

dan

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

dan tidak ada keluhan, itu berarti isi arsip cocok dengan CRC pusat dan lokal. (Anda dapat menghapus archivefix.zipsesudahnya.)

Untuk memverifikasi ini, dimulai dengan kode sumber Info-ZIP untuk zip3.0, saya membuat file sebagai berikut:

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

Saya kemudian merusak direktori pusat CRC zip.txtdengan mengubah byte pada offset 0xB137. Saya mendapatkan perilaku yang berlawanan dengan apa yang Anda amati; unzip -vmelaporkan CRC yang diubah dari direktori pusat, tetapi unzip -tdan zip -Tmelaporkan bahwa file itu OK (memeriksa terhadap CRC lokal).

Tapi berlari

zip -F test --out testfix

dilaporkan

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

File "dikoreksi" masih mencantumkan CRC yang diubah untuk zip.txt.

Mengubah CRC lokal untuk zip.txtpada offset 0x10 menyebabkan keduanya unzip -tdan zip -Tmelaporkan kesalahan CRC, tetapi zip -Ftidak menemukan kesalahan.

Jadi dari percobaan saya, ketidaksesuaian antara isi entri arsip dan CRC-nya dapat dideteksi sebagai berikut:

  • hanya lokal: zip -Tdan unzip -t; zip -Fjuga akan mengeluh tentang ketidakcocokan lokal-pusat
  • lokal dan pusat: zip -Tdanunzip -t
  • hanya pusat: zip -Tdan unzip -ttidak akan mengeluh, tetapi zip -Fakan menunjukkan ketidakcocokan lokal-sentral

(Perhatikan bahwa secara default zip -Thanya menggunakan unzip -tqq, jadi zip -Tdan unzip -tbenar-benar setara. Anda dapat membaca unzipkode sumber untuk memeriksa bahwa pengujian arsip benar-benar membandingkan CRC lokal, bukan yang sentral; cari extract_or_test_files(), extract_or_test_entrylist()dan extract_or_test_member(), semuanya extract.c.)

Stephen Kitt
sumber
Rumit. Dan tidak diragukan lagi sangat tergantung pada versi apa (GNU, BSD, dll.) Dan CRC hanyalah satu dari sekian banyak pemeriksaan integritas yang dapat dilakukan.
Marc Rochkind
1
Tidak ada banyak versi zipdan unziptersedia di platform seperti Unix; Info-ZIP digunakan hampir di mana-mana ...
Stephen Kitt
1
Sejauh ini rumit, hanya perlu dua perintah; jika keduanya unzip -tdan zip -Fberjalan tanpa kesalahan, Anda OK dan kedua CRC telah diperiksa.
Stephen Kitt
Terima kasih! Akan lihat ini. Juga, lupa menyebutkan: file ZIP adalah ZIP64.
Marc Rochkind