في الكثير من الحالات نحتاج إلى التحقق بشكل يدوي من بعض الملفات التي قد نشك بأنها تقوم ببعض العمليات الضارة داخل النظام الخاص بنا ، لذلك يجب علينا أن نتعلم كيفية تحليل هذه الملفات وإستخراج بعض المكتبات التي تستدعيها أو مثلاً العمليات تقوم بها ، والعديد من المعلومات والأمور الأخرى التي قد تفيدنا وتساعدنا في تحديد طبيعة هذا الملف ، وفي مقالنا اليوم سوف نتعرف على كيفية تنفيذ بعض التحاليل البسيطة على الملفات التنفيذية الخاصة بنظام Windows وإستخراج العديد من المعلومات حولها.

ولكن قبل ذلك دعونا نتعرف قليلاً على مفهوم Malware analysis أو تحليل الملفات الضارة ، غالباً ما نسمع مُصطلح الملفات الضارة “Malwares” والتي يُمكننا أن نُعرفها بالمُصطلح “malicious software” وهي البرمجيات التي تقوم بأعمال ضارة على جهاز الهدف بشكل غير مُصرح وقد تختلف طبيعة هذه الأعمال بإختلاف الأهداف الخاصة بالمُهاجم ، وهُنالك العديد من أنواع الملفات الضارة التي قد تُصيب الأنظمة مثل Worms , Viruses , Botnets وإلى أخره من هذه الملفات الضارة التي نعرفها ونعرف تفاصيلها.

تحليل الملفات الضارة – Malware analysis

نستطيع تعريف عملية تحليل الملفات الضارة “Malware Analysis” بأنها عملية دراسة وتحليل الملفات الضارة بهدف إستخراج الوظائف والأمور الضاره التي يقوم بها على نظام الهدف بغرض إلحاق الضرر وسرقة البيانات من هذا النظام بشكل غير مُصرح له بالقيام بهذه الوظائف.

أنواع تحليل الملفات الضارة – Malware Analysis Types

عملية تحليل الملفات الضارة تُقسم لقسمين هُما :

  • التحليل الثابت (Static Malware Analysis) : ويُمكن تسميته أيضاً code analysis وهو التحليل الذي نقوم به بمحاولة فهم الكود البرمجي للبرنامج دون تشغيله ، حيث نقوم بعملية disassembling له ، والإطلاع على المكتبات والأمور التي يستخدمها بشكل سريع لأخذ نظرة عامة عن البرنامج ، وهذا ما سوف نقوم به سريعاً في هذا المقال إن شاء الله وسوف نضمن أن نتحدث عنه أثناء مجموعة من المقالات الأخرى بإذن الله تعالى.
  • التحليل الفعال (Dynamic Malware Analysis) : هو التحليل الذي يعتمد على تتبع سلوكيات البرنامج ورصدها ومراقبة النشاطات التي يقوم بها “أثناء عمله” في بيئة تُحاكي بيئة الجهاز الهدف بغرض معرفة الأهداف أو النواية الخاصة بهذا البرنامج من خلال عمل تنقيح “debugging” للبرنامج وتتبع خطوات عمله.

بعدما تعرفنا على أنواع عملية تحليل الملفات الضارة والتعريف الأساسي لها ، سوف نبدأ مقالنا اليوم إن شاء الله وسوف نتعرف على كيفية تحليل هذه الملفات الضارة بإستخدام لغة python بشكل ثابت “static” حيث سوف نقوم بكتابة بعض الأدوات بإستخدام لغة python والتي سوف تقوم بتحليل البُنيه الخاصة بالملفات التنفيذية لنظام Windows والتي من المُفترض أن تكونوا قد إطلعتم عليها مسبقاً أو لديكم خلفية عنها.

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

  1. Import table – IAT : وهو القسم المسؤول عن المكتبات والدوال التي يتم إستدعائها والتعامل معها ، ويُلخص جزء كبير نوعاً ما من طبيعة عمل هذا الملف.
  2. Sections : وهي الأقسام التي تحتوي على المعلومات الحقيقية للملف من أكواد وأمور أساسية ، ويتم إدارتها والتعرف عليها من خلال العديد من الخواص مثل virtual address ، virtual size والعديد من الخواص الأخرى.
  3. strings : جميع النصوص التي نستطيع قرأتها ، وغالباً ما تُشكل بعض المعلومات التي يُمكن الإستناد عليها للتحقق أكثر وأكثر من طبيعة الملف.

سوف نبدأ الأن بكتابة سكربت بايثون بسيط يقوم بالكشف عن العناصر الموجوده بالقسم Import table والمعروف أيضاً IAT  -Import Address Table ، وسوف نقوم بالتحليل على الملف malware-a.exe والذي هو بالأساس metasploit backdoor تم إنشائه مُسبقاً وهذه الصورة له :

malware-a

وكما نرى المسار الخاص به هو /opt/malware-lab/ ، حيث سوف نقوم بإجراء التحليل عليه بإستخدام لغة Python ، دعونا نبدأ الأن بشرح السكربت الذي تكلمنا عنه والذي يقوم بقرأة IAT وطباعة العناصر الخاصة به ، طبعاً قُمت بكتابته مُسبقاً وسوف أشرحه لكم الأن سطر بسطر ، مبدئياً سوف نقوم بإستخدام المكتبة pefile في Python لتنفيذ هذه العملية كما هو موضح بصورة الكود التالي :

read-IAT

كما نرى الكود بسيط جداً ، حيث أن شرحه يكون كالتالي :

  1. السطر رقم 3 يقوم بإستدعاء المكتبة pefile الخاصة بالتعامل مع ملفات portable executable.
  2. السطر رقم 5 يقوم بإستدعاء PE method التي تقوم بأخذ  إسم الملف المُراد تحليله كـ argument.
  3. السطر 6 يقوم بعمل for loop وتعريف كل عنصر بإسم “item” داخل DIRECTORY_ENTRY_IMPORT حيث هو القسم المسؤول عن التعامل مع المكتبات والدوال التي يتم إستدعائها بهيكلية الملفات التنفيذية وهُنا محفوظة على شكل Lists.

    حيث أنصحكم بالإطلاع على هيكيلية الملفات التنفيذية على نظام windows لفهم التفاصيل بشكل أكبر.

  4. السطر 7 يقوم بطباعة “*” 20 مرة “بديهياً يجب عليك فهم ذلك :D”.
  5. السطر 8 يقوم بطباعة كل عنصر داخل الـ DIRECTORY_ENTRY_IMPORT List مع المُتغير dll والمقصود بها هُنا إسم المكتبة – ملف DLL – الذي تم إستدعائه.
  6. السطر 9 مُجدداً يقوم بعمل for loop وتعريف كل عنصر بإسم “address” داخل مجموعة العناصر imports والتي تحتوي على تفاصيل عديدة للملف الذي تم إستدعائه مثل إسم الدالة في المكتبة وعنوانها.
  7. السطر 10 يقوم بطباعة قيمة المُتغير “address” للعنصر address والذي تحتوي على عنوان هذه الدالة ، ويتم طبيعتها على شكل hex data ، وكذلك يتم طباعة قيمة المُتغير name والذي يحتوي على إسم الدالة التي تم إستدعائها.

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

print-dll-info-pe

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

  1. KERNEL32.DLL
  2. ADVAPI32.DLL
  3. MSVCRT.DLL
  4. WS_32.DLL
  5. WSOCK32.DLL

وُنشاهد تحت كل مكتبة إسم الدوال التم تم إستدعائها والعناوين الخاصة بها كذلك ، حيث تم طباعتها بالضبط كما أردنا من السكربت أن يقوم بها.

حيث من هذه المعلومات التي تم إستخرجها نستطيع توقع بعض الأعمال التي يقوم بهذا هذا البرنامج ، وبناءاً عليه يتم تحديد إنطباع أولي لطبيعة عملي هذا البرنامج.

الأن سوف نأتي لتحليل جُزئية أخرى وهي جزئية الأقسام “Sections” الخاصة بالبرنامج ، حيث سوف نقوم بعرض جميع الـ  Sections الخاصة بالبرنامج وطباعة بعض المعلومات العامة عنها ، حيث أن الـ Sections يُمكن إستخدامها بعملية code caving وهي أحد تقنيات البرمجة التي يتم من خلالها حقن بعض الأكواد داخل بعض البرامج وبنفس العملية التي يعمل من خلال البرنامج الأصلي ، وسوف نترك هذا الأمر لشرحه لاحقاً إن شاء الله ، أما الأن سوف نقوم بكتابة سكربت بسيط يقوم بإستعراض جميع الـ Sections الخاصة بالبرنامج.

مُجدداً أنصحكم بالإطلاع على هيكيلية الملفات التنفيذية على نظام windows لفهم التفاصيل بشكل أكبر.

وهذه صورة الكود الخاص بنا بعد كتابته :

read-sections-pefile

كما نرى أنه مُشابه قليلاً للكود السابق ، ويُمكننا شرحه كالتالي :

  1. السطر من 1 إلى 5 تم شرحهم بالأعلى.
  2. السطر 7 يقوم بإستخراج جميع العناصر الموجوده داخل fi.sections من خلال for loop ويتعامل معها تحت المُتغير section.
  3. السطر 8 يقوم بطباعة section.name وهو إسم الـ section.
  4. السطر 9 يقوم بطباعة section.VirtualAddress وهو العنوان الإفتراضي للـ section.
  5. السطر 10 يقوم بطباعة section.Misc_virtualSize وهو حجم الـ section.

وسوف تكون نتيجة التنفيذ كالتالي :

read-sections-python

كما نرى أن السكربت قام بإستخراج 3 أقسام “sections” وهم :

  1. .UPX0
  2. .UPX1
  3. .rsrc

ومن الوضح أن البرنامج malware-a.exe يستخدم upx packer حيث أنه تم ضغط الأقسام والتلاعب بها ، ولمعرفة الأقسام الحقيقية سوف نقوم بإستخدام upx داخل نظام تشغيل Linux كما يلي :

un-upx-malware-python

حيث قُمنا بإستخدام الخيار -d لعمل unpack أو إزالة الضغط عن لملف malware-a.exe ، وبعد تنفيذ السكربت الخاص بنا مُجدداً تبين لنا التالي :

python-after-un-upx-sections

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

الهدف الرئيسي كان من المقال هو التعرف على بعض الأمور التي نستطيع تنفيذها من خلال python على الملفات التنفيذية وكذلك بعض الأمور التي تتعلق بتحليل الملفات الضارة ، وسوف أحاول التطرق لاحقاً لشرح مُفصل حول هيكيلة ملفات PE بإذن الله.

أتمنى أن يكون المقال قد نال إعجابكم وبإذن الله نلتقي في مقالات أخرى.