التحليل الجنائي الرقمي وأول نظرة على البرمجيات الخبيثة
درس 3 من 3
3التحليل الجنائي الرقمي وأول نظرة على البرمجيات الخبيثة
الصورة الكبيرةفي مسرح الجريمة لا يلمس المحقق شيئًا قبل أن يصوّر ويوثّق، لأن أي لمسة قد تمحو دليلًا أو تجعله مرفوضًا في المحكمة. الحاسوب مثله، بل أصعب: إعادة تشغيله تمحو الذاكرة، وفتح ملف يغيّر تاريخ الوصول إليه. المحلل الجنائي يعمل ببطء محسوب، لأن الدقة هنا أهم من السرعة.
ماذا تشاهد في الرسم: المراحل الخمس في NIST SP 800-86 وغيره: تحفظ المشهد، وتجمع الأدلة بترتيب التطاير، وتفحصها، وتحللها في خط زمني، ثم تكتب تقريرًا يفهمه غير التقني ويصمد أمام المراجعة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
تخيّل أن لصًا دخل بيتًا. بعض الأدلة يتبخر بسرعة: آثار الأقدام على الأرض المبللة، ودفء الكرسي الذي جلس عليه (الذاكرة). وبعضها يبقى: الخزنة المكسورة (القرص). المحقق يصوّر الأرض المبللة أولًا. وكل دليل يُوضع في كيس مختوم ويُكتب عليه من استلمه ومتى (سلسلة الحيازة). وحين يجد المحقق أداة غريبة، لا يجربها في البيت؛ يأخذها إلى مختبر.
ترتيب التطاير (RFC 3227): المسجلات والذاكرة المؤقتة، ثم جدول التوجيه وARP والعمليات والذاكرة، ثم الملفات المؤقتة، ثم القرص، ثم السجلات البعيدة، ثم الوسائط الأرشيفية. الذاكرة تُلتقط حيّة (مثل WinPmem أو أدوات EDR)، والقرص بنسخة bit-for-bit (صيغة raw أو E01) مع مانع كتابة وتجزئة SHA-256 للأصل والنسخة. Volatility 3: windows.pslist وwindows.pstree وwindows.netscan وwindows.malfind. آثار Windows: Prefetch (ما الذي شُغّل)، وAmcache وShimCache، ومفاتيح Run في السجل، و$MFT، وسجلات الأحداث. Linux: auth.log وbash_history وcron وsystemd. الخط الزمني الشامل بـ Plaso (log2timeline) أو جمع الآثار بـ KAPE وVelociraptor. تحليل البرمجيات: ثابت (التجزئة، والنصوص، والدوال المستوردة، وأقسام PE، والإنتروبيا: قرب 8 يعني ضغطًا أو تشفيرًا) ثم ديناميكي في جهاز افتراضي معزول بلا شبكة حقيقية. YARA قواعد تطابق النصوص والبايتات في الملفات.
قبل أن تبدأ
🔎مشروع التحقيق في حادثة
حققت في سجلات وكتبت تقريرًا.
🔐التشفير
تعرف التجزئة SHA-256.
الفكرة الجوهرية
1ترتيب التطاير وسلسلة الحيازة
أول قرار في الحادثة: لا تطفئ الجهاز. إطفاؤه يمحو الذاكرة، وفيها العمليات الجارية والاتصالات المفتوحة ومفاتيح التشفير، وأحيانًا برنامج خبيث لا يكتب شيئًا على القرص. اعزله عن الشبكة (عبر EDR أو بفصل الشبكة لا الكهرباء)، والتقط الذاكرة، ثم انسخ القرص. وكل دليل له سجل حيازة: من جمعه، ومتى، وبأي أداة، وتجزئته، ومن استلمه بعده.
| الترتيب | المصدر | يختفي بعد | كيف تجمعه |
|---|---|---|---|
| 1 | الذاكرة والعمليات والاتصالات | إعادة التشغيل | التقاط حي (WinPmem أو EDR) |
| 2 | الملفات المؤقتة وذاكرة المتصفح | ساعات أو أيام | جمع الآثار (KAPE) |
| 3 | القرص | الكتابة فوقه | نسخة bit-for-bit مع مانع كتابة |
| 4 | السجلات البعيدة (SIEM) | مدة الاحتفاظ | تصدير مع التجزئة |
بت واحد يغير التجزئة كلها، لهذا تثبت التجزئة أن النسخة طبق الأصل ولم يمسها أحد.
import hashlib, json, datetime
disk = bytes(range(256)) * 4096 # stands in for a disk image
copy = bytearray(disk)
original_hash = hashlib.sha256(disk).hexdigest()
copy_hash = hashlib.sha256(copy).hexdigest()
record = {"item": "LAPTOP-HR-07 disk", "collected_by": "analyst A", "tool": "imager v4",
"utc": datetime.datetime(2026, 11, 2, 9, 14).isoformat(), "sha256": original_hash[:16] + "..."}
print(json.dumps(record, indent=1))
print("copy verified:", copy_hash == original_hash)
copy[1000] ^= 1 # one bit changes by accident
print("after one bit flips:", hashlib.sha256(copy).hexdigest() == original_hash)2الذاكرة والخط الزمني
في الذاكرة ترى ما كان يعمل لحظة الالتقاط. بـ Volatility تسأل: ما العمليات؟ من أبوها؟ ما الاتصالات المفتوحة؟ هل توجد شيفرة محقونة في عملية سليمة (malfind)؟ ثم تبني خطًا زمنيًا واحدًا من كل المصادر: سجلات الأحداث، وPrefetch، وتواريخ الملفات، والبروكسي، والبريد. القصة تظهر حين تصطف الأحداث بالدقيقة.
# Volatility 3 on a memory image from the lab vol -f laptop-hr-07.mem windows.pstree # who started whom: winword.exe -> powershell.exe is a red flag vol -f laptop-hr-07.mem windows.netscan # open connections and the process that owns each vol -f laptop-hr-07.mem windows.malfind # memory regions that look like injected code vol -f laptop-hr-07.mem windows.cmdline # the full command line of every process
سبعة أحداث من خمسة مصادر تصبح قصة: بريد، فماكرو، فأداة تحكم، فبقاء، فانتشار. هذا قلب تقرير الحادثة.
events = [
("2026-10-28 09:02:11", "email", "HR-07 receives 'Salary_review.docm' from an outside sender"),
("2026-10-28 09:05:40", "prefetch", "WINWORD.EXE runs"),
("2026-10-28 09:05:52", "sysmon 1", "winword.exe starts powershell.exe -enc ..."),
("2026-10-28 09:05:55", "proxy", "HR-07 -> cdn-update-sync.net (first time ever)"),
("2026-10-28 09:06:30", "sysmon 11","file C:\\Users\\Public\\upd.dll written"),
("2026-10-28 09:07:02", "4698", "scheduled task 'GoogleUpdateTaskCore' created"),
("2026-10-28 13:40:18", "4624", "HR-07 logs on to FILESRV-01 with admin rights (type 3)"),
]
for when, source, what in sorted(events):
print(f"{when} {source:<9} {what}")
first, last = events[0][0][11:16], events[-1][0][11:16]
print(f"from first email ({first}) to the file server ({last}): the attacker spent ~4.5 hours inside")3فحص ملف مشبوه بأمان
القاعدة الأولى: لا تفتح العينة على جهازك أبدًا. استخدم جهازًا افتراضيًا معزولًا بلا شبكة حقيقية (أو بشبكة مزيفة مثل INetSim)، والتقط لقطة نظيفة لتعود إليها. ابدأ ثابتًا بلا تشغيل: التجزئة (هل يعرفها أحد؟)، والنصوص (عناوين، وأوامر، ورسائل)، والدوال المستوردة (هل تطلب حقن عمليات أو تشفير ملفات؟)، والإنتروبيا: قسم قريب من 8 بت لكل بايت يعني بيانات مضغوطة أو مشفرة تخفي شيئًا. ثم ديناميكيًا: شغّلها وراقب العمليات والملفات والسجل والشبكة.
العينة هنا بايتات مصنوعة للتعلم، لا برنامج حقيقي. لاحظ أن آخر الملف قريب من 8: هكذا يبدو الجزء المضغوط.
import hashlib, math, re
from collections import Counter
def entropy(data):
counts = Counter(data)
return -sum(c / len(data) * math.log2(c / len(data)) for c in counts.values())
def strings(data, minimum=6):
return [s.decode() for s in re.findall(rb"[ -~]{%d,}" % minimum, data)]
sample = (b"MZ\x90\x00" + b"\x00" * 60 + b"This program cannot be run in DOS mode.\x00"
+ b"http://cdn-update-sync.net/gate.php" + b"\x00" * 20 + b"vssadmin delete shadows /all /quiet"
+ bytes((i * 167 + 13) % 256 for i in range(3000))) # a packed-looking blob
print("sha256 :", hashlib.sha256(sample).hexdigest()[:24], "...")
print("entropy: header", round(entropy(sample[:200]), 2), "| last 3000 bytes", round(entropy(sample[-3000:]), 2))
for s in strings(sample):
flag = " <- suspicious" if re.search(r"http|vssadmin|delete", s) else ""
print("string :", s[:60] + flag)4YARA: قاعدة تعرف العائلة
بعد التحليل، احفظ ما تعلمته في قاعدة YARA: نصوص وبايتات مميزة وشرط يجمعها. تشغّلها على كل الأجهزة (عبر EDR أو Velociraptor) لتجد نسخًا أخرى من العائلة نفسها حتى لو تغيرت تجزئتها.
rule Darb_Lab_Loader_Family
{
meta:
author = "your name"
description = "Loader seen in the HR-07 lab case: C2 gate + shadow-copy wipe"
date = "2026-11-02"
strings:
$mz = { 4D 5A }
$gate = "/gate.php" ascii
$vss = "vssadmin delete shadows" ascii nocase
$task = "GoogleUpdateTaskCore" ascii wide
condition:
$mz at 0 and filesize < 2MB and 2 of ($gate, $vss, $task)
}2 of)، فنص وحيد قد يظهر في برنامج سليم، والجمع يقلل الإيجابيات الكاذبة.مثال محلول
المسألة: المحلل في الوردية الليلية رأى تنبيه «PowerShell مشفر من Word» على جهاز في الموارد البشرية، وكتب: «أعدت تشغيل الجهاز ليتوقف البرنامج». ما الذي ضاع؟ وما الذي ما زال ممكنًا؟
الحل: ضاع: الذاكرة كلها: العمليات والاتصالات المفتوحة وأي شيفرة لم تُكتب على القرص، وربما مفاتيح. ما زال ممكنًا: (1) اعزل الجهاز الآن. (2) اجمع الآثار: Prefetch وAmcache ومفاتيح Run والمهام المجدولة (4698) وسجلات الأحداث وSysmon. (3) انسخ القرص بتجزئة. (4) اسحب من SIEM والبروكسي سجلات الجهاز. (5) ابنِ الخط الزمني. (6) افحص المرفق في مختبر معزول. (7) اكتب قاعدة YARA وشغّلها على كل الأجهزة. والدرس للفريق: «اعزل ولا تطفئ» في دليل الاستجابة.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| أطفئ الجهاز المخترق فورًا. | اعزله عن الشبكة واترك الكهرباء؛ الإطفاء يمحو أثمن دليل وهو الذاكرة. |
| حذف البرنامج الخبيث ينهي الحادثة. | السؤال الأهم: كيف دخل وماذا فعل وأين انتشر. بلا جواب سيعود. |
| تحليل البرمجيات الخبيثة للعباقرة فقط. | الفحص الثابت والديناميكي الأساسي يكفي لأغلب الحوادث، والهندسة العكسية العميقة تخصص لاحق. |
أين تقابله في العمل
🚨الاستجابة للحوادث
الخط الزمني هو ما يقرر نطاق الحادثة وما يجب تنظيفه.
⚖️القضايا القانونية
سلسلة الحيازة والتجزئات تجعل الدليل مقبولًا.
🧬فريق الاستخبارات
قواعد YARA من التحليل تُشارك مع القطاع.
اختبر فهمك
ما الذي تجمعه أولًا حسب ترتيب التطاير؟
الذاكرة تختفي بإعادة التشغيل، والقرص يبقى.
لماذا تحسب تجزئة SHA-256 للأصل والنسخة؟
أي بت يتغير يغير التجزئة كلها.
قسم في ملف إنتروبيته 7.9. ماذا يعني غالبًا؟
الحد الأقصى 8 بت للبايت، وقربه يعني عشوائية عالية.
أي أداة تحلل صورة الذاكرة؟
Volatility 3 يعرض العمليات والاتصالات والشيفرة المحقونة من الذاكرة.
أين تشغّل عينة برمجية خبيثة للتحليل الديناميكي؟
العزل يمنع انتشارها، واللقطة تعيدك لحالة نظيفة.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا تعزل الجهاز عن الشبكة بدل إطفائه؟
العزل يوقف تواصل المهاجم ويحفظ الذاكرة للتحليل.
ما الذي يجعل الخط الزمني أقوى من أي سجل وحده؟
أنه يجمع مصادر كثيرة فتظهر العلاقة بين الأحداث: البريد ثم الماكرو ثم الاتصال ثم الانتشار.
لماذا التحليل الثابت قبل الديناميكي؟
لأنه آمن بلا تشغيل، ويخبرك بما تتوقعه وما تراقبه حين تشغّل العينة.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
أدوات2
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.