كيف يمكنك التحقق من تطابق ملفين ثنائيين في Linux؟ إذا كانا ملفين قابلين للتنفيذ، فإن أي اختلاف بينهما قد يشير إلى سلوك غير مرغوب فيه أو ضار. إليك أسهل طريقة للتحقق من تطابقهما.
مقارنة الملفات الثنائية
يحتوي Linux على العديد من الطرق لمقارنة وتحليل ملفات النصوص. diff
سيقوم الأمر بمقارنة ملفين لك، وإبراز الاختلافات. ويمكنه أيضًا توفير بضعة أسطر على جانبي التغييرات لتوفير بعض السياق حول الأسطر المتغيرة.
colordiff
يضيف الأمر لونًا لتسهيل تحليل الاختلافات بصريًا.
يستخدم المطورون والمؤلفون diff
لتسليط الضوء على الاختلافات بين الإصدارات المختلفة من ملفات أكواد مصدر البرنامج أو مسودات النصوص. إنها عملية سريعة وسهلة، ولا تحتاج إلى أي مهارات تقنية لرؤية الاختلافات بين سلاسل النصوص.
في عالم الملفات الثنائية، لا تكون الأمور بهذه البساطة. فالملفات الثنائية لا تتكون من نص عادي. بل تتكون من العديد من البايتات التي تحتوي على قيم رقمية. وإذا كان ملفًا مضغوطًا مثل أرشيف TAR أو ملف ZIP، فإن هذه القيم تمثل الملفات المضغوطة المخزنة داخل ملف الأرشيف، إلى جانب جداول الرموز المطلوبة لفك ضغط الملفات واستخراجها.
إذا كان الملف الثنائي عبارة عن ملف قابل للتنفيذ، يتم تفسير القيم الرقمية لبايتات الملف على أنها أشياء مثل تعليمات الكود الآلي لوحدة المعالجة المركزية، أو البيانات الوصفية، أو العلامات، أو البيانات المشفرة. من المرجح أن تؤدي التغييرات التي تطرأ على الملف الثنائي أو ملف المكتبة إلى اختلافات في السلوك عند تنفيذ الملف الثنائي أو استخدامه بواسطة تطبيق آخر.
من السهل تزوير تاريخ ووقت إنشاء أو تعديل ملف. وهذا يعني أنه قد يكون هناك نسختان من الملف لهما نفس الاسم وحجم الملف – إذا كانت التغييرات تحل محل المحتوى الحالي بايتًا تلو الآخر – وطوابع التاريخ. ومع ذلك، قد يكون أحد الملفات قد تم تغييره.
خوارزميات التجزئة الآمنة
أ خوارزمية التجزئة الآمنة هي خوارزمية تعتمد على الرياضيات. وهي تنشئ قيمة مكونة من 64 بتًا عن طريق مسح جميع البايتات في ملف وتطبيق تحويل رياضي عليها لتوليد قيمة التجزئة. وفي أي يوم، سينتج نفس الملف دائمًا نفس قيمة التجزئة. وحتى الاختلاف بمقدار بايت واحد سيؤدي إلى قيمة تجزئة مختلفة تمامًا.
غالبًا ما ترى تجزئة الملف معروضة على صفحة التنزيل الخاصة به. يجب عليك إنشاء تجزئة للملف بمجرد تنزيله. إذا كانت مختلفة عن التجزئة المعروضة على صفحة الويب، فأنت تعلم أن الملف معرض للخطر. إما أنه تم العبث به واستبداله بالملف الأصلي — لجعل الأشخاص يقومون بتنزيل الملف الملوث — أو أنه تعرض للتلف أثناء النقل.
على جهاز الكمبيوتر الذي نجري عليه الاختبار، لدينا نسختان من نفس الملف، مكتبة مشتركة. وقد تمت إعادة تسمية الملفات بحيث يمكن وضعها في نفس الدليل. من الناحية النظرية، يجب أن تكون هذه الملفات متماثلة. بعد كل شيء، من المفترض أن تكون نفس إصدار المكتبة المشتركة.
ls -l *.so
الملفات لها نفس الحجم ونفس طوابع التاريخ ونفس طوابع الوقت. بالنسبة للمراقب العادي، ستبدو وكأنها متشابهة. دعنا نستخدم sha256sum
الأمر وإنشاء تجزئة لكل ملف.
sha256sum binary_file1.so
sha256sum binary_file2.so
تختلف التجزئات تمامًا، مما يشير بوضوح إلى وجود اختلافات بين الملفين. إذا أظهر الموقع الإلكتروني التجزئات الخاصة بالملف الأصلي، فيمكنك تجاهل الملف الذي لا يتطابق.
العثور على الاختلافات
إذا كنت تريد إلقاء نظرة على التغييرات، فهناك طرق للقيام بذلك أيضًا. لست بحاجة إلى أن تكون قادرًا على فك تجميع الملف، ولا أن تفهم لغة التجميع أو كود الآلة فقط لرؤية التعديلات. إن فهم ما تعنيه هذه التغييرات، وما هو الغرض منها، بالطبع، يتطلب معرفة تقنية أعمق. ولكن مجرد معرفة مدى أهمية التغييرات يمكن أن يكون مؤشرًا على ما حدث للملف.
إذا استخدمنا diff
على الملفين الثنائيين، سنحصل على استجابة مخيبة للآمال بعض الشيء.
diff binary_file1.so binary_file2.so
لقد علمنا بالفعل أن الملفات مختلفة. دعنا نحاول cmp
.
cmp binary_file1.so binary_file2.so
يخبرنا هذا بمزيد من التفاصيل. أول بايت يختلف بين الملفين هو البايت رقم 13451. أي أنه عند حسابه من بداية الملف الثنائي، يكون البايت 13451 مختلفًا في الملفين الثنائيين. لذا فإن البايت 13451 هو إزاحة الاختلاف الأول، من بداية الملف.
بالصدفة، ستجد في الملف بأكمله بايتات تحتوي على القيمة السداسية عشرية 0x10. هذه هي القيمة التي يستخدمها Linux في ملفات النصوص كحرف نهاية السطر. cmp
واجه الأمر 131 بايتًا بهذه القيمة بين بداية الملف الثنائي وموقع الاختلاف الأول. لذا فهو يعتقد أنه موجود على السطر 132. وهذا لا يعني أي شيء في هذا السياق.
إذا أضفنا -l
(الخيار المطول) سوف نبدأ في الحصول على معلومات مفيدة.
cmp -l binary_file1.so binary_file2.so
يتم سرد كافة البايتات المختلفة. يتم عرض رقم البايت أو الإزاحة، والقيمة من الملف الأول، والقيمة من الملف الثاني، مع بايت واحد لكل سطر من الإخراج.
قيم البايت هي يظهر في ثماني، بدلا من تنسيق سداسي عشري معتاد تُستخدم مع الملفات الثنائية. ومع ذلك، فقد تعلمنا شيئًا آخر. كل البايتات المتغيرة تكون في تسلسل مستمر واحد. تتم زيادة إزاحاتها بمقدار واحد لكل بايت.
ال hexdump
ستقوم الأداة بتفريغ ملف ثنائي إلى نافذة المحطة الطرفية. إذا استخدمنا -C
خيار (canonical) سيقوم الإخراج بإدراج الإزاحة، وقيم 16 بايتًا عند هذا الإزاحة، و-إذا كان هناك—تمثيل ASCII لقيم البايتات.
hexdump -C binary_file1.so
يمكننا استخدام الناتج من hexdump
كمدخل إلى diff
، السماح diff
يعمل كما لو كان يقرأ ملفين نصيين.
diff <(hexdump binary_file1.so) <(hexdump binary_file2.so)
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
diff binary1.txt binary2.txt
يتم عرض الاختلاف بين الملفين في مقتطفين قصيرين. يوجد تمثيل ASCII بجانبهما. سيكون هناك زوج من المقتطفات لكل اختلاف بين الملفين. في هذا المثال، يوجد اختلاف واحد فقط.
كل هذا جيد جدًا، ولكن ألن يكون من الرائع أن يكون هناك شيء يفعل كل ذلك من أجلك؟
اختلاف VBin
يمكن تثبيت برنامج VBinDiff من المستودعات المعتادة لجميع التوزيعات الرئيسية. لتثبيته على Ubuntu، استخدم هذا الأمر:
sudo apt install vbindiff
في فيدورا، تحتاج إلى كتابة:
sudo dnf install vbindiff
يجب على مستخدمي Manjaro استخدام pacman
.
sudo pacman -Sy vbindiff
لاستخدام البرنامج، قم بتمرير اسم الملفين الثنائيين على سطر الأوامر.
vbindiff binary_file1.so binary_file2.so
يتم فتح التطبيق المستند إلى المحطة الطرفية، مع عرض كلا الملفين في عرض متمرّر.
يمكنك استخدام عجلة التمرير بالماوس أو مفاتيح “UpArrow” و”DownArrow” و”Home” و”End” و”PageUp” و”PageDown” للتنقل عبر الملفات. سيتم تمرير كلا الملفين.
اضغط على مفتاح “Enter” للانتقال إلى الاختلاف الأول. يظهر الاختلاف بوضوح في كلا الملفين.
إذا كان هناك المزيد من الاختلافات، فإن الضغط على “Enter” سيعرض الاختلاف التالي. الضغط على “q” أو “Esc” سيخرج من البرنامج.
ما هو الفرق؟
إذا كنت تعمل على جهاز كمبيوتر مملوك لشخص آخر ولا يُسمح لك بتثبيت أي حزم، فيمكنك استخدام cmp
, diff
، و hexdump
إذا كنت بحاجة إلى التقاط الناتج لمزيد من المعالجة، فهذه هي الأدوات التي يمكنك استخدامها أيضًا.
ولكن إذا سُمح لك بتثبيت الحزم، فإن VBinDiff يجعل سير عملك أسهل وأسرع. وفي الواقع، فإن استخدام VBinDiff مع ملف ثنائي واحد هو طريقة سهلة ومريحة لتصفح الملفات الثنائية، وهي ميزة إضافية رائعة.