
تشكيلة من خوارزميات التجزئة المستخدمة في البرمجيات الخبيثة
HashDB هي مكتبة مجتمعية لخوارزميات التجزئة المستخدمة في البرمجيات الخبيثة.
يمكن استخدام HashDB كمكتبة تجزئة مستقلة، كما أنها تغذي خدمة البحث في HashDB التي تديرها OALabs. تتيح هذه الخدمة للمحللين عكس التجزئات واسترجاع أسماء واجهات برمجة التطبيقات (API) والقيم النصية المُجزّأة.
يمكن استنساخ HashDB واستخدامها في نصوصك الخاصة بهندسة عكسية مثل أي وحدة Python قياسية. فيما يلي بعض الأمثلة على الكود.
>>> import hashdb
>>> hashdb.list_algorithms()
['crc32']
>>> hashdb.algorithms.crc32.hash(b'test')
3632233996
تدير OALabs خدمة بحث مجانية في HashDB يمكن استخدامها للاستعلام عن جدول تجزئة لأي تجزئة مدرجة في مكتبة HashDB. تتضمن جداول التجزئة المجموعة الكاملة من واجهات برمجة تطبيقات Windows بالإضافة إلى العديد من السلاسل الشائعة المستخدمة في البرمجيات الخبيثة. يمكنك حتى إضافة السلاسل الخاصة بك!
تتوفر لخدمة البحث في HashDB ملحق لـ IDA Pro يمكن استخدامه لأتمتة عمليات البحث عن التجزئة مباشرة من IDA! يمكن تنزيل العميل من GitHub هنا.
تعتمد HashDB على دعم المجتمع للحفاظ على تحديث مكتبة التجزئة! هدفنا هو ألا يستغرق المساهمون أكثر من خمس دقائق لإضافة تجزئة جديدة، من أول commit إلى PR. لتحقيق هذا الهدف، نقدم العملية المبسطة التالية.
تأكد من أن خوارزمية التجزئة غير موجودة بالفعل... نعلم أن ذلك يبدو سخيفًا ولكن فقط تحقق مرة أخرى.
أنشئ فرعًا (branch) باسم وصفي.
أضف ملف Python جديدًا إلى دليل /algorithms باسم خوارزمية التجزئة الخاصة بك. حاول استخدام الاسم الرسمي للخوارزمية، أو إذا كانت فريدة، استخدم اسم البرمجية الخبيثة التي تنفرد بها.
استخدم القالب التالي لإعداد خوارزمية التجزئة الجديدة. جميع الحقول إلزامية وحساسة لحالة الأحرف.
#!/usr/bin/env python
DESCRIPTION = "your hash description here"
# Type can be either 'unsigned_int' (32bit) or 'unsigned_long' (64bit)
TYPE = 'unsigned_int'
# Test must match the exact hash of the string 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
TEST_1 = hash_of_string_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
def hash(data):
# your hash code here
تحقق جيدًا من أسلوب Python الخاص بك، فنحن نستخدم Flake8 على Python 3.9. يمكنك تجربة أوامر lint التالية محليًا من جذر مستودع git.
pip install flake8
flake8 ./algorithms --count --select=E9,F63,F7,F82 --show-source --statistics
اختبر الكود محليًا باستخدام مجموعة الاختبارات الخاصة بنا. نفّذ الأوامر التالية محليًا من جذر مستودع git. لاحظ أنه يجب تشغيل pytest كوحدة بدلاً من تشغيله مباشرة أو لن يلتقط دليل الاختبارات الخاص بنا.
pip install pytest
python -m pytest
قدّم طلب سحب (pull request) — سيتم وضع خوارزميتك الجديدة تلقائيًا في قائمة الانتظار للاختبار، وإذا نجحت، سيتم دمجها.
هذا كل شيء! لن تتوفر تجزئتك الجديدة في مكتبة HashDB فحسب، بل سيتم أيضًا إنشاء جدول تجزئة جديد لـ خدمة البحث في HashDB ويمكنك البدء في عكس التجزئات فورًا!
طلبات السحب (PRs) التي تتضمن تغييرات خارج دليل /algorithms ليست جزءًا من CI التلقائي لدينا وستخضع لتدقيق إضافي.
يجب أن تحتوي جميع التجزئات على وصف صالح في حقل DESCRIPTION.
يجب أن يكون لجميع التجزئات نوع إما unsigned_int أو unsigned_long في حقل TYPE. تقبل HashDB حاليًا فقط التجزئات غير الموقعة 32bit أو 64bit.
يجب أن تحتوي جميع التجزئات على تجزئة السلسلة ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 في حقل TEST_1.
يجب أن تتضمن جميع التجزئات دالة hash(data) تقبل سلسلة بايتات وتُرجع تجزئة السلسلة.
تقوم بعض خوارزميات التجزئة بتجزئة اسم الوحدة واسم API بشكل منفصل ثم تجمع التجزئات لإنشاء تجزئة واحدة للوحدة+API. مثال على ذلك تجزئة Metasploit ROR13 القياسية. لن تعمل هذه الخوارزميات مع قائمة الكلمات القياسية وتتطلب قائمة كلمات مخصصة تتضمن كلاً من اسم الوحدة واسم API. للتعامل مع هذه الحالات، نسمح بخوارزميات مخصصة لا تُرجع تجزئة صالحة إلا لبعض الكلمات.
تتطلب إضافة تجزئة API مخصصة المكونات الإضافية التالية.
يجب ضبط حقل TEST_1 على 4294967294 (-1).
يجب أن تُرجع خوارزمية التجزئة القيمة 4294967294 لجميع التجزئات غير الصالحة.
يجب إضافة حقل إضافي TEST_API_DATA_1 مع كلمة مثال صالحة للخوارزمية.
يجب إضافة حقل إضافي TEST_API_1 مع تجزئة حقل TEST_API_DATA_1.
تحية كبيرة لفريق FLARE على جهودهم مع shellcode_hashes. منذ سنوات عديدة، وضع هذا المشروع المعيار لعكس تجزئات البرمجيات الخبيثة بسرعة وسهولة، ولا يزال أداة مفيدة للغاية. فلماذا نكرره؟
بصراحة، الأمر كله يتعلق بقائمة الكلمات وسهولة الوصول. لقد شهدنا تحولًا كبيرًا نحو استخدام التجزئات لجميع أنواع السلاسل في البرمجيات الخبيثة الآن، والطريقة القديمة لتجزئة جميع صادرات DLL الخاصة بنظام Windows لم تعد جيدة بما يكفي. أردنا حلاً يمكنه معالجة ملايين مفاتيح التسجيل وقيمه وأسماء الملفات وأسماء العمليات بشكل مستمر. وأردنا أن تكون تلك البيانات متاحة عبر REST API حتى نتمكن من استخدامها في سير عمل الأتمتة لدينا، وليس فقط في أدوات التحليل الثابت. ومع ذلك، لما كنا لنوجد بدون shellcode_hashes، فالعرفان يُمنح لأهله 🙌