ความพยายามในการแก้ไขการเก็บถาวรจะเปรียบเทียบ CRC ในพื้นที่และส่วนกลางและการรวมกับการทดสอบที่เก็บถาวรจะอนุญาตให้ตรวจสอบ CRC ทั้งหมด ถ้าคุณวิ่ง
unzip -t archive.zip
และ
zip -F archive.zip --out archivefix.zip
และไม่บ่นนั่นหมายความว่าเนื้อหาของไฟล์เก็บถาวรตรงกับทั้ง CRC ส่วนกลางและท้องถิ่น (คุณสามารถลบได้ในarchivefix.zip
ภายหลัง)
เพื่อตรวจสอบสิ่งนี้เริ่มต้นด้วยซอร์สโค้ด Info-ZIP สำหรับzip
3.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
อะไร