ความพยายามในการแก้ไขการเก็บถาวรจะเปรียบเทียบ CRC ในพื้นที่และส่วนกลางและการรวมกับการทดสอบที่เก็บถาวรจะอนุญาตให้ตรวจสอบ CRC ทั้งหมด ถ้าคุณวิ่ง
unzip -t archive.zip
และ
zip -F archive.zip --out archivefix.zip
และไม่บ่นนั่นหมายความว่าเนื้อหาของไฟล์เก็บถาวรตรงกับทั้ง CRC ส่วนกลางและท้องถิ่น (คุณสามารถลบได้ในarchivefix.zipภายหลัง)
เพื่อตรวจสอบสิ่งนี้เริ่มต้นด้วยซอร์สโค้ด Info-ZIP สำหรับzip3.0 ฉันสร้างไฟล์ดังนี้:
zip -9 test.zip zip.txt zipup.c
ฉันเสียหายไดเรกทอรีกลาง CRC สำหรับzip.txtโดยการเปลี่ยนไบต์ที่ offset 0xB137 ฉันมีพฤติกรรมตรงข้ามกับสิ่งที่คุณสังเกต unzip -vรายงาน CRC ที่ถูกเปลี่ยนแปลงจากไดเรกทอรีกลาง แต่unzip -tและzip -Tรายงานว่าไฟล์นั้นใช้ได้ (ตรวจสอบกับ CRC ท้องถิ่น)
แต่วิ่งได้
zip -F test --out testfix
รายงาน
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
"การแก้ไข" zip.txtแฟ้มยังคงจดทะเบียนเปลี่ยนแปลงสำหรับซีอาร์ซี
การแก้ไข CRC ในระบบสำหรับzip.txtออฟเซ็ต 0x10 ทำให้ทั้งคู่unzip -tและzip -Tรายงานข้อผิดพลาด CRC แต่zip -Fไม่พบสิ่งผิดปกติ
ดังนั้นจากการทดสอบของฉันไม่ตรงกันระหว่างเนื้อหาของรายการที่เก็บถาวรและ CRC ของมันสามารถตรวจพบได้ดังนี้:
- ท้องถิ่นเท่านั้น:
zip -Tและunzip -t; zip -Fจะบ่นเกี่ยวกับความไม่ตรงกันในพื้นที่ส่วนกลาง
- ท้องถิ่นและส่วนกลาง:
zip -Tและunzip -t
- กลางเท่านั้น:
zip -Tและunzip -tจะไม่บ่น แต่zip -Fจะบ่งบอกถึงความไม่ตรงกันในพื้นที่ส่วนกลาง
(หมายเหตุที่เริ่มต้นzip -Tเพียงแค่ใช้unzip -tqqเพื่อzip -Tและunzip -tจริงๆเทียบเท่าคุณสามารถอ่าน. unzipรหัสแหล่งที่มาเพื่อตรวจสอบว่าการทดสอบเก็บจริงๆเปรียบเทียบท้องถิ่นซีอาร์ซีไม่ได้เป็นศูนย์กลางหนึ่ง; มองหาextract_or_test_files(), extract_or_test_entrylist()และextract_or_test_member()ทั้งหมดในextract.c.)
unzip -tอะไร