قنبلة مضغوطة كيف تعمل. قنبلة أرشيف بوتين. وورد قد حكم علينا

💖 أحببته؟شارك الرابط مع أصدقائك
[تحديث] الآن أنا على قائمة استخباراتية لأنني كتبت مقالًا عن نوع من "القنبلة" ، أليس كذلك؟

إذا سبق لك استضافة موقع ويب أو إدارة خادم ، فمن المحتمل أنك تدرك جيدًا الأشخاص السيئين الذين يحاولون فعل أشياء سيئة لممتلكاتك.

عندما استضافت صندوق Linux الصغير الخاص بي لأول مرة مع وصول SSH في سن 13 ، نظرت إلى السجلات وكل يوم رأيت عناوين IP (معظمها من الصين وروسيا) تحاول الاتصال بصندوقي الصغير الجميل (والذي كان في الواقع في الواقع جهاز كمبيوتر محمول قديم ThinkPad T21 مع شاشة مكسورة تنبض تحت السرير). لقد أبلغت عن هذه IPs لمزودي خدمة الإنترنت.

في الواقع ، إذا كان لديك خادم Linux به SSH مفتوح ، يمكنك أن ترى بنفسك عدد محاولات الاتصال التي تحدث يوميًا:

Grep "فشل المصادقة" /var/log/auth.log


المئات من محاولات التفويض الفاشلة ، على الرغم من أن الخادم لا يحتوي على ترخيص بكلمة مرور على الإطلاق وأنه يعمل على منفذ غير قياسي

وورد قد حكم علينا

حسنًا ، دعنا نواجه الأمر ، كانت أدوات فحص ثغرات الويب موجودة قبل Wordpress ، ولكن بعد أن أصبحت المنصة شائعة جدًا ، بدأت معظم الماسحات الضوئية في البحث عن مجلدات wp-admin التي تم تكوينها بشكل خاطئ والمكونات الإضافية غير المصححة.

لذلك إذا أرادت عصابة قراصنة صغيرة الحصول على بعض الحسابات الجديدة ، فسوف يقومون بتنزيل إحدى أدوات الماسح الضوئي هذه وتشغيلها ضد مجموعة من مواقع الويب على أمل الوصول إلى بعض المواقع وتشويهها.


نماذج السجلات عند مسحها ضوئيًا باستخدام أداة Nikto

هذا هو السبب في أن جميع الخوادم ومسؤولي مواقع الويب يتعاملون مع غيغابايت من السجلات المليئة بمحاولات الزحف. لذلك اعتقدت ...

هل يمكنك الرد؟

بعد تجربة الاستخدام المحتمل لـ IDS أو Fail2ban ، تذكرت قنابل ZIP القديمة الجيدة من الماضي.

أي نوع من الأشياء هي قنبلة ZIP؟

كما اتضح ، يعد ضغط ZIP رائعًا في التعامل مع البيانات المتكررة ، لذلك إذا كان لديك ملف نصي ضخم مليء بالبيانات المتكررة مثل جميع الأصفار ، فسيتم ضغطه جيدًا. أعني جيد جدا.

كما أظهر 42.zip ، من الممكن ضغط 4.5 بيتابايت (4500000 جيجابايت) إلى 42 كيلو بايت. عندما تحاول عرض محتويات الأرشيف (استخرجه أو فك ضغطه) ، فمن المحتمل أنك ستستخدم كل مساحة القرص أو ذاكرة الوصول العشوائي.

كيف تُسقط قنبلة مضغوطة على ماسح نقاط الضعف؟

لسوء الحظ ، لا تفهم متصفحات الويب ZIP ، لكنها تفهم GZIP.

لذا فإن أول شيء سنفعله هو إنشاء ملف GZIP بحجم 10 جيجابايت مليء بالأصفار. يمكنك القيام بالعديد من عمليات الضغط المتداخلة ، لكن لنبدأ بضغطة بسيطة.

Dd if = / dev / zero bs = 1M count = 10240 | gzip> 10G.gzip


صنع القنبلة والتحقق من حجمها

كما ترى حجمه 10 ميغا بايت. كان من الممكن أن يكون أضيق قليلاً ، لكن هذا كافٍ في الوقت الحالي.

لنقم الآن بتثبيت برنامج PHP النصي الذي سينقله إلى العميل.

مستعد!

الآن يمكننا استخدامه كدفاع بسيط:

من الواضح أن هذا البرنامج النصي ليس قطعة من الأناقة ، ولكنه يمكن أن يحمينا من أطفال البرنامج النصي المذكورين سابقًا ، والذين ليس لديهم أي فكرة على الإطلاق أنه من الممكن تغيير وكيل المستخدم في برامج الزحف.

إذن ... ماذا يحدث إذا قمت بتشغيل هذا البرنامج النصي؟


(إذا اختبرت القنبلة على أجهزة / متصفحات / نصوص أخرى ، من فضلك

حدث واحد مهم ومثير للاهتمام للغاية حدث بهدوء ودون أن يلاحظه أحد للإهانة. التقى الرئيس الروسي فلاديمير بوتين وتحدث مع أحد قادة الخدمة المدنية ، والذي نادرا ما يظهر اسمه في الصحافة. لا ، هذا الشخص ليس عميلا سريا ، رغم أنه بحكم طبيعة نشاطه يمكنه الوصول إلى معلومات سرية ، ويمكن حتى اعتباره نوعا من "مقاتل الجبهة الخفية". بشكل عام ، تحدث بوتين مع رئيس وكالة المحفوظات الفيدرالية أندريه أرتيزوف.

كانت المحادثة بين رئيس الدولة ورئيس الوكالة ذات طبيعة تجارية ، وقد تتسبب عواقبها المحتملة في بعض الأماكن في تأثير انفجار قنبلة ، وفي بعض الحالات حتى انفجار فوهة شخصية.

أدلى الرئيس ببيان غير بارز أنه قرر رفع السرية عن العديد من الوثائق الأرشيفية ، علاوة على ذلك ، سيتم توقيع المرسوم في نفس اليوم. بالإضافة إلى ذلك ، أعلن بوتين نقل Rosarkhiv إلى التبعية المباشرة لرئيس روسيا ، لأن العديد من مواد القسم "لها قيمة خاصة وذات أهمية عالمية".

وأبلغ رئيس الوكالة ، بدوره ، الرئيس أن صندوق المحفوظات الروسي يخزن 500 مليون ملف ، وأنه "لم يسبق في العقود الأخيرة أن خططت ، وتم تنفيذ عمل منظم بشأن رفع السرية كما يتم الآن".

النقطة الأساسية هي أنه فور رفع السرية ، ستكون الوثائق الأرشيفية متاحة على الموقع الرسمي للأرشيف الروسي ، الذي تم بالفعل إنشاء قاعدة بيانات خاصة له.

من بين المحفوظات التي رفعت عنها السرية بالفعل مواد لطالما لحس المؤرخون المحليون والأجانب شفاههم بها: 1400 توجيه فريد لستالين ، وأوامر من المقر ، وأوامر من الخطوط الأمامية ، وخرائط تشغيلية ، وقرارات وصور في ذلك الوقت ، حتى وقت قريب تم الاحتفاظ بها في المحفوظات تحت عنوان "سري للغاية".

لا يسع المرء إلا أن يفرح المؤرخين بصدق ، ويتمنى لهم أعمالًا جديدة ومثيرة للاهتمام ، والتي ستستند إلى الوثائق المذكورة أعلاه ، ولكن رفع السرية فقط لن يؤثر على موضوع عسكري تاريخي واحد.

يوفر مصدر قريب من الأرشيف الروسي تفاصيل مثيرة للاهتمام: "على حد علمي من المعلومات الواردة من قسم الأرشيف ، يتعلق الأمر بالفترة من 1930 إلى 1989. هناك حالات ، معذرةً ، للمخبرين - وكذلك مكبوتين ببراءة ، بألقاب مثيرة جدًا للاهتمام. ستكون هناك بيانات عن التطورات الفضائية والعسكرية يمكن الإبلاغ عنها بالفعل. بالإضافة إلى ذلك ، يتم رفع السرية عن البيانات المتعلقة بمسار المعارك والأوامر والمعلومات الاستخباراتية التي تم تلقيها خلال الحرب الوطنية العظمى ، وكذلك بشأن العلاقات بين الدول خلال الحرب الباردة.

ويضيف بثقل كبير: "بعض الوثائق ستفاجئ المجتمع. أنت بحاجة إلى معرفة تاريخك الخاص ، مهما كان.

تتمتع المحفوظات بذاكرة طويلة وتحمل شحنة محتملة ليست أسوأ من القنبلة الهيدروجينية. ليس من قبيل المصادفة أن تظل "قضية الحراس" و "حالة الأطباء" في بلدنا سرية ، مما خلق أسبابًا لجميع أنواع التكهنات لفترة طويلة. منذ وقت ليس ببعيد ، في المملكة المتحدة ، تعاملت لجنة خاصة مع الوثائق الأرشيفية التي أوشكت فترة السرية على الانتهاء ، ولكن تقرر تمديد نظام السرية لمدة 50 عامًا أخرى بناءً على بيانات اتصالات ما قبل الحرب للمخابرات البريطانية مع النازية SD.

التحفظ على "بعض الوثائق ستفاجئ الجمهور" ليس من قبيل الصدفة. في أواخر الثمانينيات ، في كل من روسيا وجمهوريات اتحاد الجمهوريات الاشتراكية السوفياتية السابق ، وصلت مجموعة متنوعة من الناس إلى السلطة في موجة "الدمقرطة".

يُظهر الكثيرون حيوية سياسية مذهلة ، على الرغم من افتقارهم الواضح إلى المواهب الإدارية وميلهم إلى تعليم الناس الديمقراطية من وجهة نظرهم.

في الخارج القريب ، القادة السابقون لـ "الجبهات الشعبية" ، الذين غيروا نظرتهم للعالم من معادية للسوفييت إلى مناهضين لروسيا ، تمسكوا بقوة بالسلطة ويتبعون سياسة غير ودية تجاه روسيا من أراضيهم - من تنظيم مؤتمرات من جميع الأنواع من المحرومين من "روسيا المفتوحة" لتدريب المناضلين الموالين للفاشية وتقديم المساعدة العسكرية بانديرا.

سيكون المجتمع الأوروبي ، وكذلك مواطني هذه الحدود ، مهتمين بالتعلم من الوثائق التي رفعت عنها السرية من Rosarchive - أي من "الديموقراطيين الأوروبيين" الجديرون بالملاحظة كانوا مخبرين KGB. شائعات بأن الزعيم السابق للجبهة الوطنية في ليتوانيا لاندسبيرجيس والرئيسة الحالية للسيدة داليا غريبوسكايت "طرقا" الكي جي بي في وقت الشباب الضبابي - الأرض ممتلئة. الآن حول هذا الجانب من سيرتهم الذاتية ، على ما أعتقد ، سيكون من الممكن التعلم من المصدر الأصلي.

يمكنك أن تقول القيل والقال "لقد مضى وقت طويل ، وليس صحيحًا" ، "لقد نما الماضي" ، بقدر ما تريد ، لكن لا تقلل من شأن القوة التدميرية لمثل هذه الإيحاءات.

يمكن للمرء أن يتذكر كيف تم في العام الماضي تمزيق مجموعة من الوثائق التي اكتشفها معهد الذكرى الوطنية ، حول تعاون ليخ فاليسا (تحت الحافز العملي "بوليك") ، بشكل مذهل في الصحافة البولندية في خضم أنشطته في غدانسك حوض بناء السفن. لم يترك الانفجار المعلوماتي جهداً في صورة الأيقونة "القطب رقم 1" ، زعيم حركة التضامن والحائز على جائزة نوبل للسلام وأول رئيس لبولندا المناهضة للاتحاد السوفيتي. من الآن فصاعدًا ، واليسا هو مجرد رجل عجوز سمين شارب ، خراب حقبة ماضية ، يمكن رؤية خزيه بأم عينيك في شكل 17 إيصالًا تم وضعها في نفس معهد الذاكرة الوطنية لتلقي الأموال مقابل الضربة القاضية. -طرق-المعلومات المنقولة إلى الخدمات الخاصة.

يمكن للمرء أن يأسف فقط لأن "القنبلة" الأرشيفية لم تنفجر تحت قاع العميل "بوليك" في الثمانينيات ، عندما هز هو و "تضامنه" ، الذي غنى مع أجهزة المخابرات الغربية ، بولندا الاشتراكية.

يمكن أن يكمن الكثير من المفاجآت المثيرة للاهتمام في انتظار الليبراليين المحليين أيضًا. إن مسار حياتهم المتعرج يشبه من نواح كثيرة طريق فاليسا إلى أعالي القوة. للأسف الشديد ، لم يكن KGB في عجلة من أمره لفضح المخبرين الذين تم إصلاحهم لأسباب عديدة ، من بينها الأخلاقيات لم يكن في المكان الأخير. بعد كل شيء ، إذا كشفت عن وكيل ، خاصةً متطوعًا ، فمن سيتعاون؟ لن تبتعد كثيرًا عن العملاء الذين يُقبض عليهم في ارتكاب أعمال غير لائقة ويتم تجنيدهم على هذا الأساس.

تنتشر المعلومات غير الرسمية عبر وسائل الإعلام بأن "شخصيات بارزة في الحركة الديمقراطية الليبرالية في روسيا" تعاونت طواعية مع أجهزة المخابرات السوفيتية ، بدوافع أنانية: رحلات عمل ممتعة ، والتقدم الوظيفي ، والعمل المرموق ، إلخ.

لا يسع المرء إلا أن يتخيل نوع الأفاعي الصاخبة التي كانت عبارة عن جمعيات إبداعية مختلفة للكتاب والشخصيات المسرحية وصانعي الأفلام.

بالنسبة للعديد من منتقدي اتحاد الجمهوريات الاشتراكية السوفياتية والنظام السوفيتي ، لم يكن الآباء مجرد شخصيات حزبية أو اقتصادية بارزة ، بل خدموا أيضًا في هيئات NKVD-MGB-KGB ، بل إنهم شاركوا بشكل شخصي في القمع.

بالطبع ، الأطفال ليسوا مسؤولين عن آبائهم ، ولكن يصبح الأمر مثيرًا للاشمئزاز عندما يتم أخذ النسل المعاد دهنه لفضح وتمزيق الأغطية ، الذين لا يريدون أن يتذكروا ماضي والديهم ، ولكن مرة واحدة ، دون أي ندم ، أخذوا الاستفادة من مكانتهم العالية ، كنقطة انطلاق لمستقبل شخصي مشرق.

المحفوظات التي رفعت عنها السرية قادرة على التأثير على اصطفاف القوات في قطاع الطرق في أوكرانيا. يمكن للمرء أن يتذكر كيف تسبب عدد من الوثائق التي نشرها ميروسلافا بيردنيك على الشبكات الاجتماعية حتى قبل انقلاب ميدان ، فيما يتعلق بتعاون قادة منظمة الأمم المتحدة مع وزارة أمن الدولة ووزارة الداخلية ، في نوبات اهتراء ونوافير. إسهال الحلق بين جماهير بانديرا القتلى. لعن السفيدوميت ، أطلقوا على نسخ المستندات "FB fakes" ، لكنهم لم يتمكنوا من المجادلة بأي سبب.

لماذا هو مهم؟ القومية الراديكالية الأوكرانية شريرة بلا تحفظ. لكن مجموعة متنوعة من الناس يعلنون عنه. من بين أعضاء OUN المعاصرين ، هناك المثاليون الذين يريدون تطهير القومية الأوكرانية من أكثر الشخصيات بغيضًا في Bandera و Shukhevych ، لأنهم قد تعرضوا للخطر منذ فترة طويلة وبشكل لا رجعة فيه على أنهم دمى هتلرية ومعاقبون. كن على هذا النحو ، لكن المخابرات السوفيتية في فترة ما بعد الحرب فهمت جيدًا مشاعر القوميين الألمان ، الذين فصلوا أنفسهم بوضوح عن النازيين وأنصار الجنرال غيلين ، الذين سقطوا تحت سيطرة الأمريكيين. القوميين الألمان ، الذين اعتبروا بسمارك معبودهم ، بعد أن نجوا من أهوال الحرب ورأوا كيف دفع الأمريكيون FRG إلى حرب جديدة مع الاتحاد السوفيتي ، فضلوا العمل لصالح المخابرات السوفيتية وألمانيا الشرقية. هذه النقطة تستحق النظر بالتأكيد.

من ناحية أخرى ، أوكرانيا مليئة بالأنصار الجدد المتحمسين الذين لا يعانون من الاشمئزاز المفرط ، والذين لا يخشون أي دليل موثق على تعاون أصنامهم مع أجهزة المخابرات النازية. وماذا لو نُشرت وثائق رفعت عنها السرية تقول إن أصنامهم ، مثل فاسيل كوك ، سربوا معلومات إلى MGB عن "إخوانهم" الجالسين في المخابئ؟

ماذا لو اتضح فجأة أن كل أنواع "اليمينيين" و "المربعات" في أواخر الفترة السوفيتية قد أطاحوا بالكي جي بي لتخفيف نظام السجن ، للحصول على طرد إضافي من لحم الخنزير المقدد من المنزل أو حزمة من كشك المخيم؟ فهل "سبيلنوتا" بانديرا الذي يرى في كل مكان اليد الطويلة لموسكو وجهاز الأمن الفيدرالي وبوتين سيقفون شخصيًا في مواجهة مثل هذا الاختبار لقوة الإدانات؟

يمكن أن تتسبب المعلومات من هذا النوع في إطلاق قوي للبلازما النووية الحرارية من Svidomo dups ، والتي يتباهى أصحابها بـ "النقاء الوطني" و "Svidomo". إن اكتشافات الأصنام يمكن أن تجعل الشخص يرتد ويغير رأيه.

سيكون من المثير للاهتمام معرفة الحياة المزدوجة لقادة "المجلس" الذين نصبوا أنفسهم ، بالإضافة إلى الشخصيات الخسيسة الأخرى ، التي ترزح تحت عبء "ضمير الأمة" الذي تم تحمله على عاتقها بشكل تعسفي.

إذن ، تحت مؤخرته الشخصية ستنفجر "القنبلة" الأرشيفية الأولى؟ من سيذهب مع "القاطرة" لفك سلسلة طويلة من الوحي؟


* يوجد إصداران من 42.zip: الإصدار القديم 42،374 بايت ، والإصدار الأحدث 42،838 بايت. الفرق هو أن كلمة المرور الجديدة تتطلب كلمة مرور قبل التفريغ. نحن نقارن فقط مع النسخة القديمة. هذه نسخة من الملف إذا احتجت إليها: 42.zip.

يجب أن تتغلب القنابل المضغوطة على حقيقة أن خوارزمية ضغط DEFLATE التي يدعمها الموزعون بشكل شائع لا يمكن أن تتجاوز نسبة ضغط من 1032 إلى 1. لهذا السبب ، تعتمد القنابل المضغوطة عادةً على فك الضغط المتكرر عن طريق دمج ملفات مضغوطة داخل ملفات مضغوطة للحصول على نسبة إضافية 1032 مع كل طبقة. لكن الحيلة تعمل فقط في التطبيقات التي تفك حزمها بشكل متكرر ، ومعظمها لا يعمل. تتسع قنبلة 42.zip الأكثر شهرة إلى 4.5 بيتا بايت هائلة عندما يتم فك ضغط الطبقات الست بشكل متكرر ، ولكن لديها 0.6 ميغا بايت على الطبقة العليا. تنتج ملفات Zip quines ، مثل تلك الموجودة في Cox و Ellingsen ، نسخة من نفسها وبالتالي تتوسع إلى أجل غير مسمى عند فك الضغط بشكل متكرر. لكنها أيضًا آمنة تمامًا عند تفريغها مرة واحدة.

توضح هذه المقالة كيفية إنشاء قنبلة مضغوطة غير متكررة تتجاوز نسبة ضغطها حد DEFLATE البالغ 1032. وهي تعمل عن طريق تداخل الملفات داخل حاوية مضغوطة للإشارة إلى "جوهر" البيانات المضغوطة بشدة في ملفات متعددة دون عمل نسخ متعددة. ينمو حجم إخراج قنبلة مضغوطة بشكل تربيعي من حجم الإدخال ؛ أي أن نسبة الضغط تتحسن مع زيادة حجم القنبلة. يعتمد التصميم على ميزات zip و DEFLATE: فهو غير قابل للنقل مباشرة إلى تنسيقات ملفات أخرى أو خوارزميات ضغط. القنبلة متوافقة مع معظم موزعي zip ، باستثناء موزعي "التدفق" ، الذي يحلل الملفات في مسار واحد دون التحقق من الدليل المركزي للملف المضغوط. نحاول تحقيق التوازن بين هدفين متعارضين:

  • زيادة نسبة الضغط. نحدد نسبة الضغط على أنها مجموع أحجام جميع الملفات في الأرشيف مقسومًا على حجم الملف المضغوط نفسه. هذا لا يشمل أسماء الملفات أو بيانات تعريف نظام الملفات الأخرى ، المحتوى فقط.
  • الحفاظ على التوافق. يعد تنسيق Zip تنسيقًا معقدًا ويختلف المحللون ، خاصة في حالات الحافة والميزات الإضافية. لا تستخدم الحيل التي تعمل فقط مع موزعين معينين. سنلاحظ بعض الطرق لتحسين فعالية القنبلة المضغوطة مع فقد معين في التوافق.

هيكل ملف مضغوط

يتكون ملف مضغوط من الدليل المركزيروابط ل الملفات.

الدليل المركزي في نهاية الملف المضغوط. هذه هي القائمة رؤوس الدليل المركزي. يحتوي كل رأس دليل مركزي على بيانات وصفية لملف واحد ، مثل اسم الملف ومجموع اختباري CRC-32 ومؤشر خلفي لرأس الملف المحلي. يبلغ طول رأس الدليل المركزي 46 بايت بالإضافة إلى طول اسم الملف.

يتكون الملف من رأس ملف محلي متبوعًا ببيانات الملف المضغوط. طول رأس الملف المحلي 30 بايت بالإضافة إلى طول اسم الملف. يحتوي على نسخة مكررة من البيانات الوصفية من رأس الدليل المركزي ، وأحجام ملفات البيانات المضغوطة وغير المضغوطة خلفها. Zip هو تنسيق حاوية ، وليس خوارزمية ضغط. يتم ضغط بيانات كل ملف باستخدام الخوارزمية المحددة في البيانات الوصفية ، وعادةً ما تكون DEFLATE.

هذا الوصف للتنسيق المضغوط يغفل العديد من التفاصيل غير الضرورية لفهم القنبلة المضغوطة. راجع القسم 4.3 APPNOTE.TXT أو "هيكل ملف PKZip" الخاص بـ Florian Buchholz للحصول على تفاصيل كاملة ، أو راجع.

يتيح التكرار الكبير والعديد من أوجه الغموض في تنسيق zip فرصًا للإيذاء بجميع أنواعه. القنبلة المضغوطة هي مجرد غيض من فيض. روابط لمزيد من القراءة:

$ python3 -m zipfile -e interap.zip. Traceback (آخر مكالمة أخيرة): ... __main __. BadZipFile: اسم الملف في الدليل "B" والرأس b "A" يختلفان.
بعد ذلك ، سننظر في كيفية تعديل البنية لاتساق اسم الملف مع الاحتفاظ بمعظم مزايا الملفات المتداخلة.

الاكتشاف الثاني: اقتباس رؤوس الملفات المحلية

نحتاج إلى فصل رؤوس الملفات المحلية لكل ملف ، مع الاستمرار في إعادة استخدام نواة واحدة. ببساطة ، لا ينجح ربط جميع الرؤوس ، لأن محلل zip سيجد رأس الملف المحلي حيث يتوقع أن يبدأ دفق DEFLATE. لكن الفكرة ستنجح ، مع بعض التغييرات. سنستخدم وظيفة DEFLATE للكتل غير المضغوطة "لاقتباس" رؤوس الملفات المحلية بحيث تبدو وكأنها جزء من دفق DEFLATE نفسه الذي ينتهي في النواة. سيتم تفسير كل رأس ملف محلي (باستثناء الأول) بطريقتين: كرمز (جزء من بنية الملف المضغوط) وكبيانات (جزء من محتوى الملف).

دفق DEFLATE عبارة عن سلسلة من الكتل ، حيث يمكن ضغط كل كتلة أو فك ضغطها. عادة ما نفكر فقط في الكتل المضغوطة ، على سبيل المثال ، النواة هي كتلة واحدة مضغوطة كبيرة. ولكن هناك أيضًا عناصر غير مضغوطة تبدأ برأس 5 بايت بحقل طول ، وهو ما يعني ببساطة: "اطبع ما يلي نبايت حرفيا. لا يعني فك ضغط كتلة غير مضغوطة سوى إزالة الرأس المكون من 5 بايت. يمكن خلط الكتل المضغوطة وغير المضغوطة بحرية في تيار DEFLATE. الإخراج عبارة عن سلسلة من نتائج تفريغ جميع الكتل بالترتيب. المصطلح "غير مضغوط" مناسب فقط على مستوى DEFLATE ؛ لا تزال بيانات الملف تعتبر "مضغوطة" على مستوى zip ، بغض النظر عن الكتل المستخدمة.

أسهل طريقة للتفكير في هذا البناء هو التداخل الداخلي ، من الملف الأخير إلى الأول. نبدأ بإدخال نواة تشكل نهاية ملف البيانات لكل ملف. إضافة رأس ملف LFH محلي نوعنوان الدليل المركزي CDH نالذي يشير إليه. قم بتعيين حقل البيانات الوصفية بالحجم المضغوط إلى LFH نو CDH نعلى الحجم المضغوط للنواة. نضيف الآن رأس كتلة غير مضغوط من 5 بايت (باللون الأخضر في الرسم التخطيطي) ، حيث يساوي حقل الطول حجم LFH ن. إضافة رأس ملف LFH محلي ثاني ن−1 ورأس الدليل المركزي CDH ن−1 الذي يشير إليه. قم بتعيين حقل بيانات التعريف "للحجم المضغوط" كرأس حجم مضغوط جديد لـ kernel زيادةحجم رأس الكتلة غير المضغوطة (5 بايت) زيادةحجم LFH ن .

في الوقت الحالي ، يحتوي الملف المضغوط على ملفين باسم Y و Z. دعنا نتعرف على ما سيراه المحلل اللغوي عند التحليل. افترض أن حجم النواة المضغوطة هو 1000 بايت وأن حجم LFH هو ن- 31 بايت. بدءا من CDH ن−1 واتبع المؤشر إلى LFH ن-1. اسم الملف الأول هو Y ، والحجم المضغوط لملف البيانات الخاص به هو 1036 بايت. عند تفسير الـ 1036 بايت التالية كتدفق DEFLATE ، نواجه أولاً رأس كتلة غير مضغوط بحجم 5 بايت ، والذي ينص على نسخ الـ 31 بايت التالية. اكتب الـ 31 بايت التالية ، وهي LFH ن، والتي نقوم بفك ضغطها وإضافتها إلى الملف Y. بالانتقال إلى دفق DEFLATE ، نجد الكتلة المضغوطة (kernel) ، والتي نقوم بفك ضغطها في الملف Y. الآن وصلنا إلى نهاية البيانات المضغوطة وانتهينا من الملف Y.

بالانتقال إلى الملف التالي ، نتبع المؤشر من CDH نإلى LFH نوالعثور على ملف باسم Z ، حجمه المضغوط 1000 بايت. بتفسير هذه الـ 1000 بايت على أنها دفق DEFLATE ، نواجه على الفور الكتلة المضغوطة (kernel مرة أخرى) ونفك ضغطها في ملف Z. لقد وصلنا الآن إلى نهاية الملف النهائي وقد انتهينا. يحتوي ملف الإخراج Z على النواة غير المضغوطة ؛ ملف الإخراج Y هو نفسه ، ولكن بالإضافة إلى ذلك مسبوق بـ 31 بايت LFH ن .

نكمل البناء من خلال تكرار إجراء الاقتباس حتى يحتوي أرشيف zip على العدد المطلوب من الملفات. يضيف كل ملف جديد رأس دليل مركزي ، ورأس ملف محلي ، وكتلة غير مضغوطة لاقتباس رأس الملف المحلي التالي مباشرة. عادةً ما تكون بيانات الملف المضغوط عبارة عن سلسلة من كتل DEFLATE غير المضغوطة (تم الاستشهاد برؤوس الملفات المحلية) متبوعة بنواة مضغوطة. يساهم كل بايت في النواة بحوالي 1032 نلحجم الإخراج ، لأن كل بايت جزء من الكل نالملفات. تكون ملفات الإخراج أيضًا ذات أحجام مختلفة: الملفات الأقدم أكبر من تلك اللاحقة لأنها تقتبس من رؤوس الملفات المحلية أكثر. لا معنى لمحتويات ملفات الإخراج ، لكن لم يقل أحد ذلك.

يتميز بناء الاقتباس المتداخل هذا بتوافق أفضل من بنية التداخل الكاملة من القسم السابق ، لكن التوافق يأتي على حساب الضغط. هناك ، كان كل ملف مضاف يستحق رأس الدليل المركزي فقط ، وهنا يستحق رأس الدليل المركزي ، ورأس الملف المحلي ، و 5 بايت أخرى لرأس الاقتباس.

تحسين

بعد تلقي التصميم الأساسي للقنبلة المضغوطة ، سنحاول جعلها فعالة قدر الإمكان. نريد الإجابة على سؤالين:
  • ما هي أقصى نسبة ضغط لحجم ملف مضغوط معين؟
  • ما هو الحد الأقصى لنسبة الضغط بالنظر إلى قيود تنسيق zip؟

الضغط الأساسي

من المفيد لنا ضغط النواة قدر الإمكان ، لأن كل بايت غير معبأ يتم ضربه في ن. لهذا الغرض ، نستخدم ضاغط DEFLATE مخصصًا يسمى Bulk_deflate ، متخصص في ضغط سلسلة من البايتات المتكررة.

يقترب جميع أرشيفي DEFLATE اللائقين من نسبة ضغط تبلغ 1032 على دفق لا نهائي من البايتات المتكررة ، لكننا نهتم بالحجم المحدد. في حجم الأرشيف الخاص بنا ، يحتفظ Bul_deflate ببيانات أكثر من المحفوظات ذات الأغراض العامة: حوالي 26 كيلوبايت أكثر من zlib و Info-ZIP ، وحوالي 15 كيلوبايت أكثر من Zopfli ، مما يضحي بالسرعة من أجل جودة الضغط.

تكمن تكلفة نسبة الضغط العالية للنفخ السائبة في الافتقار إلى التنوع. يمكنه فقط ضغط سلاسل من البايتات المتكررة وطول معين فقط ، وهو 517 + 258 كلعدد صحيح ك≥ 0. بالإضافة إلى الضغط الجيد ، فإن الكتلة_التضخمية سريعة ، حيث تقوم بالعمل في نفس الوقت تقريبًا بغض النظر عن حجم بيانات الإدخال ، بصرف النظر عن عمل كتابة السلسلة المضغوطة بالفعل.

أسماء الملفات

لأغراضنا ، تعتبر أسماء الملفات ثقيلة عمليا. على الرغم من أنها تساهم في حجم الإخراج من خلال كونها جزءًا من رؤوس الملفات المحلية المقتبسة ، فإن البايت في اسم الملف يساهم بشكل أقل بكثير من البايت في النواة. نريد أن تكون أسماء الملفات قصيرة قدر الإمكان ، ولكن مختلفة ، مع مراعاة التوافق.

كل بايت يتم إنفاقه على اسم ملف يعني 2 بايت لم يتم إنفاقها على kernel (اثنان ، لأن كل اسم ملف يظهر مرتين: في رأس الدليل المركزي وفي رأس الملف المحلي). ينتج عن بايت اسم الملف فقط ( ن+ 1) / 4 بايت من الإخراج ، بينما يتم احتساب البايت في النواة على أنه 1032 ن. أمثلة: ، ، .

أول اعتبار للتوافق هو الترميز. تنص مواصفات تنسيق zip على أنه يجب تفسير أسماء الملفات على أنها CP 437 أو UTF-8 إذا تم تعيين بت علم معين (APPNOTE.TXT ، الملحق D). هذه هي النقطة الرئيسية لعدم التوافق بين موزعي zip ، والتي يمكنها تفسير أسماء الملفات في بعض الترميز الثابت أو المحدد المحلي. لذلك ، من أجل التوافق ، من الأفضل أن تقتصر على الأحرف بنفس التشفير في كل من CP 437 و UTF-8. وهي 95 حرفًا من أحرف US-ASCII قابلة للطباعة.

نحن ملتزمون أيضًا بقيود تسمية نظام الملفات. بعض أنظمة الملفات غير حساسة لحالة الأحرف ، لذلك لا يتم اعتبار الحرفين "أ" و "أ" اسمين مختلفين. لا تسمح أنظمة الملفات الشائعة مثل FAT32 بأحرف معينة مثل "*" و "؟".

كحل وسط آمن ، ولكن ليس بالضرورة الحل الأمثل ، ستستخدم قنبلة zip الخاصة بنا أسماء ملفات من أبجدية مكونة من 36 حرفًا لا تتضمن أحرفًا خاصة أو مختلطة:

0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
يتم إنشاء أسماء الملفات بالطريقة الواضحة ، جميع المواضع بدورها ، مع إضافة الموضع في نهاية الحلقة:

"0" ، "1" ، "2" ، ... ، "Z" ، "00" ، "01" ، "02" ، ... ، "0Z" ، ... ، "Z0" ، "Z1" ، "Z2" ، ... ، "ZZ" ، "000" ، "001" ، "002" ، ...
هناك 36 اسمًا للملف يبلغ طولها حرفًا واحدًا ، و 362 اسمًا مكونًا من حرفين ، وهكذا. أربعة بايت كافية لـ 1727604 اسم ملف مميز.

بالنظر إلى أن أسماء الملفات في الأرشيف عادة ما يكون لها أطوال مختلفة ، فما هي أفضل طريقة لترتيبها: من الأقصر إلى الأطول ، أو العكس؟ إذا فكرت في الأمر قليلاً ، فمن الأفضل وضع الأسماء الأطول أخيرًا. يضيف هذا الفرز أكثر من 900 ميجابايت من الإخراج إلى zblg.zip ، مقارنةً بالطلب الأطول إلى الأقصر. ومع ذلك ، يعد هذا تحسينًا بسيطًا ، لأن 900 ميجابايت تمثل 0.0003٪ فقط من إجمالي حجم الإصدار.

حجم النواة

تسمح لك بنية الاقتباس المتداخلة بوضع نواة بيانات مضغوطة ثم نسخها مرارًا وتكرارًا بثمن بخس. للحصول على حجم ملف مضغوط معين X، ما هي المساحة المثالية لتخزين النواة ، وكم المساحة اللازمة لإنشاء النسخ؟

للعثور على التوازن الأمثل ، تحتاج إلى تحسين متغير واحد فقط ن، هو عدد الملفات في الأرشيف المضغوط. كل قيمة نيتطلب قدرًا معينًا من الحمل لرؤوس الدليل المركزي ورؤوس الملفات المحلية ورؤوس الكتل المقتبسة وأسماء الملفات. سيشغل القلب باقي المساحة. بسبب ال نيجب أن يكون عددًا صحيحًا ، ويمكنك فقط احتواء عدد معين من الملفات قبل أن ينخفض ​​الحجم الأساسي إلى الصفر ، فقط تحقق من كل قيمة ممكنة نواختر الشخص الذي يمنحك أكبر قدر من المخرجات.

تطبيق إجراء التحسين على X= 42374 لـ 42.zip يجد الحد الأقصى عند ن= 250. هذه الملفات الـ 250 تتطلب 21195 بايت من الحمل ، مما يترك 21179 بايت للنواة. نواة بهذا الحجم تتفكك إلى 21،841،249 بايت (نسبة 1031.3 إلى 1). تعطي 250 نسخة من النواة غير المضغوطة بالإضافة إلى بعض رؤوس الملفات المحلية المقتبسة إجمالي إخراج غير مضغوط يبلغ 5،461،307،620 بايت ونسبة ضغط تبلغ 129،000.

يمكن نمذجة CRC-32 كجهاز حالة يقوم بتحديث سجل حالة 32 بت لكل بت إدخال. عمليات التحديث الأساسية للبتين 0 و 1 هي:

Uint32 crc32_update_0 (uint32 state) (// قم بإخراج أقل البتات أهمية. bit b = state & 1؛ state = state >> 1؛ // إذا كان البت الذي تم إزاحته للخارج هو 1 ، XOR مع ثابت CRC-32. (b == 1) state = state ^ 0xedb88320 ؛ حالة الإرجاع ؛) uint32 crc32_update_1 (حالة uint32) (// افعل مثل 0 بت ، ثم XOR مع ثابت CRC-32. إرجاع crc32_update_0 (حالة) ^ 0xedb88320 ؛)
إذا قمت بتمثيل سجل الحالة كمتجه ثنائي مكون من 32 عنصرًا واستخدمت XOR للجمع والضرب ، فإن crc32_update_0 هو مخطط خطي ؛ على سبيل المثال ، يمكن تمثيله كضرب بواسطة مصفوفة انتقال ثنائية 32 × 32. لمعرفة السبب ، لاحظ أن ضرب مصفوفة في متجه هو ببساطة جمع أعمدة المصفوفة بعد ضرب كل عمود في العنصر المقابل في المتجه. حالة عملية التحول >> 1 تأخذ كل بت أنامتجه الحالة ويضربه في متجه يساوي صفرًا في كل مكان باستثناء بعض الشيء أنا- 1 (ترقيم بت من اليمين إلى اليسار). بشكل نسبي ، تحدث حالة XOR النهائية ^ 0xedb88320 فقط عندما تكون البتة b مساوية لواحد. يمكن اعتبار هذا أولاً ضرب b بـ 0xedb88320 ثم XORing في تلك الحالة.

أيضًا ، crc32_update_1 هو مجرد crc32_update_0 بالإضافة إلى ثابت (XOR). هذا يجعل crc32_update_1 تحويلًا أفينيًا: ضرب مصفوفة متبوعًا بتعيين (أي إضافة متجه). يمكننا تمثيل ضرب المصفوفة ورسم الخرائط في خطوة واحدة إذا قمنا بزيادة أبعاد مصفوفة التحويل إلى 33 × 33 وإضافة عنصر إضافي إلى متجه الحالة ، والذي يكون دائمًا 1 (يسمى هذا التمثيل بالإحداثيات المتجانسة).


مصفوفتا التحويل 33 × 33 M 0 و M 1 ، اللتان تحسبان تغيير حالة CRC-32 الذي يتم إجراؤه بواسطة البتتين 0 و 1 ، على التوالي. يتم تخزين متجهات العمود مع البت الأكثر أهمية في الأسفل: قراءة العمود الأول من الأسفل إلى الأعلى ، ترى ثابت متعدد الحدود CRC-32 edb8832016 = 111 011 011 0111 0001 0000011 001 00000 2. تختلف المصفوفتان فقط في العمود الأخير ، والذي يمثل متجه الترجمة في الإحداثيات المتجانسة. في M 0 ، تكون الترجمة صفرًا ، وفي M 1 تكون edb88320 16 ، وهو ثابت متعدد الحدود CRC-32. تمثل تلك الموجودة فوق القطر مباشرةً حالة حالة العملية >> 1

يمكن تمثيل كلتا العمليتين crc32_update_0 و crc32_update_1 بمصفوفة انتقال 33 × 33. تظهر المصفوفات M 0 و M 1. ميزة تمثيل المصفوفة هي أنه يمكن مضاعفة المصفوفات. لنفترض أننا نريد أن نرى تغيير الحالة الذي تم إجراؤه من خلال معالجة حرف ASCII "a" ، والذي يكون تمثيله الثنائي 01100001 2. يمكننا تمثيل التغيير التراكمي لحالة CRC-32 لهذه البتات الثمانية في مصفوفة تحويل واحدة:


ويمكننا تمثيل تغيير حالة سلسلة متكررة من "a" بضرب العديد من نسخ M a - رفع المصفوفة إلى أس. يمكننا القيام بذلك بسرعة باستخدام خوارزمية الأُس السريعة ، التي تحسب M n في خطوات تسجيل 2 n فقط. على سبيل المثال ، إليك مصفوفة تغيير الحالة لصف مكون من 9 أحرف "أ":
تعد خوارزمية ضرب المصفوفة السريعة مفيدة في حساب M kernel ، وهي مصفوفة لنواة غير مضغوطة ، لأن النواة عبارة عن سلسلة من البايتات المتكررة. للحصول على المجموع الاختباري CRC-32 من مصفوفة ، اضرب المصفوفة في المتجه الصفري (يكون المتجه الفارغ في إحداثيات متجانسة ، أي 32 صفراً متبوعًا بواحد ؛ هنا نحذف المضاعفات البسيطة للمعالجة المسبقة واللاحقة للمجموع الاختباري من أجل الاتساق). لحساب المجموع الاختباري لكل ملف ، نعمل بشكل عكسي. بدءا من التهيئة M: = M نواة. المجموع الاختباري للنواة هو أيضًا المجموع الاختباري النهائي للملف ن، لذلك نضرب مإلى المتجه الصفري وتخزين المجموع الاختباري الناتج في CDH N و LFH N. بيانات الملف N − 1نفس بيانات الملف ن، ولكن مع إضافة البادئة LFH N. لذلك ، نحسب مصفوفة انتقال الحالة لـ LFH N والتحديث. حاليا ميمثل التغيير التراكمي للحالة من معالجة LFH N خلف النواة. احسب المجموع الاختباري لملف N − 1، تتضاعف مرة أخرى مإلى المتجه الفارغ. نواصل الإجراء من خلال تجميع مصفوفات تغيير الحالة في محتى تتم معالجة جميع الملفات.

الامتداد: Zip64

واجهنا سابقًا مشكلة توسع بسبب قيود تنسيق zip - كان من المستحيل إعطاء أكثر من 281 تيرابايت ، بغض النظر عن مدى ذكاء ملف zip. من الممكن التغلب على هذه القيود باستخدام Zip64 ، وهو امتداد للتنسيق المضغوط الذي يزيد من حجم بعض حقول الرأس إلى 64 بت. دعم Zip64 ليس عالميًا بأي حال من الأحوال ، ولكنه أحد أكثر الامتدادات شيوعًا. من حيث نسبة الضغط ، فإن تأثير Zip64 هو زيادة حجم رأس الدليل المركزي من 46 إلى 58 بايت ، وحجم رأس الدليل المحلي من 30 إلى 50 بايت. بالنظر إلى الصيغة الخاصة بعامل التوسع الأمثل في النموذج المبسط ، يمكننا أن نرى أن القنبلة Zip64 zip لا تزال تنمو بشكل تربيعي ، ولكنها أبطأ بسبب المقام الأكبر - يمكن ملاحظة ذلك في الرسم التخطيطي أدناه. نظرًا لفقدان التوافق والنمو البطيء ، تتم إزالة أي قيود تقريبًا على حجم الملف منا.

لنفترض أننا نريد قنبلة مضغوطة تتسع إلى 4.5 بيتابايت مثل 42.zip. ما هو الحجم الذي يجب أن يكون عليه الأرشيف؟ من خلال البحث الثنائي ، نجد أن الحد الأدنى لحجم مثل هذا الملف هو 46 ميجا بايت.

  • zbxl.zip 46 ميجابايت → 4.5 PB (Zip64 ، أقل توافقًا)
zipbomb --mode = quot_overlap --num-files = 190023 - حجم مضغوط = 22982788 --zip64> zbxl.zip
4.5 بيتابايت - تم تسجيل نفس القدر من البيانات بواسطة Event Horizon Telescope للصورة الأولى للثقب الأسود: رفوف ورفوف مع محركات أقراص صلبة في مركز البيانات.

مع Zip64 ، لم يعد من المثير للاهتمام التفكير في الحد الأقصى لنسبة الضغط ، لأنه يمكننا فقط الاستمرار في زيادة حجم الملف المضغوط ونسبة الضغط معه ، حتى يصبح الملف المضغوط المضغوط كبيرًا بشكل مانع. ومع ذلك ، فإن العتبة المثيرة للاهتمام هي 264 بايت (18 EB أو 16 EiB) - لن تتناسب هذه الكمية الكبيرة من البيانات مع معظم أنظمة الملفات. يعثر البحث الثنائي على أصغر قنبلة مضغوطة تنتج على الأقل هذا القدر من المخرجات: تحتوي على 12 مليون ملف ونواة مضغوطة 1.5 جيجابايت. الحجم الإجمالي للملف المضغوط هو 2.9 جيجا بايت ويتم فك ضغطه إلى 264 + 11727895877 بايت مع نسبة ضغط تزيد عن 6.2 مليار إلى واحد. لم أنشر هذا الملف للتنزيل ، ولكن يمكنك إنشاؤه بنفسك باستخدام. يحتوي على ملفات بهذا الحجم حتى أنه تم الكشف عن خطأ في Info-ZIP UnZip 6.0.

Zipbomb --mode = quot_overlap --num-files = 12056313 - حجم مضغوط = 1482284040 --zip64> zbxxl.zip

الامتداد: bzip2

DEFLATE هي خوارزمية الضغط الأكثر شيوعًا لتنسيق zip ، ولكنها واحدة فقط من العديد من الخيارات. ربما تكون ثاني أكثر الخوارزمية شيوعًا هي bzip2. على الرغم من أنها ليست متوافقة مثل DEFLATE. نظريًا ، تتمتع bzip2 بنسبة ضغط قصوى تبلغ حوالي 1.4 مليون إلى واحد ، مما يسمح بتعبئة النواة بشكل أكثر إحكامًا.

يقوم Bzip2 أولاً بتشفير طول المدى ، مما يقلل من طول سلسلة من البايتات المتكررة بمعامل 51. ثم يتم تقسيم البيانات إلى كتل تبلغ 900 كيلو بايت ويتم ضغط كل كتلة على حدة. من الناحية النظرية ، يمكن ضغط كتلة واحدة حتى 32 بايت. 900000 × 51/32 = 1434375.

بغض النظر عن خسائر التوافق ، هل تسمح bzip2 بقنبلة أكثر كفاءة؟

نعم - ولكن فقط للملفات الصغيرة. تكمن المشكلة في أن bzip2 لا يحتوي على أي شيء مثل كتل DEFLATE غير المضغوطة التي استخدمناها لاقتباس رؤوس الملفات المحلية. وبالتالي ، لا يمكن تداخل الملفات وإعادة استخدام النواة - يجب أن يكتب كل ملف نسخته الخاصة ، وبالتالي فإن نسبة الضغط الإجمالية لن تكون أفضل من النسبة لأي ملف فردي. في الرسم البياني أدناه ، يمكننا أن نرى أنه بدون تداخل ، يتفوق bzip2 على DEFLATE فقط للملفات التي يبلغ حجمها حوالي ميغا بايت.

الأمل الوحيد المتبقي هو وسيلة بديلة للاقتباس من رؤوس bzip2 ، والتي ستتم مناقشتها في القسم التالي. أيضًا ، إذا كنت تعلم أن محلل مضغوط معين يدعم bzip2 ويسمح بعدم تطابق اسم الملف ، يمكنك استخدام بنية تجاوز كاملة لا تحتاج إلى الاقتباس.

مقارنة نسبة الضغط لقنابل مضغوطة مختلفة. لاحظ المحاور اللوغاريتمية. يتم عرض كل بناء مع وبدون Zip64. الهياكل غير المتراكبة لها معدل نمو خطي ، يمكن رؤيته من خلال النسبة الثابتة للمحاور. تعني الإزاحة الرأسية للرسم البياني bzip2 أن نسبة ضغط bzip2 أكبر بنحو ألف مرة من DEFLATE. تمتلك تركيبات DEFLATE المقتبسة معدل نمو تربيعي ، كما يتضح من انحراف 2: 1. يعتبر متغير Zip64 أقل كفاءة قليلاً ، لكنه يسمح بأكثر من 281 تيرابايت. الرسوم البيانية لـ bzip2 مع الاقتباس من خلال تغيير حقل إضافي من تربيعي إلى خطي عند الوصول إما إلى الحد الأقصى لحجم الملف (2 32 −2 بايت) أو الحد الأقصى المسموح به لعدد الملفات

ملحق: نقلا عن طريق حقل إضافي

حتى الآن كنا نستخدم وظيفة DEFLATE لاقتباس رؤوس الملفات المحلية ، وقد رأينا للتو أن هذه الحيلة لا تعمل في bzip2. ومع ذلك ، هناك طريقة بديلة للاقتباس ، محدودة إلى حد ما ، تستخدم وظائف تنسيق zip فقط ولا تعتمد على خوارزمية الضغط.

في نهاية هيكل رأس الملف المحلي هناك مجال إضافيمتغير الطول لتخزين المعلومات التي لا تتناسب مع حقول الرأس العادية (APPNOTE.TXT ، القسم 4.3.7). قد تتضمن المعلومات الإضافية ، على سبيل المثال ، طابع زمني أو Unix uid / gid. يتم أيضًا تخزين معلومات Zip64 في حقل إضافي. يتم تمثيل الحقل الإضافي كهيكل طول-قيمة ؛ إذا قمت بزيادة الطول دون إضافة قيمة ، فسيتضمن الحقل الإضافي ما وراءه في الملف المضغوط ، أي رأس الملف المحلي التالي. باستخدام هذه الطريقة ، يمكن لكل رأس ملف محلي "اقتباس" الرؤوس التالية عن طريق التفافها في حقل اختياري خاص به. بالمقارنة مع DEFLATE ، هناك ثلاث مزايا هنا:

  1. يتطلب الاقتباس عبر حقل إضافي 4 بايت فقط بدلاً من 5 ، مما يترك مساحة أكبر للنواة.
  2. لا يزيد حجم الملفات ، مما يعني نواة أكبر ، نظرًا لقيود تنسيق zip.
  3. يوفر اقتباس bzip2.
على الرغم من هذه المزايا ، فإن الاقتباس من خلال الحقول الإضافية أقل مرونة. هذه ليست سلسلة ، كما هو الحال في DEFLATE: يجب ألا يحتوي كل رأس ملف محلي على الرأس التالي مباشرةً فحسب ، بل يجب أن يحتوي أيضًا الكلالعناوين اللاحقة. تزداد الحقول الإضافية كلما اقتربت من بداية الملف المضغوط. نظرًا لأن الحد الأقصى لطول الحقل 2 هو 16 بايت ، يمكنك اقتباس ما يصل إلى 1808 من رؤوس الملفات المحلية (أو 1170 في Zip64) بافتراض أسماء (في حالة DEFLATE ، يمكنك استخدام حقل إضافي للاقتباس الأول (الأقصر) رؤوس الملفات المحلية ، ثم قم بالتبديل إلى الاقتباس DEFLATE لبقية). هناك مشكلة أخرى وهي أنه لمطابقة بنية البيانات الداخلية للحقل الإضافي ، يجب تحديد علامة 16 بت للنوع (APPNOTE.TXT ، القسم 4.5.2) قبل بيانات الاقتباس. نريد اختيار علامة نوع تجعل المحللين يتجاهلون البيانات المقتبسة بدلاً من محاولة تفسيرها على أنها بيانات وصفية ذات مغزى. يجب أن يتجاهل محللو Zip العلامات ذات النوع غير المعروف ، حتى نتمكن من اختيار العلامات عشوائيًا ، ولكن هناك خطر من أن بعض العلامات ستؤدي إلى تعطيل توافق التصميم في المستقبل.

يوضح الرسم البياني السابق إمكانية استخدام حقول إضافية في bzip2 ، مع وبدون Zip64. كلا الرسمين البيانيين لهما نقطة توقف حيث ينتقل النمو من تربيعي إلى خطي. بدون Zip64 ، يحدث هذا عند الوصول إلى الحد الأقصى لحجم الملف غير المضغوط (2 32 −2 بايت) ؛ عندها يمكن فقط زيادة عدد الملفات وليس حجمها. ينتهي الرسم البياني تمامًا عندما يصل عدد الملفات إلى 1809 ، وعند هذه النقطة نفد المساحة في الحقل الإضافي لاقتباس عناوين إضافية. مع Zip64 ، يحدث الفاصل في 1171 ملفًا ، وبعد ذلك يمكن زيادة حجم الملفات فقط ، وليس عدد الملفات. يساعد الحقل الإضافي في DEFLATE أيضًا ، لكن الفرق صغير جدًا بحيث لا يمكن ملاحظته بصريًا. يزيد من نسبة ضغط zbsm.zip بنسبة 1.2٪ ؛ zblg.zip بنسبة 0.019٪ ؛ و zbxl.zip بنسبة 0.0025٪.

مناقشة

في عملهم حول هذا الموضوع ، استخدم Pletz وزملاؤه ملف التداخل لإنشاء أرشيف مضغوط ذاتي النسخ تقريبًا. تم اقتراح تداخل الملفات مسبقًا (الشريحة 47) بواسطة Ginvael Coldwind.

لقد صممنا قنبلة مضغوطة متداخلة مع الاقتباس مع وضع التوافق في الاعتبار ، مع مراعاة عدد من اختلافات التنفيذ ، بعضها معروض في الجدول أدناه. البناء الناتج متوافق مع محللات zip ، التي تعمل بالطريقة المعتادة ، أي بالتحقق أولاً من الدليل المركزي واستخدامه كفهرس ملف. من بينها المحلل اللغوي الفريد من نوع zip من Nail ، والذي يتم إنشاؤه تلقائيًا من القواعد النحوية الرسمية. ومع ذلك ، فإن التصميم غير متوافق مع محللات "الدفق" ، التي تحلل ملفًا مضغوطًا من طرف إلى طرف في مسار واحد دون قراءة الدليل المركزي أولاً. بطبيعتها ، لا تسمح موزعات الدفق بتداخلات الملفات من أي نوع. على الأرجح سيقومون باستخراج الملف الأول فقط. بالإضافة إلى ذلك ، قد يخطئون ، كما هو الحال مع

يذكر المقال 9 طبقات من الملفات المضغوطة ، لذا فهي ليست مجرد مجموعة من الأصفار. لماذا 9 ، لماذا 10 ملفات في كل منها؟

أولاً ، تشير مقالة Wikipedia حاليًا إلى 5 طبقات من 16 ملفًا. لست متأكدًا من مكان حدوث التناقض ، لكن هذا ليس كل ما في الأمر. السؤال الحقيقي هو لماذا استخدام التعشيش في المقام الأول.

DEFLATE ، طريقة الضغط الوحيدة المدعومة للملفات المضغوطة * ، لها نسبة ضغط قصوى تبلغ 1032. يمكن تحقيق ذلك بشكل مقارب لأي تسلسل متكرر من 1-3 بايت. بغض النظر عما تفعله بالملف المضغوط ، طالما أنه يُستخدم فقط مع DEFLATE ، فلن يزيد حجم الملف الذي تم فك ضغطه عن 1032 ضعف حجم الملف المضغوط الأصلي.

لذلك ، يجب استخدام ملفات zip المتداخلة لتحقيق نسب ضغط هائلة حقًا. إذا كان لديك طبقتان للضغط ، فإن النسبة القصوى هي 1032 ^ 2 = 1065024. بالنسبة إلى 3 ، تكون 1099104768 وهكذا. بالنسبة للطبقات الخمس المستخدمة في 42.zip ، فإن الحد الأقصى النظري لنسبة الضغط هو 1170572956434432. كما ترى ، الحجم الفعلي لـ 42.zip بعيد عن هذا المستوى. جزء من ذلك هو حمل تنسيق zip ، وجزء منه هو أنهم لا يهتمون.

إذا كان عليّ أن أخمن ، فسأقول أن 42.zip تم تشكيله عن طريق إنشاء ملف فارغ كبير ونسخه ونسخه عدة مرات. لا توجد طريقة لدفع حدود التنسيق أو زيادة الضغط أو أي شيء - لقد اختاروا عشوائيًا 16 نسخة لكل طبقة. كان الهدف هو إنشاء حمولة كبيرة دون بذل الكثير من الجهد.

ملحوظة. توفر تنسيقات الضغط الأخرى ، مثل bzip2 ، نسب ضغط قصوى أعلى بكثير جدًا. ومع ذلك ، فإن معظم موزعي ملفات zip لا يقبلونها.

ملاحظة. من الممكن إنشاء ملف مضغوط يقوم بفك ضغط نسخة منه (quine). يمكنك أيضًا عمل نسخة تفك حزم نسخ متعددة. لذلك إذا قمت بفك ضغط ملف بشكل متكرر إلى الأبد ، فإن الحد الأقصى للحجم الممكن لا نهائي. القيد الوحيد هو أنه يمكن الزيادة بمقدار 1032 فقط في كل تكرار.

P. تفترض القيمة 1032 أن بيانات الملف في الرمز المضغوط لا تتداخل. تتمثل إحدى ميزات تنسيق الملف المضغوط في أنه يحتوي على دليل مركزي يسرد الملفات الموجودة في الأرشيف وإزاحات بيانات الملف. إذا قمت بإنشاء إدخالات متعددة في ملفات تشير إلى نفس البيانات ، فيمكنك تحقيق نسب ضغط أعلى بكثير حتى بدون تداخل ، ولكن من المحتمل أن يرفض المحللون مثل هذا الملف المضغوط.

أخبر الأصدقاء