مرحبًا مجددًا. في الدرس السابق فحصت البايتات داخل الملفات وميّزت النصوص عن البيانات الخام، وتعلمت أن اسم الملف أو ما يظهر في عمود النص لا يكفي للحكم على محتواه. الآن ننتقل إلى أداة أساسية قبل تحليل أي ملف: بصمة SHA-256.
خلال هذا الدرس ستتعلم حساب بصمة ملف في PowerShell، ومقارنتها ببصمة موثوقة للتحقق من سلامة الملف، وتوثيقها كمعرّف دقيق للعينة التي تحللها. هذه عادة مهمة قبل فتح ملف في Ghidra أو تشغيله لاحقًا داخل مختبر معزول: إذا تغيّر الملف، يجب أن تعرف ذلك بوضوح.
ما بصمة SHA-256، وما الذي تثبته؟
بصمة الملف، أو Hash، هي قيمة محسوبة من كل بايت في محتوى الملف باستخدام خوارزمية محددة. في حالتنا، الخوارزمية هي SHA-256، وهي اختصار لـ Secure Hash Algorithm 256-bit.
تأخذ الخوارزمية ملفًا بأي حجم، وتنتج قيمة ثابتة الطول: 256 بت، وتُعرض عادةً على شكل 64 خانة سداسية عشرية. مثلًا، هذه ليست بصمة حقيقية لملف معين، بل شكلها العام:
7F83B1657FF1FC53B92DC18148A1D65D...
كل خانتين سداسيتين عشريتين تمثلان بايتًا واحدًا، لذا فإن خانة Hex تمثل بايتًا، أي بت.
لا تحتاج إلى فهم الرياضيات الداخلية لـ SHA-256 الآن. المهم في التحليل العملي هو خصائصها:
- الحتمية: الملف نفسه، مع الخوارزمية نفسها، يعطي البصمة نفسها في كل مرة.
- الحساسية الشديدة للتغيير: تعديل بايت واحد، أو إضافة حرف، أو تغيير مورد داخل ملف PE، ينتج بصمة مختلفة تمامًا عمليًا.
- الاعتماد على المحتوى لا الاسم: إعادة تسمية
sample.exeإلىgame.exeلا تغيّر البصمة ما دامت البايتات نفسها. - مناسبة للتوثيق والمقارنة: يمكنك تسجيل SHA-256 لعينة، ثم التأكد لاحقًا أن الملف الذي لديك هو نفسه الذي حللته.

اقرأ الآن من وثائق Microsoft الرسمية لفهم العلاقة بين محتوى الملف وبصمته، ولمراجعة الصيغة الأساسية للأمر الذي سنستخدمه.
Get-FileHash (Microsoft.PowerShell.Utility) - PowerShell
تشرح وثائق Microsoft أن Get-FileHash يحسب البصمة من محتوى الملف نفسه، وتعرض بنية الأمر وخيارات الخوارزمية. اقرأها لتثبيت المفهوم قبل تطبيقه.
ابدأ من قسم Description. اقرأ فكرة البصمة مع الانتباه إلى الفرق بين تغيير الاسم وتغيير المحتوى. ثم انتقل إلى قسم Syntax وقسم Examples، وبعدهما إلى العنوان الفرعي -Algorithm ضمن Parameters؛ راجع خيارات الخوارزمية. ركّز على أن SHA256 هي القيمة الافتراضية، وأنك ستذكرها صراحة في أوامرك للتوثيق الواضح.
البصمة ليست حكمًا على “أمان” الملف
هذه نقطة دقيقة ومهمة، خصوصًا عند التعامل لاحقًا مع عينات تدريبية أو ملفات مجهولة:
- إذا تطابقت بصمتك مع بصمة منشورة من مصدر موثوق، فهذا دليل قوي على أن الملف الذي لديك يطابق البايتات التي نشرها ذلك المصدر.
- إذا اختلفت البصمتان، فالملف ليس مطابقًا للنسخة المرجعية. قد يكون التنزيل تالفًا، أو قد تكون حملت إصدارًا مختلفًا، أو قد يكون الملف تغير بعد تنزيله.
- إذا لم تكن لديك بصمة مرجعية موثوقة، يمكنك حساب SHA-256 لتوثيق الملف أو البحث عنه في مصادر تحليل مسموح بها، لكنك لا تستطيع من البصمة وحدها إثبات أن الملف آمن أو شرعي.
- تطابق بصمة منشورة في صفحة غير موثوقة لا يثبت هوية الناشر؛ قد يغيّر مهاجم الملف والبصمة المعروضة معه. الثقة في المصدر أو التوقيع الرقمي مسألة مختلفة.
إذن، في هذا الدرس سنستخدم كلمة هوية بمعنى عملي محدود: “هل هذه هي البايتات نفسها للملف المرجعي أو للعينة التي وثّقتها سابقًا؟” وليست بمعنى “من الذي أنشأ الملف؟”.
حساب SHA-256 في PowerShell
في Windows 10، افتح PowerShell واستخدم الأمر:
Get-FileHash -LiteralPath "C:\Lab\sample.exe" -Algorithm SHA256
استبدل المسار بمسار ملف موجود لديك. ستظهر نتيجة تحتوي عادةً على ثلاثة حقول:
| الحقل | معناه |
|---|---|
Algorithm | الخوارزمية المستخدمة، ويجب أن تكون SHA256 |
Hash | البصمة الفعلية المكوّنة من 64 خانة Hex |
Path | الملف الذي حُسبت له البصمة |
استخدمنا -LiteralPath بدل -Path لأن الأول يعامل المسار حرفيًا. هذا مفيد إذا احتوى اسم الملف على رموز مثل الأقواس المربعة التي قد يفسرها PowerShell كأنماط بحث عند استخدام -Path.

يمكنك حذف -Algorithm SHA256 لأن SHA-256 هي الخوارزمية الافتراضية، لكن اكتبها صراحة في ملاحظاتك وأوامرك أثناء التحليل. ذلك يجعل السجل واضحًا: من يقرأ الملاحظة يعرف فورًا أن القيمة هي SHA-256 وليست MD5 أو SHA-1 أو SHA-512.
صيغة مختصرة مفيدة عند الحاجة إلى البصمة فقط:
(Get-FileHash -LiteralPath "C:\Lab\sample.exe" -Algorithm SHA256).Hash
أما لعرض الحقول بوضوح:
Get-FileHash -LiteralPath "C:\Lab\sample.exe" -Algorithm SHA256 |
Format-List Algorithm, Hash, Path
لماذا لا نستخدم MD5 أو SHA-1 للتحقق الأمني؟
قد تصادف MD5 وSHA-1 كثيرًا في أدوات قديمة أو قواعد بيانات تاريخية. يمكنهما أحيانًا كشف التغيير العادي غير المقصود، لكنهما لم يعودا مناسبين عندما يكون احتمال التلاعب المتعمد مهمًا. لهذا استخدم SHA-256 افتراضيًا ما لم يفرض المصدر خوارزمية مختلفة.
المبدأ الأساسي: يجب أن تتطابق الخوارزمية في الطرفين. لا تقارن قيمة MD5 منشورة بقيمة SHA-256 حسبتها محليًا؛ فهما ناتجان من خوارزميتين مختلفتين، ولذلك لن يتطابقا مهما كان الملف صحيحًا.
شاهد هذا الجزء القصير من فيديو How to Verify File Integrity with Checksum using PowerShell من قناة ACI Learning. يقدم مثالًا مرئيًا لفكرة نشر البصمة ثم حسابها محليًا باستخدام PowerShell.
How to Verify File Integrity with Checksum using PowerShell
يوضح الفيديو كيف تُنشر بصمة SHA-256 للملفات، ولماذا يجب حساب البصمة بالخوارزمية نفسها، ثم يطبق Get-FileHash على ملف محلي.
شاهد مبدأ المقارنة لفهم دور البصمة المنشورة وضرورة اختيار الخوارزمية نفسها. ثم شاهد حساب البصمة لمتابعة استخدام Get-FileHash مع مسار الملف وخيار SHA-256. لا تعتمد على الفحص البصري لأول وآخر بضعة أحرف؛ سنجعل PowerShell يقارن القيمة كاملة.
مقارنة البصمة: المطابقة الكاملة أو عدم المطابقة
لنفترض أن مصدرًا رسميًا موثوقًا نشر قيمة SHA-256 لملف باسم training-tool.zip. بعد تنزيل الملف، انسخ القيمة المنشورة في متغير، ثم قارنها بالبصمة المحلية.
$file = "C:\Users\Student\Downloads\training-tool.zip"
$expected = (
"PUT_THE_TRUSTED_SHA256_VALUE_HERE"
).Trim().ToUpperInvariant()
$actual = (
Get-FileHash -LiteralPath $file -Algorithm SHA256
).Hash.ToUpperInvariant()
$actual -ceq $expected
ستظهر إحدى قيمتين:
True
تعني أن البصمة المحلية تطابق القيمة المرجعية كاملة.
False
تعني أن الملف لا يطابق المرجع. لا تحاول “تجاهل فرق صغير”: في SHA-256، اختلاف حرف واحد في البصمة يعني أن البصمتين مختلفتان، وبالتالي لا يوجد تطابق.
استخدمنا هنا:
Trim()لإزالة المسافات أو سطر جديد قد يلتصق بالقيمة عند النسخ.ToUpperInvariant()لجعل شكل الحروف موحدًا، لأنaوAيمثلان القيمة السداسية نفسها.-ceqلمقارنة النصين بعد توحيدهما. الأهم هو مقارنة كامل ناتجHash، لا مقارنة بداية القيمة أو نهايتها فقط.
يمكنك عرض تقرير صغير بدل نتيجة منطقية فقط:
[PSCustomObject]@{
File = $file
Expected = $expected
Actual = $actual
Match = ($actual -ceq $expected)
}
تفسير النتيجة بطريقة صحيحة
| النتيجة | ما الذي تعرفه؟ | ما الإجراء المناسب؟ |
|---|---|---|
True | الملف يطابق البايتات التي تمثلها القيمة المرجعية | احتفظ بسجل البصمة والمصدر وتاريخ التحقق |
False | الملف لا يطابق المرجع | أوقف الاستخدام أو التحليل الديناميكي، وتحقق من الإصدار والرابط ومصدر البصمة |
| لا توجد بصمة مرجعية | لديك معرّف للعينة، لا تحقق من سلامتها بالنسبة إلى مصدر | سجّل SHA-256 قبل التحليل وقارنها لاحقًا عند الحاجة |
عند وجود عدم تطابق، لا يعني ذلك تلقائيًا وجود برمجية خبيثة. قد تكون حملت إصدارًا أحدث أو ملفًا مختلفًا يحمل اسمًا متشابهًا. لكنه يعني شيئًا محددًا وقابلًا للتصرف: لا تملك النسخة التي تشير إليها البصمة المرجعية.
مختبر عملي: لاحظ أثر تعديل صغير بنفسك
خصص نحو 15 دقيقة لهذا المختبر داخل جهازك الافتراضي. ستنشئ ملفًا نصيًا بنفسك، وتحسب بصمته، وتغير بايتًا واحدًا منطقيًا بإضافة علامة !، ثم تعيد الملف إلى حالته الأصلية.
افتح PowerShell ونفذ الأوامر التالية بالترتيب:
$lab = Join-Path $PWD "hash-lab"
New-Item -ItemType Directory -Force $lab | Out-Null
$file = Join-Path $lab "sample.txt"
[System.IO.File]::WriteAllText(
$file,
"Reverse engineering lab",
[System.Text.Encoding]::ASCII
)
$expected = (
Get-FileHash -LiteralPath $file -Algorithm SHA256
).Hash
$expected
احتفظ بالقيمة التي ظهرت؛ هذه هي بصمتك المرجعية للنسخة الأولى من الملف. بعد ذلك، أعد حساب البصمة دون تغيير الملف:
$again = (
Get-FileHash -LiteralPath $file -Algorithm SHA256
).Hash
$again -ceq $expected
يجب أن تكون النتيجة True. الآن عدّل محتوى الملف بإضافة رمز واحد فقط:
[System.IO.File]::AppendAllText(
$file,
"!",
[System.Text.Encoding]::ASCII
)
$modified = (
Get-FileHash -LiteralPath $file -Algorithm SHA256
).Hash
$modified
$modified -ceq $expected
سترى بصمة مختلفة ونتيجة False. لاحظ أن التغيير كان بسيطًا جدًا داخل النص، لكن قيمة SHA-256 الجديدة لن تبدو وكأنها “تغيّر صغير” من القيمة الأولى. هذا السلوك مقصود: البصمة لا تُظهر مكان الاختلاف أو حجمه، بل تجيب عن سؤال المطابقة فقط.
أعد الملف الآن إلى محتواه الأصلي، ثم تحقق للمرة الأخيرة:
[System.IO.File]::WriteAllText(
$file,
"Reverse engineering lab",
[System.Text.Encoding]::ASCII
)
$restored = (
Get-FileHash -LiteralPath $file -Algorithm SHA256
).Hash
$restored -ceq $expected
يجب أن تعود النتيجة إلى True. هذا يبرهن على خاصيتين عمليتين: SHA-256 حتمية للملف نفسه، وحساسة لأي تغيير في البايتات.
عادة توثيق مفيدة في الهندسة العكسية
قبل استيراد ملف مصرح بتحليله إلى Ghidra، أو تشغيل عينة تدريبية في آلة افتراضية، سجّل على الأقل:
اسم الملف: sample.exe
المسار: C:\Lab\samples\sample.exe
الحجم: 123456 bytes
SHA-256: [القيمة الكاملة]
تاريخ الحصول عليه: [التاريخ]
المصدر أو سبب الحصول عليه: [وصف مختصر]
لاحظ أن الاسم والمسار قد يتغيران، لكن SHA-256 تربط ملاحظاتك بالنسخة الثنائية المحددة التي حللتها. إذا أعطاك شخص ملفًا بالاسم نفسه لاحقًا وكانت بصمته مختلفة، عامله كعينة مختلفة حتى لو بدا الاسم والواجهة متشابهين.
هذه العادة مهمة أيضًا عندما تعدّل ملفًا تدريبيًا لاحقًا: احفظ بصمة النسخة الأصلية وبصمة النسخة المعدلة. بذلك تستطيع إثبات أن التغيير وقع، والعودة إلى الأصل بدل الاعتماد على الذاكرة أو اسم مثل final_final2.exe.
خلاصة
أصبحت قادرًا الآن على استخدام SHA-256 بصفة عملية ومنضبطة:
- بصمة SHA-256 تمثل محتوى الملف، لا اسمه أو امتداده أو موقعه.
- الملف نفسه يعطي البصمة نفسها دائمًا عند استخدام الخوارزمية نفسها.
- تغيير بايت واحد يكفي لإنتاج بصمة مختلفة.
- استخدم
Get-FileHash -LiteralPath ... -Algorithm SHA256في PowerShell لحساب البصمة. - للتحقق، قارن قيمة
Hashكاملة مع قيمة مرجعية موثوقة وبالخوارزمية نفسها. - تطابق البصمة يثبت مطابقة المحتوى للمرجع، لكنه لا يثبت وحده أن الملف آمن أو أن الناشر موثوق.
- في التحليل العكسي، سجّل SHA-256 قبل العمل على أي عينة للحفاظ على سلسلة واضحة بين ملفك وملاحظاتك.
بهذا تكتمل أدواتك الأولية للتعامل الآمن مع البيانات والملفات الثنائية في Windows. في الوحدة التالية ستبدأ أساسيات C وPython اللازمة لفهم كيف تتحول المتغيرات والشروط والدوال في الكود عالي المستوى إلى ما ستراه لاحقًا في الذاكرة وAssembly.
Can't find a good explanation? Sign up and we'll make it for you
Sign up