
برنامج تحليل البرامج الثابتة الثنائية الخام
الهدف من هذا المشروع هو تحليل برنامج ثنائي خام (firmware) وتحديد بعض ميزاته تلقائيًا. هذه الأداة متوافقة مع جميع البنى لأنها تقوم بشكل أساسي بإحصائيات بسيطة عليه.
الميزات الرئيسية:
أولاً، استنسخ مستودع git:
git clone https://github.com/quarkslab/binbloom.git
cd binbloom
لبناء أحدث إصدار (لينكس فقط):
autoreconf -i
./configure
make
sudo make install
binbloom firmware.bin
يجب أن يعطي هذا الأمر مخرجات مثل هذه:
[i] 32-bit architecture selected.
[i] File read (20480 bytes)
[i] Endianness is LE
[i] 6 strings indexed
[i] Found 3 base addresses to test
[i] Base address seems to be 0x60000000 (not sure)
More base addresses to consider (just in case):
0x005b5000 (0)
0x0bcd0000 (0)
في هذا المخرج، يعرض السطر الثالث endianness المُخمَّن (LE, little-endian) ويعطي السطر السادس العنوان المُخمَّن (0x60000000). تم تحديد 6 سلاسل نصية و3 عناوين أساسية محتملة. إذا لم يتم تحديد البنية، فإن بنية 32-bit تُعتبر افتراضيًا.
القيمة بين القوسين بعد كل عنوان مرشح هي النتيجة المقابلة. كلما ارتفعت النتيجة، زادت احتمالية صحة العنوان.
binbloom -a 64 firmware.bin
[i] 64-bit architecture selected.
[i] File read (327680 bytes)
[i] Endianness is LE
[i] 717 strings indexed
[i] Found 7535 base addresses to test
[i] Base address found: 0x0000000000010000.
More base addresses to consider (just in case):
0x000000000000e000 (276)
0x000000000000f000 (242)
0x0000000000011000 (175)
0x000000000000d000 (167)
0x000000000000b000 (121)
0x0000000000013000 (107)
0x0000000000012000 (100)
[...]
الخيار -a يخبر binbloom بأن يأخذ في الاعتبار برنامجًا ثنائيًا 64-bit، ويظهر المخرج أعلاه عنوانًا أساسيًا مُخمَّنًا بقيمة 0x10000.
عند التعامل مع برامج ثنائية صغيرة (حجم < 10 كيلوبايت)، قد لا يكون كشف endianness في binbloom موثوقًا وقد يعطي نتيجة خاطئة تؤدي إلى عناوين أساسية غير متوقعة. في هذه الحالة، يمكنك استخدام الخيار -e لتحديد endianness:
binbloom -e be firmware.bin
يُنتج بعد ذلك المخرج التالي:
[i] Selected big-endian architecture.
[i] File read (1048576 bytes)
[i] Endianness is BE
[i] 764 strings indexed
[i] Found 18615 base addresses to test
[i] Base address seems to be 0x00000000 (not sure).
More base addresses to consider (just in case):
0x3f740000 (121043)
0x7ff48000 (61345)
0x41140000 (59552)
[...]
يتم بعد ذلك فرض endianness (في هذه الحالة big-endian) ويعتمد binbloom على هذا التكوين لتخمين العنوان الأساسي.
binbloom -a 32 -e be -b 0x0 firmware.bin
[i] 32-bit architecture selected.
[i] Selected big-endian architecture.
[i] Base address 0x0000000000000000 provided.
[i] 764 strings indexed
Most probable UDS DB is located at @000ee8c8, found 7 different UDS RID
Identified structure:
struct {
code *p_field_0;
code *p_field_1;
uint32_t dw_2;
}
يعتمد هذا التحليل على استدلالات لذا قد يعطي نتائج إيجابية خاطئة. يجب عليك قراءة قائمة قواعد بيانات UDS المحتملة التي وجدها binbloom والتحقق منها لترى أيها صحيح إن وجد. يوفر binbloom البنية المحددة في مخرجاته، مما يسمح لبعض برامج التفكيك (disassemblers) بتحليل الذاكرة بعد تعريف البنية.
يمكنك تسريع عملية البحث عن العنوان الأساسي عن طريق تمكين تعدد الخيوط (multi-threading) باستخدام الخيار -t. بشكل افتراضي، يتم استخدام خيط واحد.
binbloom -t 8 firmware.bin
وضع البحث العميق، الذي يتم تمكينه باستخدام الخيار -d، مطبق أيضًا ولكنه لا يزال تجريبيًا. قد يكون هذا الوضع مفيدًا في مناسبات نادرة جدًا حيث قد يعثر على عنوان أساسي صحيح عندما لا يعمل أي شيء آخر، لكنه وضع أبطأ وقد يستغرق بعض الوقت لاكتماله.
إذا كنت تريد أن تعرض الأداة المزيد من المعلومات، استخدم خيار -v مرة أو أكثر.
يتم توفير binbloom بموجب رخصة Apache 2.0.