Create your own
Lesson illustration

استعراض الملفات والعمليات والخدمات باستخدام PowerShell

مرحبًا. بعد أن ثبتنا قاعدة التصريح القانوني وجهزنا آلة Windows افتراضية معزولة مع لقطة استعادة نظيفة، حان وقت التعرف إلى النظام من منظور المحلل. قبل فتح أي ملف تدريبي في Ghidra أو تشغيله تحت مصحح أخطاء، نحتاج إلى إجابة أسئلة أولية: ما الملفات الموجودة في مجلد المختبر؟ ما العمليات النشطة؟ وما الخدمات التي تعمل في الخلفية؟

في هذا الدرس ستستخدم PowerShell لجمع هذه المعلومات بطريقة منظمة وقرائية فقط. ستتعلم التعامل مع ثلاثة أوامر مركزية: Get-ChildItem للملفات والمجلدات، وGet-Process للعمليات، وGet-Service للخدمات. في نهاية الدرس ستتمكن من كتابة ملاحظات أولية قابلة لإعادة الإنتاج عن حالة بيئة المختبر، دون تغييرها.


PowerShell: لا تجمع نصًا فقط، بل كائنات

افتح Windows PowerShell داخل الآلة الافتراضية المخصصة للمختبر. لا تحتاج إلى تشغيله كمسؤول لتنفيذ أوامر الاستعراض الأساسية في هذا الدرس. إن رفض Windows عرض خاصية معينة لعملية لا تملكها، دوّن ذلك بوصفه قيد صلاحيات؛ لا ترفع الصلاحيات تلقائيًا لمجرد إزالة رسالة خطأ.

تتبع معظم أوامر PowerShell نمطًا واضحًا: فعل ثم اسم. مثلًا:

  • Get-ChildItem: اجلب العناصر الفرعية في موقع ما.
  • Get-Process: اجلب العمليات.
  • Get-Service: اجلب الخدمات.

القيمة المهمة هنا أن هذه الأوامر لا تعيد سطور نصية جامدة فقط، بل تعيد كائنات لها خصائص مثل الاسم، والمسار، والحجم، والمعرف، والحالة. تستطيع تمرير هذه الكائنات عبر الرمز | إلى أمر آخر لاختيار خصائص محددة أو ترتيب النتائج.

مثال بسيط:

Get-Process -Name notepad | Select-Object Id, ProcessName, Path

الأمر الأول يجلب عملية Notepad، ثم يعرض الأمر الثاني ثلاث خصائص فقط: المعرف، والاسم، ومسار الملف التنفيذي.

اقرأ أولًا جدول أوامر وحدة الإدارة الرسمية من Microsoft. لا تحفظ الجدول كله؛ المطلوب أن تربط أسماء الأوامر بوظائفها الأساسية.

Microsoft.PowerShell.Management Module - PowerShell

اقرأ جدول Microsoft.PowerShell.Management Cmdlets من Microsoft Learn لفهم نمط أوامر الإدارة في PowerShell وتحديد الأوامر الثلاثة التي سنستخدمها.

في قسم Microsoft.PowerShell.Management Cmdlets، انتقل داخل الجدول إلى مدخل Get-ChildItem، ثم مدخل Get-Process، وأخيرًا مدخل Get-Service. ركّز على الفرق بين ما يستعرضه كل أمر، لا على الأوامر التي تغيّر النظام مثل Stop-Process أو Restart-Service.

عندما تنسى صيغة أمر، لا تعتمد على التخمين. استخدم المساعدة المدمجة، وهي متاحة محليًا:

Get-Help Get-ChildItem -Examples
Get-Help Get-Process -Examples
Get-Help Get-Service -Examples

استعراض الملفات والمجلدات باستخدام Get-ChildItem

في تحليل البرامج، يبدأ الفحص الساكن غالبًا من الموقع: أين وُجد الملف؟ ما اسمه؟ متى عُدّل؟ ما حجمه؟ هذه ليست أدلة قاطعة على وظيفة الملف، لكنها تشكل وصفًا أوليًا مفيدًا قبل حساب البصمة أو فتح الملف في محرر سداسي عشري.

يعرض الأمر التالي محتويات مسار محدد:

Get-ChildItem -Path "C:\Users\labuser\Documents"

استبدل labuser باسم حساب المختبر الخاص بك، أو استخدم المتغير $HOME الذي يشير عادة إلى مجلد المستخدم الحالي:

Get-ChildItem -Path "$HOME\Documents"

يعرض PowerShell عادةً أعمدة مثل:

العمودمعناه العملي
Modeصفات العنصر، ومنها كونه ملفًا أو مجلدًا وبعض السمات الأخرى
LastWriteTimeآخر وقت تعديل مسجل للعنصر
Lengthحجم الملف بالبايت؛ يظل فارغًا عادةً للمجلدات
Nameاسم الملف أو المجلد
لقطة PowerShell تعرض ناتج `Get-ChildItem` لمسار ملفات، وفيها مجلدات وملفات مع أعمدة السمات ووقت آخر تعديل والحجم والاسم؛ وهي الصورة الأساسية لنوع المعلومات الأولية التي تجمعها عن مجلد المختبر.

انتبه إلى نقطتين مهمتين:

  1. الاسم والامتداد ليسا حقيقة الملف. قد يسمى الملف report.txt بينما يكون محتواه مختلفًا، وقد يحمل برنامج امتدادًا مضللًا. سنتحقق من المحتوى والبصمة لاحقًا.
  2. وقت التعديل قرينة وليس إثباتًا. يمكن تغييره بالنسخ أو الأدوات أو اختلاف ساعة النظام. سجله، لكن لا تبنِ استنتاجًا حاسمًا عليه وحده.

شاهد الآن الجزء العملي من فيديو «PowerShell Quick Tips: Get-ChildItem» لقناة JackedProgrammer. يركز على الاستعراض المعتاد، والملفات المخفية، والنزول إلى المجلدات الفرعية، والتصفية حسب النوع.

PowerShell Quick Tips : Get-ChildItem

شاهد هذا الجزء لتتعرف بصريًا إلى أثر الخيارات الأساسية لـGet-ChildItem عند استعراض مجلدات حقيقية، خصوصًا -Force و-Recurse و-File.

شاهد استعراض الملفات. ركز على الفرق بين الاستعراض المباشر للمجلد، وإظهار العناصر المخفية بـ-Force، والنزول في المجلدات الفرعية بـ-Recurse، وقصر النتائج على الملفات بـ-File. تجاهل في هذا الدرس الجزء اللاحق المتعلق بالسجل والشهادات.

خيارات تحتاجها في المختبر

لعرض الملفات فقط، دون المجلدات:

Get-ChildItem -Path "$HOME\Documents" -File

لعرض المجلدات فقط:

Get-ChildItem -Path "$HOME\Documents" -Directory

لعرض العناصر المخفية أيضًا:

Get-ChildItem -Path "$HOME\Documents" -Force

لا يعني -Force أن PowerShell “يكسر” حماية الملفات أو يمنحك صلاحيات إدارية؛ في هذا السياق هو يطلب عرض العناصر المخفية وعناصر النظام التي لا تظهر في الاستعراض الافتراضي.

للبحث داخل المجلدات الفرعية، استخدم -Recurse. احصر النطاق دائمًا في مجلد المختبر بدل استخدامه على القرص C:\ كاملًا؛ الاستعراض الواسع ينتج ضوضاء كبيرة، وقد يواجه مسارات محمية، ولن يفيدك في تحليل ملف تدريبي واحد.

Get-ChildItem -Path "$HOME\Documents" -Recurse -File

إذا أردت ملفات ذات امتداد محدد، فلتكن النية واضحة في الأمر:

Get-ChildItem -Path "$HOME\Documents" -Recurse -File -Filter "*.exe"

ولكي تحصل على سجل موجز يمكن نقله إلى ملاحظات التحليل، اختر الحقول ذات الصلة بدل عرض كل شيء:

Get-ChildItem -Path "$HOME\Documents" -Recurse -File |
    Select-Object Name, Extension, Length, LastWriteTime, FullName

الخاصية FullName مهمة جدًا؛ فوجود اسم متشابه لا يكفي. في التحليل، المسار الكامل يميز مثلًا بين ملف مشروع داخل مجلد المختبر وملف آخر يحمل الاسم نفسه في مجلد مختلف.


العمليات: ما الذي يعمل الآن؟

العملية (Process) هي نسخة قيد التنفيذ من برنامج. عندما تفتح Notepad، لا تكتفي Windows بوجود ملف notepad.exe على القرص؛ بل تنشئ عملية لها معرف خاص وذاكرة وموارد نظام وسياق تنفيذ.

لهذا السبب، تحليل الملفات وحده لا يكفي. قد يكون ملف ما موجودًا في القرص لكنه لم يُشغّل قط، وقد تكون عملية ما نشطة الآن وموضعها أو خصائصها تستحق التدقيق.

Get-Process
لقطة PowerShell تعرض ناتج `Get-Process` وقائمة عمليات Windows الجارية، بما فيها الذاكرة ووقت المعالج ومعرف العملية واسمها؛ هذه الحقول تساعد على بناء صورة أولية عن حالة النظام الحية.

العرض الافتراضي يتضمن أعمدة مهمة:

العمودما الذي يوضحه؟ملاحظة تحليلية
Handlesمراجع مفتوحة إلى موارد نظام مثل ملفات أو كائنات أو مقابضرقم مرتفع وحده ليس دليلًا على السوء
NPM(K)ذاكرة غير قابلة للترحيل بالـKBمعلومة استهلاك ذاكرة متخصصة
PM(K)ذاكرة قابلة للترحيل بالـKBلا تفسرها وحدها كاستهلاك حقيقي كامل
WS(K)مجموعة الذاكرة العاملة للعملية بالـKBمؤشر تقريبي للصفحات المستخدمة حديثًا
CPU(s)مجموع وقت المعالج المستخدم منذ بدء العمليةليس نسبة استخدام لحظية للمعالج
Idمعرف العملية، أو PIDيتغير بين مرات التشغيل ويمكن إعادة استخدامه
SIمعرف الجلسةيساعد على التفريق بين جلسات المستخدمين
ProcessNameاسم العمليةغالبًا يظهر دون الامتداد .exe

شاهد الجزء التالي من فيديو «Intro to PowerShell: Investigating Windows Processes» لقناة The Cyber Mentors. الهدف هنا ليس افتراض أن كل عملية غريبة خبيثة، بل تعلم اختيار معلومات مفيدة وفصل الإشارة عن الضوضاء.

Intro to PowerShell: Investigating Windows Processes

يعرض هذا المقطع استخدام Get-Process لفهم العمليات النشطة، ثم يشرح التصفية بالاسم أو المعرف واختيار خصائص مثل المسار والوصف.

شاهد مخرجات العمليات لفهم أعمدة Get-Process ومعنى PID ووقت CPU. ثم شاهد التصفية والعرض لتتعلم التصفية باسم العملية أو رقمها واستخدام Select-Object وFormat-List عند قص الأعمدة الطويلة.

الوصول إلى عملية معروفة

بدل فحص عشرات العمليات دفعة واحدة، ابدأ بعملية تعرفها. مثلًا، بعد فتح Notepad:

Get-Process -Name notepad

يمكن حذف اسم الوسيط -Name لأنه الموضع الأول في هذا الأمر، لكن الصيغة الصريحة أوضح للمبتدئ:

Get-Process -Name notepad

تستطيع استخدام محرف المطابقة * عندما تعرف جزءًا من الاسم فقط:

Get-Process -Name "note*"

وللتعامل مع عملية محددة بدقة، استخدم PID:

Get-Process -Id 1234

استبدل 1234 بالرقم الذي ظهر لك. لا تنس أن PID ليس هوية دائمة للبرنامج؛ عند إغلاق العملية قد يختفي المعرف، وقد يُعطى لاحقًا لعملية أخرى.

يمكنك أيضًا تحديد عملية جلسة PowerShell الحالية نفسها عبر المتغير التلقائي $PID:

Get-Process -Id $PID

اختيار المعلومات المفيدة بدل قراءة جدول مزدحم

عند استعراض عملية تملكها، جرّب:

Get-Process -Name notepad |
    Select-Object Id, ProcessName, Path, StartTime, CPU, WorkingSet |
    Format-List

استخدم Format-List عندما تريد أن ترى المسار الكامل دون أن يختصره الجدول.

قد تظهر قيمة فارغة للمسار أو رسالة رفض وصول عند فحص بعض عمليات النظام. هذا متوقع أحيانًا، خصوصًا دون صلاحيات إدارية أو عند وجود اختلاف في معمارية العملية وبيئة PowerShell. لا تحوّل غياب الخاصية تلقائيًا إلى مؤشر خبيث.

لترتيب العمليات حسب الذاكرة العاملة، استخدم:

Get-Process |
    Sort-Object -Property WorkingSet -Descending |
    Select-Object -First 10 ProcessName, Id, WorkingSet

هذه قائمة ترتيبية مفيدة، لكنها ليست حكمًا أمنيًا. متصفح الويب أو أداة تحليل كبيرة قد تستهلك ذاكرة كثيرة بصورة طبيعية. التحليل الجيد يجمع عدة قرائن: الاسم، المسار، التوقيت، السلوك، ونتائج الفحص الساكن لاحقًا.


الخدمات: برامج خلفية يديرها Windows

الخدمة (Service) مكوّن يعمل في الخلفية أو يُشغّل عند الحاجة تحت إدارة Windows. بعض الخدمات تنفذ داخل عملية مستقلة، وبعضها قد يشارك عملية استضافة مع خدمات أخرى. لذلك، لا تساوِ بين اسم الخدمة واسم عملية واحد بصورة تلقائية.

يعرض الأمر التالي قائمة الخدمات:

Get-Service

الحقول الأساسية هي:

الحقلمعناه
Statusالحالة الحالية، مثل Running أو Stopped
Nameالاسم الداخلي الذي تستخدمه الأوامر والبرامج
DisplayNameالاسم الوصفي الذي يظهر عادة في واجهة Windows

للحصول على عرض مرتب وقابل للقراءة:

Get-Service |
    Sort-Object Status, Name |
    Select-Object Status, Name, DisplayName

إذا كنت تعرف الاسم الداخلي لخدمة، مثل خدمة وقت Windows التي يكون اسمها المعتاد w32time:

Get-Service -Name w32time

أما إن كنت تعرف الاسم المعروض فقط، فاستخدم -DisplayName:

Get-Service -DisplayName "*Windows Time*"

هناك فرق أساسي بين شيئين:

  • Status يصف ما إذا كانت الخدمة تعمل الآن.
  • إعداد البدء يصف ما إذا كانت الخدمة مضبوطة لتبدأ تلقائيًا أو يدويًا أو معطلة.

يعرض Get-Service الحالة الأساسية جيدًا، لكن للحصول على إعداد البدء والمسار التنفيذي في استعلام قرائي واحد، يمكن استخدام Get-CimInstance:

Get-CimInstance -ClassName Win32_Service -Filter "Name='w32time'" |
    Select-Object Name, DisplayName, State, StartMode, PathName |
    Format-List

هذا لا يشغّل الخدمة ولا يوقفها؛ إنه يجمع معلومات فقط. ستفيدك خاصية PathName لاحقًا عند ربط خدمة بملف تنفيذي معيّن، لكن لا تستنتج أن المسار وحده يثبت موثوقية الملف.

في هذا الدرس، لا تستخدم أوامر مثل Stop-Service أو Restart-Service أو Set-Service. توقف خدمة غير مناسبة قد يعطل نظام المختبر أو يغيّر الحالة التي تحاول توثيقها.


مختبر عملي: بناء خط أساس صغير لآلة المختبر

خصص نحو 20 دقيقة للتطبيق التالي داخل الآلة الافتراضية فقط. لا تحتاج إلى عينة تنفيذية أو ملف غير موثوق؛ سننشئ ملفات نصية تعليمية غير ضارة ونجمع وصفًا أوليًا للحالة.

1. أنشئ مجلدًا تدريبيًا آمنًا

انسخ الأوامر التالية بالتتابع:

$lab = Join-Path $HOME "RE-Lab"

New-Item -ItemType Directory -Path "$lab\Files\Nested" -Force

Set-Content -Path "$lab\Files\alpha.txt" -Value "training note"
Set-Content -Path "$lab\Files\Nested\beta.log" -Value "nested record"

المتغير $lab يحتفظ بمسار مجلد التدريب داخل حسابك الحالي. استخدمناه حتى لا تكتب مسارًا طويلًا كل مرة.

2. اجمع قائمة الملفات

ابدأ بالاستعراض المباشر:

Get-ChildItem -Path "$lab\Files"

ثم اجمع الملفات داخل المجلدات الفرعية مع معلوماتها الأساسية:

Get-ChildItem -Path "$lab\Files" -Recurse -File |
    Select-Object Name, Extension, Length, LastWriteTime, FullName

وأظهر ملفات النص فقط:

Get-ChildItem -Path "$lab\Files" -Recurse -File -Filter "*.txt" |
    Select-Object Name, Length, LastWriteTime, FullName

دوّن في ملاحظاتك المسار الكامل لـalpha.txt وحجمه ووقت آخر تعديل. هذه هي نفس البنية التي ستستخدمها لاحقًا عند وصف ملف تدريبي مصرح به.

3. افحص عملية تتحكم بها أنت

افتح الملف باستخدام Notepad:

notepad.exe "$lab\Files\alpha.txt"

واترك Notepad مفتوحًا، ثم نفّذ:

Get-Process -Name notepad |
    Select-Object Id, ProcessName, Path, StartTime, CPU, WorkingSet |
    Format-List

سجّل PID والمسار ووقت البداية. بعد ذلك، أغلق Notepad وأعد تنفيذ الأمر نفسه. ستلاحظ أن النتيجة تختفي، لأن العملية انتهت. هذه تجربة صغيرة تثبت أن العملية حالة وقت تشغيل وليست مجرد ملف موجود على القرص.

افحص أيضًا جلسة PowerShell الحالية:

Get-Process -Id $PID |
    Select-Object Id, ProcessName, Path, StartTime |
    Format-List

4. افحص خدمة واحدة وخدمات النظام عمومًا

ابدأ بقائمة منظمة:

Get-Service |
    Sort-Object Status, Name |
    Select-Object Status, Name, DisplayName

ثم افحص خدمة وقت Windows:

Get-Service -Name w32time |
    Format-List Status, Name, DisplayName

ولعرض إعداد البدء والمسار المرتبط بها، نفّذ:

Get-CimInstance -ClassName Win32_Service -Filter "Name='w32time'" |
    Select-Object Name, State, StartMode, PathName |
    Format-List

إذا لم تجد الخدمة بسبب اختلاف إصدار Windows أو إعداداته، اختر اسم خدمة موجودًا ظهر في ناتج Get-Service واستخدمه مكان w32time.

5. وثّق النتيجة كمحلل

أنشئ في ملاحظاتك جدولًا صغيرًا بهذه البنية:

وقت الجمعنوع العنصرالاسم أو PIDالمسار أو الحالةالأمر المستخدمملاحظة
الوقت المحليملفalpha.txtالمسار الكامل والحجمGet-ChildItem ...ملف تدريبي أنشأته
الوقت المحليعمليةPID الخاص بـNotepadمسار Notepad ووقت البدءGet-Process ...ظهرت عند فتح الملف واختفت بعد إغلاقه
الوقت المحليخدمةw32time أو بديلالحالة وإعداد البدءGet-Service أو Get-CimInstanceحالة نظام طبيعية في المختبر

الملاحظة المهنية الأهم: لا تكتب «سليم» أو «خبيث» بناءً على حقل واحد. اكتب ما رأيته فعليًا، وما الذي لا تعرفه بعد. مثلًا: «اسم العملية ومسارها معروفان، لكن لم أتحقق بعد من البصمة أو التوقيع أو محتوى الملف».


الخلاصة

أصبحت تملك الآن ثلاث عدسات أولية لفحص Windows داخل مختبرك:

  • Get-ChildItem يستعرض الملفات والمجلدات ويجمع الاسم والمسار والحجم والطابع الزمني.
  • Get-Process يعرض البرامج النشطة ومعلومات مثل PID والمسار ووقت البدء واستهلاك الذاكرة.
  • Get-Service يعرض الخدمات وحالتها وأسماءها، ويمكن توسيع الفحص قرائيًا بـGet-CimInstance لمعرفة إعداد البدء والمسار.
  • التصفية المبكرة وتحديد الخصائص عبر Select-Object يجعلان الناتج أقل ضوضاء وأسهل للتوثيق.
  • المعلومة الأولية ليست حكمًا نهائيًا؛ هي أساس لفرضية ستختبرها لاحقًا بالهاش، وفحص PE، والتحليل الساكن والديناميكي.

في الدرس التالي ستنتقل إلى لغة الأرقام التي تراها باستمرار في أدوات الهندسة العكسية: التحويل بين النظام العشري والثنائي والسداسي عشري، بما في ذلك قيم PID والأحجام والعناوين.

Can't find a good explanation? Sign up and we'll make it for you

Sign up