كيفية مقارنة الملفات الثنائية على نظام Linux

نشرت: 2022-08-20
كمبيوتر محمول Linux يعرض موجه bash
fatmawati achmad zaenuri / Shutterstock.com

كيف يمكنك التحقق مما إذا كان ثنائيان Linux متماثلان؟ إذا كانت ملفات قابلة للتنفيذ ، فقد تعني أي اختلافات سلوكًا غير مرغوب فيه أو ضارًا. إليك أسهل طريقة للتحقق مما إذا كانا مختلفين.

مقارنة الملفات الثنائية

Linux غني بطرق مقارنة الملفات النصية وتحليلها. سيقارن الأمر diff ملفين من أجلك ويسلط الضوء على الاختلافات. يمكنه حتى توفير بضعة أسطر على جانبي التغييرات لتوفير بعض السياق حول الخطوط المتغيرة. ويضيف الأمر colordiff لونًا لتسهيل تحليل الاختلافات بصريًا.

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

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

كيفية مقارنة ملفين نصيين في Linux Terminal
ذات صلة كيفية مقارنة ملفين نصيين في Linux Terminal

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

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

خوارزميات التجزئة الآمنة

خوارزمية التجزئة الآمنة هي خوارزمية قائمة على الرياضيات. يقوم بإنشاء قيمة 64 بت عن طريق مسح جميع البايتات في ملف وتطبيق تحويل رياضي عليها لتوليد قيمة التجزئة. في أي يوم ، سينتج نفس الملف دائمًا نفس التجزئة. حتى الاختلاف أحادي البايت سينتج عنه تجزئة مختلفة جذريًا.

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

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

 ls -l * .so 

ملفان ثنائيان يظهران متشابهين

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

 sha256sum binary_file1.so
 sha256sum binary_file2.so 

إنشاء تجزئات للملفين الثنائيين

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

إيجاد الخلافات

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

إذا استخدمنا diff في الملفين الثنائيين ، فسنحصل على استجابة مخيبة بعض الشيء.

 فرق binary_file1.so binary_file2.so 

يعطي استخدام فرق مع ملفين ثنائيين القليل من المعلومات

كنا نعلم بالفعل أن الملفات كانت مختلفة. لنجرب cmp .

 cmp binary_file1.so binary_file2.so 

يعطي استخدام cmp مع ملفين ثنائيين معلومات أكثر قليلاً ، لكن ليس كثيرًا

هذا يخبرنا أكثر قليلاً. البايت الأول الذي يختلف بين الملفين هو رقم البايت 13451. أي أنه ، من بداية الملف الثنائي ، البايت 13451 يختلف في الملفين الثنائيين. إذن ، 13451 هو إزاحة الاختلاف الأول ، منذ بداية الملف.

فقط عن طريق الصدفة ، في جميع أنحاء الملف ، سيكون هناك بايت تحتوي على القيمة السداسية العشرية 0x10. هذه هي القيمة التي يستخدمها Linux في الملفات النصية كحرف نهاية السطر. صادف الأمر cmp 131 بايت بهذه القيمة بين بداية الملف الثنائي وموقع الاختلاف الأول. لذا فهو يعتقد أنه موجود على السطر 132. فهو في الحقيقة لا يعني أي شيء في هذا السياق.

إذا أضفنا الخيار -l (مطوّل) ، فسنبدأ في الحصول على معلومات مفيدة.

 cmp -l binary_file1.so binary_file2.so 

استخدام الخيار -l مع cmp لسرد البايتات المتغيرة

يتم سرد كافة وحدات البايت المختلفة. يتم عرض رقم البايت أو الإزاحة والقيمة من الملف الأول والقيمة من الملف الثاني ، مع بايت واحد لكل سطر إخراج.

تظهر قيم البايت بالنظام الثماني ، بدلاً من التنسيق السداسي العشري المعتاد المستخدم مع الملفات الثنائية. ومع ذلك ، فقد تعلمنا شيئًا آخر. جميع البايتات المتغيرة في تسلسل واحد مستمر. تتزايد إزاحاتهم بواحد لكل بايت.

ستقوم أداة hexdump بتفريغ ملف ثنائي في نافذة المحطة الطرفية. إذا استخدمنا الخيار -C (الكنسي) ، فسوف يسرد الإخراج في كل سطر الإزاحة ، وقيم 16 بايت في هذا الإزاحة ، و- إذا كان هناك واحد- تمثيل ASCII لقيم البايت.

 hexdump -C binary_file1.so 

الإخراج الأساسي hexdump لملف ثنائي

يمكننا استخدام الإخراج من hexdump كمدخل للخلاف ، مع ترك diff يعمل كما لو كان يقرأ ملفين diff .

 فرق <(hexdump binary_file1.so) <(hexdump binary_file2.so) 

استخدام diff و hexdump للحصول على الاختلافات بين ملفين

diff يجد الأسطر المختلفة ويظهر قيم البايت السداسي العشري من الملف الأول أعلى القيم من الملف الثاني. إزاحة السطر الأول هي 0x3480 ، أو 13440 في النظام العشري. في وقت سابق ، أخبرنا cmp أن التغيير الأول حدث عند البايت 13451 ، وهو 0x348B. هذا في الواقع يطابق ما نراه هنا.

الإخراج من diff في كتل ثنائية البايت. أول زوج من البايتات هو 0 و 1 من الإزاحة 0x3480 ، والكتلة الثانية تحمل البايتين 2 و 3 من الإزاحة. ستحتوي الكتلة 6 على البايتين 0xA و 0xB ، أو 10 و 11 في النظام العشري. هذان هما 13450 و 13451. ويمكننا أن نرى أنهما أول بايت يختلف. أول خمسة أزواج من البايت هي نفسها في كلا الملفين.

ومع ذلك ، نظرًا لأن diff يتم حسابه من الصفر الأساسي ، فإن ما تسميه cmp 13451 سيكون بايت 13540 diff . ولجعل الأمور أكثر إرباكًا ، يتم عكس ترتيب البايت في كل كتلة ثنائية البايت بواسطة diff . يتم سرد البايت بالفعل بهذا الترتيب: 1 و 0 و 3 و 2 و 5 و 4 و 7 و 6 وهكذا.

يعد الأمر أيضًا مكلفًا من الناحية الحسابية - اثنان من hexdumps diff في آن واحد - خاصةً إذا كانت الملفات التي تتم مقارنتها كبيرة.

ولكن إذا كان hexdump -C إرسال إصدار ASCII من الملف الثنائي إلى النافذة الطرفية ، فلماذا لا نعيد توجيه الإخراج إلى ملفات نصية ، ثم نقارن هذين الملفين النصيين مع diff ؟

 hexdump -C binary_file1.so> binary1.txt
 hexdump -C binary_file2.so> binary2.txt
 فرق binary1.txt binary2.txt 

إعادة توجيه hexdump لإنشاء ملفين نصيين واستخدام فرق لمقارنة الملفات النصية

يتم عرض الفرق بين الملفين في مقتطفين قصيرين. هناك تمثيل ASCII بجانبهم. سيكون هناك زوج من المقتطفات لكل اختلاف بين الملفات. في هذا المثال ، هناك اختلاف واحد فقط.

كل هذا جيد جدًا ، لكن ألن يكون رائعًا إذا كان هناك شيء فعل كل ذلك من أجلك؟

VBinDiff

يمكن تثبيت برنامج VBinDiff من المستودعات المعتادة لجميع التوزيعات الرئيسية. لتثبيته على Ubuntu ، استخدم هذا الأمر:

 sudo apt install vbindiff 

تثبيت VBinDiff على أوبونتو

في Fedora ، تحتاج إلى كتابة:

 sudo dnf تثبيت vbindiff 

تثبيت VBinDiff على Fedora

يحتاج مستخدمو Manjaro إلى استخدام pacman .

 sudo pacman -Sy vbindiff 

تثبيت VBinDiff على Fedora

لاستخدام البرنامج ، قم بتمرير اسم الملفين الثنائيين في سطر الأوامر.

 vbindiff binary_file1.so binary_file2.so 

تمرير ملفين ثنائيين إلى VBinDiff في سطر الأوامر

يفتح التطبيق المعتمد على المحطة ، ويعرض كلا الملفين في عرض التمرير.

يقوم VBinDiff بإبعاد ملفين ثنائيين

يمكنك استخدام عجلة التمرير بالماوس أو مفاتيح "UpArrow" و "DownArrow" و "Home" و "End" و "PageUp" و "PageDown" للتنقل عبر الملفات. سيتم تمرير كلا الملفين.

اضغط على مفتاح "Enter" للانتقال إلى الاختلاف الأول. يتم تمييز الاختلاف في كلا الملفين.

VBinDiff يبرز الاختلافات بين ملفين ثنائيين

إذا كان هناك المزيد من الاختلافات ، فإن الضغط على "Enter" سيعرض الاختلاف التالي. يؤدي الضغط على "q" أو "Esc" إلى الخروج من البرنامج.

ماهو الفرق؟

إذا كنت تعمل على جهاز كمبيوتر خاص بشخص آخر ولا يُسمح لك بتثبيت أي حزم ، فيمكنك استخدام cmp و diff و hexdump . إذا كنت بحاجة إلى التقاط الإخراج لمزيد من المعالجة ، فهذه هي الأدوات التي يجب استخدامها أيضًا.

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

ذات صلة: كيفية إلقاء نظرة خاطفة داخل الملفات الثنائية من سطر أوامر Linux