التحليل الجنائي الرقمي / أساسي: النطاق والسلامة والتفسير / الدرس 4
قراءة البايتات والترميزات والإزاحات بدقة
تفسير سلاسل بايتات مختلقة صغيرة دون خلط النص المعروض ومواضع البايتات وتخطيط الأعداد.
في هذه الصفحة
أهداف الدرس
- فصل البايتات عن المحارف المفكوكة وحفظ فشل فك الترميز.
- تفسير ترتيب بايتات معلن وحدود صيغة مخصصة صغيرة.
اعتبار العرض تفسيرا واحدا للبايتات
تبدأ المادة ببايتات وقد تعرضها الأداة نصا أو ست عشريا أو أعدادا أو بنية مفكوكة. تجيب هذه العروض أسئلة مختلفة. الست عشري تمثيل للبايتات لا ترميز يكشف المعنى تلقائيا. سجل قاعدة الإزاحة والطول والعرض المختار. لا تساوي إزاحة البايت موضع المحرف بالضرورة في UTF-8. يحوي عنوان التدريب العربي محارف تشغل عدة بايتات. عامل البايتات الأصلية والنص المفكوك ككائنين مترابطين مختلفين.
إعلان الترميز وسياسة الخطأ
فك بترميز مدعوم مختار صراحة واحفظ نتيجة الفشل. قد يحذف تجاهل البايتات غير الصالحة مادة مهمة، وتحجب محارف الاستبدال الأصل. يعيد البرنامج ترميز نص UTF-8 معروفا، ويلتقط حالة بايت غير صالح منفصلة. يعالج البرنامج الكامل الحالة ولا يترك جزءا ينهار. يوضح سلوك المفكك فقط. يحتاج ترميز المادة الحقيقية سندا من الصيغة أو السياق، ولا يخمن من كلمة مقروءة أو يفرض UTF-8 بصمت.
text = "ورشة"
raw = text.encode("utf-8")
assert raw.decode("utf-8") == text
assert len(raw) > len(text)
try:
b"\xff".decode("utf-8", errors="strict")
except UnicodeDecodeError:
invalid_rejected = True
else:
invalid_rejected = False
assert invalid_rejected
print("UTF-8 round trip and invalid-byte rejection checked")
UTF-8 round trip and invalid-byte rejection checked
يستخدم البرنامج الكامل نصا عاما معروفا وبايتا خاملا غير صالح في الذاكرة. يفحص UTF-8 دون قراءة ملف أو إصلاح مادة. يحفظ النص العربي نفسه بدقة في شفرة النسختين.
توضيح ترتيب البايتات وطول الحقل
يحتاج العدد متعدد البايتات عرضا وترتيبا معلنين. يفك struct صيغة محددة، بينما قد يعتمد افتراضه الأصلي تخطيط المنصة. يفسر البرنامج البايتين نفسيهما كعدد غير موقع من ستة عشر بتا بترتيب صغير النهاية (little-endian) وكبير النهاية (big-endian). يصح الحسابان وفق افتراضيهما، وتحدد مواصفة المادة المناسب. لا تختر ما يلائم تسلسلا مفضلا. افحص الحدود قبل الاستخراج لتحدد البتر بدلا من إضافة بايتات مختلقة أو قراءة إزاحة خاطئة.
import struct
raw = bytes.fromhex("01 02")
assert len(raw) == 2
little = struct.unpack("<H", raw)[0]
big = struct.unpack(">H", raw)[0]
assert little == 513
assert big == 258
print("little=513 big=258 for the same two bytes")
little=513 big=258 for the same two bytes
يفك البرنامج الكامل قيمة مختلقة من بايتين بتخطيطين صريحين. ليس محلل نظام ملفات أو التقاط حزم أو صورة ذاكرة أو صيغة دليل حقيقية. لا يصل إلى جهاز أو ملف أو شبكة.
حفظ حدود الاستخراج والقيم الأصلية
سجل إزاحة البداية وطول البايتات والست عشري الأصلي وقاعدة الفك لكل حقل. افصل الإزاحة المطلقة في الأصل عن الإزاحة النسبية داخل سجل. يغير تخطي الرأس المرجع، فيذكر التقرير القاعدة. احفظ القيم الأصلية مع الموحدة، خاصة عند تعذر فك المعطوب. لا تسم الإزاحة قطاعا أو كتلة أو موضع محرف دون تعريف الصيغة. قد ينتج خلط الوحدات ربطا مقنعا خاطئا بين المواد.
التحقق من التفسير ببيانات معلومة
تضم بيانات المحلل قيمة صحيحة معلومة وطولا حديا وحالة مبتورة وترميزا غير مدعوم عند الحاجة. قارن الإزاحات والقيم المتوقعة مستقلا عن التنفيذ المراجع. قد يعمل البرنامج بلا استثناء ويفسر ترتيبا خاطئا أو يحذف بايتات بصمت. احفظ فئات الفشل والمدخل الدقيق للإعادة. تعلم الحسابات الصغيرة انضباط التفسير ولا تتحقق من أداة جنائية تجارية أو تثبت فك صيغة حقيقية مجهولة بصورة صحيحة.
الأخطاء الشائعة وإصلاحها
يسجل موضع المحرف كإزاحة بايت
- لماذا يحدث؟
- تخلط مواضع النص ببايتات المصدر.
- كيف تصلحه؟
- تتبع الحدود قبل الفك وسم الوحدات.
- كيف تتجنب تكراره؟
- أدرج بيانات متعددة البايتات.
تتجاهل البايتات المعطوبة بصمت
- لماذا يحدث؟
- يحذف المفكك المادة بلا قرار مسجل.
- كيف تصلحه؟
- احفظ الأصل وأبلغ فشل الفك.
- كيف تتجنب تكراره؟
- وضح الترميز وسياسة الخطأ.
يفترض التخطيط الأصلي قابلا للنقل
- لماذا يحدث؟
- تترك البنية لافتراض البيئة.
- كيف تصلحه؟
- استخدم تخطيط الصيغة وحدودها.
- كيف تتجنب تكراره؟
- اختبر سلاسل معلومة بتوقعات مستقلة.
اختبر فهمك
1. تفك البايتات إلى 258 و 513. أيهما يسجل؟
اعرض الحل المشروح
اذكر البايتات والافتراضين حتى تحدد الصيغة الترتيب الصحيح. إذا نصت على عدد غير موقع من ستة عشر بتا بترتيب كبير النهاية، فالتفسير المناسب 258. لا تختر القيمة لموافقة تفسير مفضل.
2. لماذا تحفظ بايتات UTF-8 غير الصالحة بدلا من استبدال الأصل بنص مقروء؟
اعرض الحل المشروح
يغير الاستبدال الكائن وقد يخفي التسلسل الأصلي. احفظ المصدر وسجل فشل الفك الصارم وأنشئ مشتقا مسمى إذا احتجت عرضا. وضح ما يثبته المشتق عن الأصل وما لا يثبته.
أهم ما تعلمته
- تختلف البايتات والمحارف وصيغ العرض.
- تمنع البنية والحدود الصريحة غموض الاستخراج.
- احفظ فشل الفك والقيم الأصلية.