
تحديد واستخراج البرامج الثابتة لإنترنت الأشياء
تحديد واستخراج البرامج الثابتة لإنترنت الأشياء
يحدد moria الملفات والبنى المضمّنة داخل البرامج الثابتة وصور إنترنت الأشياء (أنظمة الملفات، النوى، محمّلات الإقلاع، الأرشيفات، المفاتيح) ويفكّ معظم ما يجده، دون صلاحيات الجذر. يبلّغ عن كل اكتشاف بإزاحة بايت، ونوع، ودرجة ثقة، ويتحدث JSON نظيفًا بحيث يمكن للسكربتات ووكلاء LLM تشغيله بسهولة كما يفعل البشر.
upx -d.openat + O_NOFOLLOW (لا اجتياز مسار ولا هروب عبر رابط رمزي)، وفكّ الضغط محدود ضد القنابل.-j) للأدوات، مع الإزاحات والثقة على كل اكتشاف.cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install build --prefix ~/.local # or /usr/local (needs sudo)
يتطلب البناء cmake، ومترجم C++20، ومكتبات التطوير zlib وliblzma وlz4 وzstd (أدوات فك الضغط التي يستخدمها --extract). على Debian/Ubuntu: sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev. للبناء بدون أحدها (بناء أدنى أو للتحديد فقط)، اضبط الإعداد بـ -DMORIA_OPTIONAL_CODECS=ON ويُعطَّل الترميز المفقود ببساطة.
ملف moria التنفيذي مكتفٍ ذاتيًا: جميع مجموعات التوقيعات مضمّنة وقت البناء، لذا يعمل الملف التنفيذي في أي مكان دون تثبيت أي شيء بجانبه (cp build/moria ~/.local/bin كافٍ، وملف تنفيذي مُنزَّل من إصدار يعمل مباشرة). لاستخدام توقيعات خارجية بدلًا من المضمّنة (لاختبار .toml جديد دون إعادة البناء، مثلًا)، مرّر --sigs DIR أو اضبط $MORIA_SIGDIR.
المخرج مقروء للبشر افتراضيًا. مرّر -j للحصول على JSON.
moria <file> # identify: a findings tree with offsets, types, and confidence
moria <dir> # scan a tree: a type summary plus the notable files
moria -j <file> # JSON, for tools and agents
moria -e <file> # extract to <file>.extracted/ (-C DIR to choose the output dir)
moria -c <file> # carve raw byte ranges to <file>.carved/ (no parsing)
moria -E <file> # entropy pass: flag unidentified / possibly-encrypted regions
moria --list <archive> # list tar/cpio/zip members without extracting
moria --broad <path> # also load the ~2.5k general file-type signatures
moria --help
يفكّ -e الصيغ المتعرَّف عليها تحت <file>.extracted/، بدليل واحد لكل منطقة (0x<offset>-<type>/)، بالإضافة إلى manifest.json يربط الإزاحات بالمسارات. يتعاود تلقائيًا داخل الحاويات المتداخلة ويعيد بناء صور UBI وحدة بحجم وحدة. الحواجز (--depth، --max-files، --max-bytes، وحد أقصى لنسبة فك الضغط) تحدّ من المدخلات العدائية؛ الحاجز المُفعَّل يوقف ذلك الفرع ولا يزال يعيد كل ما استُعيد.
يُفكّ داخل العملية، دون أدوات خارجية ودون sudo:
signatures/ هو النواة المكتوبة يدويًا: أنظمة ملفات البرامج الثابتة، والحاويات، والنوى، والصيغ الشائعة، كل منها مع تحقق بنيوي.signatures-firmware/ يحمل سحر حاويات البرامج الثابتة الخاصة بالموردين ويُحمَّل افتراضيًا.signatures-generated/ يحمل ~2.5k من سحر أنواع الملفات العامة المستمدة من قاعدة سحر file(1) ويُحمَّل فقط مع --broad.لإضافة صيغة، ضع ملف .toml في signatures/. لا حاجة إلى مُدقّق C++ صغير إلا للفحوص التي لا تستطيع الطبقة التصريحية التعبير عنها، مثل CRCs أو المؤشرات العابرة للكتل.
يقوم moria بالتحديد البنيوي والاستخراج والنحت. فحص الأسرار/بيانات الاعتماد، وSBOM، وCVE، وتحليل التراخيص أداة منفصلة (mithril).
MIT، انظر LICENSE.
بعض معالجة صيغ القرص هي إعادة تنفيذ نظيفة للخوارزميات في مشاريع مفتوحة المصدر أخرى، مكتوبة بشكل مستقل مقابل طبقة الإدخال/الإخراج الخاصة بـ moria (لم يُنسخ أي كود): مفكّك ضغط UCL/NRV2B ومرشّحات CTO العكسية من UPX/UCL (GPL-2.0، الخوارزميات فقط)، وتخطيط metadata-commit وCTZ skip-list في littlefs (BSD-3-Clause)، وتخطيط الصفحة/الكائن في SPIFFS (MIT).