قطاع الإقلاع ($Boot)¶
ما هو $Boot¶
$Boot هو إدخال MFT رقم 7 في كل وحدة تخزين NTFS: أول 8 KiB من وحدة التخزين. ويحتوي قطاعه الأول،
وهو سجل إقلاع وحدة التخزين (volume boot record)، على كتلة معلمات BIOS (BIOS parameter block) التي
تصف نظام الملفات:
- أحجام القطاعات والعناقيد (clusters)، وعدد القطاعات في وحدة التخزين، والقطاعات المخفية (hidden sectors: القطاعات الموجودة على القرص قبل وحدة التخزين، أي حيث يبدأ قسمها)؛
- مواضع بداية
$MFTو$MFTMirr، وأحجام سجلات FILE وINDX؛ - الرقم التسلسلي لوحدة التخزين بطول 64 بت، الذي يُضبط عند تهيئة وحدة التخزين.
ويحتوي باقي القطاع الأول والقطاعات الخمسة عشر التي تليه على شيفرة الإقلاع (boot code) التي تحمّل Windows.
البتات الـ 32 الدنيا من الرقم التسلسلي هي ما يعرضه Windows بصيغة XXXX-XXXX (vol، dir)، وهي ما
تسجله اختصارات LNK وJump Lists وPrefetch عن وحدة التخزين
التي كان عليها الملف. ويربط $Boot تلك السجلات بوحدة تخزين من مضيف جرى جمعه.
أفضل استنتاج: الرقم التسلسلي لوحدة التخزين في LNK أو Jump List
أو Prefetch المساوي لقيمة VolumeSerialNumber في $Boot يشير إلى وحدة التخزين تلك، أو إلى وحدة
تخزين أخرى أُعطيت الرقم التسلسلي نفسه أو نُسخت معه. ويمكن تغيير الأرقام التسلسلية، وهي ليست فريدة عبر
المضيفين.
الموقع والجمع¶
اجمعه بأداة جنائية قادرة على القراءة الخام، أو اقرأ القطاع الأول من صورة وحدة التخزين: فكلاهما البايتات نفسها. يقرأ Juntei أي ملف يبدأ بقطاع إقلاع NTFS، لذا تصلح صورة وحدة التخزين مُدخلًا. أما صورة القرص فتبدأ بجدول الأقسام بدلًا من ذلك؛ فأعطِ Juntei وحدة التخزين الخاصة بالقسم.
تحذيرات للمحلل¶
- يتغير الرقم التسلسلي عند تهيئة وحدة التخزين. وقد يشير ملف LNK لا يطابق رقمه التسلسلي أي وحدة تخزين حالية إلى وسائط قابلة للإزالة، أو إلى خادم مشاركة شبكية، أو إلى وحدة تخزين جرت تهيئتها منذ ذلك الحين.
- تكون شيفرة الإقلاع متطابقة على وحدات التخزين التي هيّأها إصدار Windows نفسه: فهي متطابقة في ملفات
$Bootالخاصة بـ Windows 10 و11 وServer 2012 R2 في DFIR Artifact Museum. ويغيّرها bootkit يستهدف سجل إقلاع وحدة التخزين، أو يغيّر حقل القطاعات المخفية الذي تستخدمه شيفرة الإقلاع للعثور على بقية$Boot. قارنBootCodeSHA256وJumpInstructionوHiddenSectorsمع المضيفين الآخرين ومع جدول الأقسام قبل استنتاج أي شيء: فقد يغيّر مدير إقلاع أو برنامج تشفير شيفرة الإقلاع أيضًا. - تبدأ صورة وحدة تخزين مشفرة بـ BitLocker بقطاع الإقلاع الخاص بـ BitLocker (معرّف OEM هو
-FVE-FS-). وعند تمريرها باستخدام-f، يُبلغ Juntei عنها، ويذكرProblemsأنها ليست NTFS؛ إذ يوجد قطاع إقلاع NTFS ضمن البيانات المشفرة. أما$Bootالمجموع من وحدة التخزين بعد إلغاء قفلها فهو قطاع NTFS. - يسرد
Problemsحالات عدم الاتساق البنيوي والاقتطاع المعروفة، ولا يوفر اختبارًا كاملًا لقابلية التركيب (mount) في Windows. استخدمه لتقييم القطاعات المستخرجة بالاقتطاع (carving) والنسخ، لا بوصفه دليلًا على هجوم في حد ذاته. تستثني تجزئة شيفرة الإقلاع تعليمة القفز الأولى، وكتلة معلمات BIOS، وتوقيع النهاية؛ فافحص تلك الحقول أيضًا.
التحليل باستخدام Juntei¶
Usage: juntei parse-ntfs boot <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find $Boot files (named $Boot, or starting with an NTFS boot sector)
-f, --file <FILE> Parse one $Boot file, or an NTFS volume image (its first sector)
Output:
-o, --output <FILE> Save every boot sector
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-ntfs boot -f '$Boot'
juntei parse-ntfs boot -d evidence/ -o boot.csv
juntei parse-ntfs boot -f volume.dd -t json
يسرد الملخص لكل قطاع إقلاع الرقم التسلسلي لوحدة التخزين (كما يعرضه Windows، وكما تعرضه حقول LNK
وPrefetch)، والحجم، وحجم العنقود، وعنقود $MFT. وعند تحليل عدة مضيفين، يجمّعهم حسب تجزئة شيفرة
الإقلاع، بحيث تبرز وحدة التخزين التي تختلف شيفرة إقلاعها عن البقية.
حقول إخراج CSV¶
| الحقل | التفسير |
|---|---|
SourcePath |
ملف الإدخال. |
VolumeSerialNumber |
الرقم التسلسلي بطول 32 بت، كما يعرضه إخراج LNK وJump List وPrefetch (180B1E67). ويعرضه Windows بصيغة 180B-1E67. |
VolumeSerialNumber64 |
الرقم التسلسلي الكامل بطول 64 بت. |
OEM-ID |
NTFS على وحدة تخزين NTFS. |
BytesPerSector، SectorsPerCluster، ClusterSize |
الهندسة الخاصة بوحدة التخزين. يُسجَّل عدد القطاعات لكل عنقود الذي يتجاوز 128 بوصفه أُسًّا للعدد 2، ويُفك ترميزه هنا. ويكون فارغًا عندما لا يكون صالحًا. |
TotalSectors، VolumeSize |
عدد القطاعات في وحدة التخزين وحجمها بالبايت، دون نسخة قطاع الإقلاع الموجودة في نهايتها. |
HiddenSectors |
القطاعات الموجودة على القرص قبل وحدة التخزين: حيث يبدأ قسمها. |
MFT-Cluster، MFT-Offset |
موضع بداية $MFT، بالعناقيد وبالبايتات من بداية وحدة التخزين. |
MFT-MirrorCluster، MFT-MirrorOffset |
موضع بداية $MFTMirr. |
FileRecordSize، IndexRecordSize |
عدد البايتات لكل سجل FILE (عادةً 1,024) ولكل سجل INDX (عادةً 4,096). |
MediaDescriptor |
F8 للقرص الثابت. |
JumpInstruction |
البايتات الثلاثة الأولى (EB 52 90): قفزة فوق كتلة معلمات BIOS إلى شيفرة الإقلاع. |
EndSignature |
55 AA في نهاية قطاع إقلاع صالح. |
BootCodeSHA256 |
تجزئة SHA-256 لشيفرة الإقلاع: البايتات من 0x54 إلى 0x1FD في القطاع الأول وبقية الـ 8 KiB. |
Problems |
ما لن يركّبه Windows: معرّف OEM غير NTFS، أو غياب 55 AA، أو أحجام غير صالحة، أو حقول FAT التي يبقيها NTFS صفرية وقد ضُبطت، أو $MFT بعد نهاية وحدة التخزين؛ وكذلك ملف أقصر من 8 KiB. |
يحتوي JSON/JSONL على الحقول والأسماء نفسها، مع الأرقام بوصفها أرقامًا، وnull للقيم غير المعروفة،
وProblems بوصفه قائمة.
استراتيجية التحقيق¶
- ضع
VolumeSerialNumberلكل مضيف بجوار الأرقام التسلسلية لوحدات التخزين في ملفات LNK وJump Lists وملفات Prefetch الخاصة به: فالأرقام التي لا تطابق أي وحدة تخزين مجموعة تخص وحدات تخزين أخرى (محركات USB، أو مشاركات، أو وحدات تخزين جرت تهيئتها منذ ذلك الحين). - ابحث عن الأرقام التسلسلية الأخرى في إخراج أجهزة USB، الذي يسرد الأرقام التسلسلية لوحدات التخزين القابلة للإزالة التي جرى تركيبها.
- قارن
BootCodeSHA256وHiddenSectorsعبر المضيفين. وافحص شيفرة الإقلاع المختلفة باستخدام أداة تفكيك (disassembler) وجدول أقسام القرص، وابحث عن إدخالات سجلات الأحداث المتعلقة بالإقلاع. - استخدم
MFT-OffsetوClusterSizeللعثور على$MFTفي صورة وحدة تخزين.
مزيد من التفاصيل¶
- Microsoft: نظرة عامة على NTFS
- libfsntfs: وثائق تنسيق NTFS (رأس وحدة التخزين)
- The Sleuth Kit: fsstat
- ys-ntfs-parser (حزمة
bootالخاصة به)