Próba naprawienia archiwum spowoduje porównanie lokalnych i centralnych CRC, a połączenie tego z testami archiwalnymi pozwoli na sprawdzenie wszystkich CRC. Jeśli uciekniesz
unzip -t archive.zip
i
zip -F archive.zip --out archivefix.zip
i nie narzekają, co oznacza, że zawartość archiwum pasuje zarówno do centralnej, jak i lokalnej CRC. (Możesz archivefix.zippóźniej usunąć .)
Aby to sprawdzić, zaczynając od kodu źródłowego Info-ZIP dla zip3.0, utworzyłem plik w następujący sposób:
zip -9 test.zip zip.txt zipup.c
Następnie uszkodziłem CRC katalogu centralnego, zip.txtzmieniając bajt z przesunięciem 0xB137. Mam zachowanie przeciwne do tego, co zaobserwowałeś; unzip -vPodawane zmienionego CRC z katalogu centralnego, ale unzip -ti zip -Tpoinformował, że plik był OK (sprawdzanie przeciwko miejscowym CRC).
Ale działa
zip -F test --out testfix
zgłoszone
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
W „poprawionym” pliku nadal znajduje się zmieniony CRC zip.txt.
Zmiana lokalnego CRC zip.txtna przesunięcie 0x10 spowodowała oba unzip -ti zip -Tzgłosiła błąd CRC, ale zip -Fnie zauważyła nic złego.
Zatem z moich eksperymentów rozbieżności między zawartością wpisu archiwum a jego CRC można wykryć w następujący sposób:
- tylko lokalnie:
zip -Ti unzip -t; zip -Fbędzie również narzekać na niedopasowanie centralne na szczeblu lokalnym
- lokalny i centralny:
zip -Tiunzip -t
- tylko centralne:
zip -Ti unzip -tnie będzie narzekać, ale zip -Fwskaże niedopasowanie lokalne i centralne
(Zauważ, że domyślnie zip -Tpo prostu wykorzystuje unzip -tqq, tak zip -Ti unzip -tnaprawdę są równoważne można odczytać. unzipKod źródłowy, aby sprawdzić, testując archiwum naprawdę porównuje lokalny CRC, a nie jeden centralny; wygląd extract_or_test_files(), extract_or_test_entrylist()a extract_or_test_member()wszystko w extract.c.)
unzip -t?