0% found this document useful (0 votes)
14 views49 pages

Reverse Code Engineering

Uploaded by

Mesara Al-anani
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views49 pages

Reverse Code Engineering

Uploaded by

Mesara Al-anani
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 49

Reverse Code Engineering

Chapter 1

Windows Architecture Overview

By / Mohamed Adel

‫بسم هللا‬
‫‪Welcome to Reverse Code Engineering Course‬‬

‫في الكورس األول "‪ "Fundamentals of Malware Analysis‬اتعلمنا المرحلتين‬


‫األساسيتين في تحليل البرمجيات الخبيثة‪:‬‬

‫‪Basic Static Analysis .1‬‬


‫‪Basic Dynamic Analysis .2‬‬
‫لكن في بعض الـ ‪ malwares‬بتحتاج أكتر من المرحلتين دول عشان نقدر نفهم بشكل‬
‫أعمق إيه اللي بيعملوه وإيه كل إمكانياتهم‪ .‬علشان كده‪ ،‬في الكورس ده‪ ،‬هنتعلم الهندسة‬
‫العكسية للكود‪ ،‬واللي يقصد بيها الطريقة اللي نقدر من خاللها نحول البرنامج من شكله‬
‫كـ "‪ "Binary Code‬إلى كود "‪ "Assembly‬نقدر نقراه ونفهمه‪.‬‬

‫نظرة عامة على ‪Windows Architecture‬‬


‫في أول جزئية من ‪ ، Windows architecture‬هنتكلم عن ‪Windows‬‬
‫‪ ،Subsystem‬وده فيه منه كذا نوع‪:‬‬

‫‪Win32‬‬ ‫‪‬‬

‫‪POSIX: Portable Operating System Interface‬‬ ‫‪‬‬

‫‪OS/2‬‬ ‫‪‬‬

‫)‪Windows Subsystem for Linux (WSL‬‬ ‫‪‬‬

‫خلينا نتفق في البداية إنه حاليًا صعب نالقي ‪ malware‬شغال على ‪ POSIX‬أو‪. OS/2‬‬

‫سا؟ ‪ Windows Subsystem‬هو‬ ‫طيب إيه معنى ‪ Windows Subsystem‬أسا ً‬


‫مجموعة من األدوات والمكونات اللي بتتيح للمستخدمين تشغيل بيئات مختلفة زي‬
‫‪ Linux‬و ‪ Android‬على نظام ‪ Windows‬مثال على كده هو ‪Windows‬‬
‫)‪ Subsystem for Linux (WSL‬اللي بيسمح للمستخدمين بتشغيل بيئات ‪Linux‬‬
‫مباشرة داخل ‪. Windows‬‬

‫ثانية واحدة‪ ،‬يعني في المثال اللي تم ذكره ده أنا أقدر أشغل نظام لينكس وأنا مشغل‬
‫الويندوز ؟ آه تقدر‪ ،‬هو ده مفهوم الـ ‪ Subsystem‬طيب ما أنا أقدر أعمل كده من خالل‬
‫مثال؟ آه صحيح‪ ،‬بس إنك تشغله من خالل ‪ VMware‬حاجة‪ ،‬وإنه يكون‬ ‫‪ً VMware‬‬
‫‪ Subsystem‬من الويندوز حاجة تانية‪.‬‬
‫‪Kernel mode and User mode:‬‬
‫ايه بقى موضوع الـ ‪ Kernel Mode‬و‪ User Mode‬؟‬
‫في البداية لما بنستخدم جهاز الكمبيوتر لتشغيل أغنية أو فيلم أو كتاب نقرأه‪ ،‬بنضغط‬
‫على الملف وهو بيشتغل لوحده من غير ما نقوله إزاي يعرض المحتوى على الشاشة أو‬
‫إزاي يطلع الصوت من السماعات ‪ ،‬طيب ليه مش بنعمل كده؟ ألن العملية دي معقدة‬
‫جدًا (عملية التعامل مع الهاردوير)‪ .‬علشان كده في برنامج تاني اسمه ‪"Operating‬‬
‫"‪ System‬هو المسئول عن الحاجات دي‪ ،‬هو المسئول عن إدارة الهاردوير وما علينا‬
‫إحنا كمستخدمين إال إننا نستخدم الكمبيوتر في الحاجات اللي عايزينها زي قراءة كتاب‪،‬‬
‫سماع أغنية‪ ،‬مشاهدة فيلم‪ ،‬أو تصفح اإلنترنت‪.‬‬

‫الـ ‪ OS‬ده عبارة عن سوفتوير‪ ،‬بس سوفتوير ضخم شوية ‪ ،‬فيه منه جزء اسمه‬
‫"‪ ،"Kernel‬وده الجزء المسئول عن إدارة الذاكرة‪ ،‬والتخزين‪ ،‬والعمليات وكل حاجة‬
‫بتحصل على النظام ومادام انت مشغل جهازك فالكيرنل شغال مش بيقف نهائيًا‪.‬‬
‫‪ -‬طيب يعني إيه برنامج شغال في الـ ‪ kernel mode‬أو الـ ‪ user mode‬؟‬

‫األول تعال نعرف يعني إيه برنامج ؟ البرنامج عبارة عن مجموعة من التعليمات‬
‫"‪ ،"instructions‬اللي بيتم تنفيذها عن طريق المعالج "‪ "processor‬البرنامج ده يا‬
‫إما بيكون برنامج بيعمل حاجة للمستخدم"‪ ، "user‬يعني بيقدم خدمة للمستخدم زي‬
‫برنامج الوورد اللي بيخليك تعمل جداول وكالم ملون وغيره ‪ ،‬أو برنامج تشغيل الملفات‬
‫الصوتية زي ‪ VLC‬اللي بيخليك تشغل أفالم أو أغاني في الحالة دي بنقول على‬
‫البرنامج إنه شغال في الـ ‪. user mode‬‬

‫أما إذا كان البرنامج بيعمل حاجة تخص نظام التشغيل‪ ،‬يعني بيدير الذاكرة أو التخزين‬
‫ً‬
‫مثال‪ ،‬أو بيشوف العمليات اللي شغالة دلوقتي في الذاكرة‪ ،‬أو بيدير المعالج‪ ،‬بنقول عليه‬
‫إنه شغال في الـ ‪. kernel mode‬‬

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

‫الزم الكيرنل يبقى عنده الصالحية إنه يعمل أي حاجة في النظام "‪ "system‬طيب معنى‬
‫الكالم ده إن البرامج اللي بتشتغل في الـ ‪ kernel mode‬هي برامج تابعة لنظام‬
‫التشغيل؟ السؤال ده حلو‪ ،‬بس اإلجابة مش بالضرورة ‪ ،‬مش كل البرامج التابعة لنظام‬
‫التشغيل بتحتاج تشتغل في الـ‪. kernel mode‬‬

‫طيب أنا بشوف برامج عادية مش تابعة لنظام التشغيل بتشتغل في الـ ‪kernel mode‬‬
‫زي برامج الـ‪ Antivirus‬؟ آه صح‪ ،‬برامج الـ ‪ Antivirus‬بتشتغل في الـ ‪kernel‬‬
‫‪mode‬بس هي مش تابعة لنظام التشغيل‪.‬‬
‫أوال تعال نفرق بين الكيرنل كجزء من نظام التشغيل‪ ،‬وبين الـ ‪ kernel mode‬كوضع‬ ‫ً‬
‫بيتم فيه تشغيل البرامج ‪ ،‬إحنا قولنا إن البرامج التابعة لنظام التشغيل اللي بتشتغل في الـ‬
‫‪ kernel mode‬بتحتاج صالحيات عالية عشان تقدر تعمل دورها‪ ،‬طيب برامج زي‬
‫الـ ‪ Antivirus‬بتحتاج صالحيات عالية عشان تحمينا من البرامج الضارة إزاي هتقدر‬
‫تعمل كده وهي ملوش صالحية تفحص العمليات اللي شغالة؟ الزم يبقى عندها‬
‫صالحيات عالية عشان تعمل الدور بتاعها علشان كده معظم برامج الـ ‪Antivirus‬‬
‫بتشتغل في الـ‪. kernel mode‬‬

‫‪Proccess‬‬
‫‪ -‬طيب يعني إيه ‪ process‬؟‬

‫لو عندك برنامج موجود على الهارد ديسك ومش مشغله في الحالة دي هو اسمه برنامج‬
‫عادي ‪ ،‬لكن لو دوست عليه علشان تشغله في الحالة دي هو بيتنقل من الهارد للميموري‬
‫علشان يشتغل وهنا بيبقى اسمه ‪ process‬ده تعريف بسيط جدًا‪.‬‬

‫إحنا قولنا إن الكيرنل هو المسئول عن كل حاجة في السيستم عندنا‪ ،‬هو المسئول عن‬
‫إدارة الذاكرة والعمليات وغيره فإحنا هنتكلم هنا عن إزاي الكيرنل بيدير العمليات اللي‬
‫هي الـ‪. processes‬‬

‫سا الكيرنل يدير عملية معينة؟ يعني يقدر يعرف حالتها إيه‪ ،‬يقدر يدخلها‬
‫يعني إيه أسا ً‬
‫للمعالج علشان يشتغل عليها‪ ،‬يقدر يشيل عملية من الميموري ألنها عاملة مشكلة ً‬
‫مثال‪،‬‬
‫وحاجات كتير غير كده ‪ ،‬طيب إزاي بقى يقدر يعمل الحاجات دي؟ بيقدر يعملها عن‬
‫طريق حاجة اسمها ‪. PCB/Kprocess‬‬

‫إيه دي؟ دي ‪ structure‬فيه معلومات عن العملية‪ ،‬معلومات زي اسم العملية‪ ،‬واخدة‬


‫مساحة قد إيه من الميموري‪ ،‬حالتها إيه دلوقتي هل هي )‪ ready‬أو ‪ new‬أو ‪block‬‬
‫أو ‪ (waiting‬وهكذا‪ ،‬تقدر تقول عليه بشكل مبسط قائمة موجودة في الميموري فيها كل‬
‫المعلومات اللي محتاجها الكيرنل علشان يدير العمليات‪.‬‬
‫في حاجة كمان موجودة في الكيرنل بيستخدمها إلدارة العمليات اسمها ‪ Eprocess‬إيه‬
‫دي؟ دي عبارة عن ‪ structure‬فيه معلومات عن عملية معينة ‪ ،‬مش إحنا قولنا إن الـ‬
‫‪PCB/Kprocess‬فيه المعلومات دي؟ آه ‪ ،‬بس الـ ‪ Eprocess‬فيه نفس المعلومات‬
‫وأكتر شوية‪ ،‬وده اللي بيستخدمه الكيرنل علشان يدير العمليات المختلفة‪.‬‬

‫أنا كده اتلخبط ‪ ،‬إنت قولت إن الـ ‪ PCB/Kprocess‬فيه معلومات بيحتاجها الكيرنل‬
‫إلدارة العمليات ‪ ،‬ورجعت قولت إن الـ ‪ Eprocess‬فيه كل المعلومات اللي محتاجها‬
‫الكيرنل علشان يدير العمليات‪ .‬طيب إيه الفرق بينهم؟‬

‫‪PCB/Kprocess‬ده مفهوم عام‪ ،‬يعني موجود في أي نظام تشغيل زي لينكس‬


‫ويونيكس وغيرهم ‪ ،‬بشكل مبسط هو قائمة فيها معلومات عن عملية معينة أما الـ‬
‫‪Eprocess‬موجود في الويندوز فقط‪ ،‬وده بيحتوي على معلومات تخص عملية معينة‬
‫وشوية معلومات زيادة بتساعد الكيرنل إنه يدير العمليات بشكل فعال‪.‬‬

‫طيب إزاي الكيرنل بيستخدم الـ‪ Eprocess‬؟ إيه الطريقة اللي بيشتغل بيها؟‬

‫بشكل مبسط‪ ،‬نقدر نقول إن الـ ‪ Eprocess‬عبارة عن قائمة فيها معلومات عن عملية‬
‫معينة‪ ،‬يعني كل عملية ليها ‪ Eprocess‬طيب إيه الطريقة اللي بيستخدمها الكيرنل‬
‫إلدارة الـ‪ Eprocess‬؟ الكيرنل بيستخدم نوع من أنواع الـ ‪ Data structure‬اسمه‬
‫)‪(double Linked List‬طريقة عمل الـ ‪ Data structure‬ده هي إن كل قائمة‬
‫)‪(list‬بيطلع منها سهمين‪ :‬سهم بيشاور على القائمة اللي قدام وسهم بيشاور على القائمة‬
‫اللي وراء‪ ،‬وبكده كلهم بيبقوا مربوطين ببعض‪.‬‬
‫من هنا نقدر نقول إن برامج زي ‪ Process Hacker‬أو ‪Process Explorer‬‬
‫بيستخدموا طريقة معينة علشان يعرفونا إيه العمليات اللي شغالة في الوقت الحالي في‬
‫الميموري‪ ،‬طيب إيه الطريقة دي؟ بيروحوا األول ألول عملية موجودة‪ ،‬ويبصوا على‬
‫السهم اللي طالع منها اللي بيشاور على العملية اللي بعدها‪ ،‬ومن العملية اللي بعدها‬
‫يبصوا على السهم اللي بيشاور على العملية اللي بعدها وهكذا لحد ما يعرفوا كل‬
‫العمليات الموجودة‪.‬‬

‫في هنا بقى تكنيك بيستخدمه الناس اللي بيعملوا الـ ‪ malwares‬علشان يخفوا المالوير‬
‫بتاعهم من إنه يظهر في العمليات اللي شغالة‪ ،‬اسمه ‪ DKOM‬التكنيك ده بيعملوا فيه‬
‫‪Disconnect‬للعملية (اللي هي المالوير)‪ ،‬يعني بيشيلوها من الـ ‪double linked list‬‬
‫بس التكنيك ده الزم يتعمل بحذر علشان ما يبوظش الـ ‪ list‬كلها‪ ،‬يعني الزم يروحوا‬
‫على العملية (المالوير) ويخلوا السهم اللي بيشاور على العملية (المالوير) يشاور على‬
‫سا‪ ،‬والعملية اللي بتشاور على المالوير اللي هي‬
‫العملية اللي بيشاور عليها المالوير أسا ً‬
‫قدام المالوير‪ ،‬يشاوروا على العملية اللي بعد المالوير‪.‬‬
‫)عارف إن الحتة دي ممكن تلخبط‪ ،‬بس قولت أقولها للتوضيح‪ ،‬وفهمها مش ضروري‬
‫ومش هيفيد بشكل كبير‪ ،‬فتقدر تعديها (‪.‬‬

‫بس فيه أدوات تانية زي ‪ Volatility‬ممكن نستخدمها لعمل‪، memory forensics‬‬


‫ودي مش بتستخدم نفس طرق ‪ Process Hacker‬و‪ ،Process Explorer‬ونقدر‬
‫نشوف بيها العمليات اللي شغالة في الميموري بشكل أفضل‪.‬‬

‫كمان نقدر نستخدم ‪ Task Manager‬علشان نعرف معلومات أكتر عن أي عملية‬


‫شغالة‪.‬‬
‫‪Threads‬‬

‫يعني إيه ‪ thread‬؟‬

‫قبل ما أقولك يعني إيه ‪ ، thread‬تعال نتكلم شوية عن الـ ‪ process‬الـ ‪ process‬دي‬
‫عبارة عن إيه؟ عبارة عن كود أوامر يعنى كاتبها مبرمج ما‪ ،‬والبروسيسور بينفذ‬
‫األوامر دي‪ ،‬لما تيجي تشغل أي برنامج بتدوس عليه ‪ ، double click‬بيقوم الـ‬
‫‪windows loader‬ياخد كل التعليمات الخاصة بالبرنامج ده ويحطها في الميموري‪.‬‬

‫الـ ‪ process‬لما تروح الميموري‪ ،‬نظام التشغيل بيحجز لها مساحة في الميموري‪،‬‬
‫وكمان بيبقى معاها شوية ‪ Registers values‬باإلضافة للـ ‪ PCB‬بتاعها‪ ،‬وكمان بيبقى‬
‫ليها الـ ‪ stack‬الخاص بيها وحاجات تانية‪ ،‬فأنت لما تيجي تشغل برنامج وليكن‪، VLC‬‬
‫بيحجز مساحة في الميموري والحاجات اللي قولنا عليها‪ ،‬ولما تشغل جنبه برنامج تاني‬
‫وليكن‪ Firefox‬نفس النظام بيحجز مساحة في الميموري باإلضافة للحاجات بتاعته‪.‬‬
‫برنامج ‪ VLC‬ميقدرش يأكسس المساحة بتاعة الـ ‪ Firefox‬والعكس صحيح‪ ،‬دي‬
‫بتبقى ‪ process‬مستقلة تما ًما عن دي‪.‬‬

‫طيب أنا لما بشغل أكتر من ‪ process‬في نفس الوقت‪ ،‬البروسيسور بيتعامل معاهم‬
‫إزاي؟ أظن بيشغلهم كلهم مع بعض ألني ببقى مشغل بسمع بودكاست ً‬
‫مثال وأنا بذاكر‬
‫وفي نفس الوقت فاتح برنامج ‪ PDF reader‬بقرأ كتاب معين‪ ،‬صح؟ أل مش صح‪.‬‬
‫البروسيسور مش بيقدر يتعامل غير مع ‪ process‬واحدة فقط في كل مرة أمال إزاي أنا‬
‫بحس إن كلهم شغالين مع بعض؟ بسبب سرعته‪ ،‬فبتظن إن كل الـ ‪ processes‬دي‬
‫البروسيسور شغال عليها في نفس الوقت‪.‬‬

‫طيب‪ ،‬برضه هنسأل يعني إيه‪ thread‬؟‬

‫الـ ‪ thread‬هو جزء من كود مكتوب بواسطة مبرمج‪ ،‬والبروسيسور بينفذ األوامر دي‪.‬‬
‫الفرق بين الـ ‪ process‬والـ ‪ thread‬هو إن الـ ‪ process‬عبارة عن برنامج كامل‬
‫بيشغل كل األجزاء المطلوبة منه‪ ،‬أما الـ ‪ thread‬فهو جزء صغير من البرنامج بينفذ‬
‫مهمة معينة داخل البرنامج‪.‬‬

‫يعني لو عندنا برنامج زي ‪ ، Microsoft Word‬البرنامج ده بيعمل حاجات كتير زي‪:‬‬


‫إدخال النصوص‪ ،‬تغيير األلوان‪ ،‬حفظ النص تلقائيًا وهكذا‪.‬‬
‫تخيل إن مبرمجي ‪ Microsoft Word‬قالوا إن كل وظيفة من الوظائف دي تشتغل في‬
‫عملية مستقلة )‪ ، (process‬فقالوا ً‬
‫مثال‪:‬‬

‫‪ Process‬تاخد النص من المستخدم‬ ‫‪‬‬

‫‪ Process‬تانية لتغيير األلوان‬ ‫‪‬‬

‫‪ Process‬ثالثة لحفظ النص تلقائيًا‬ ‫‪‬‬

‫بس المشكلة هنا إن كل ‪ process‬بتشتغل بشكل مستقل تما ًما ومش بتقدر تتواصل مع‬
‫بعض‪ .‬علشان كده‪ ،‬حل المشكلة كان باستخدام الـ ‪ threads‬يعني بيكون عندنا‬
‫‪process‬واحدة‪ ،‬وكل وظيفة من الوظائف دي تتعمل عن طريق ‪ thread‬منفصلة‪.‬‬

‫مثال بسيط‪:‬‬

‫‪ Thread‬لجمع النص‬ ‫‪‬‬

‫‪ Thread‬لتغيير األلوان‬ ‫‪‬‬

‫‪ Thread‬لحفظ النص تلقائيًا‬ ‫‪‬‬

‫كده كل الـ ‪ threads‬دي بتشتغل داخل نفس الـ ‪ process‬وبتقدر تتشارك البيانات‬
‫بسهولة‪.‬‬

‫لو عايز تكتب برنامج بلغة ‪ C++‬يحتوي على أكتر من‪ ، thread‬ممكن يكون شكله كده‬
‫ده برنامج بسيط بيحتوي على ‪ ،3 threads‬البرنامج ده بيعمل اآلتي‪:‬‬
‫فيه دالة اسمها ‪ ،threadFunction‬الدالة دي بتعمل ‪ for loop‬وبتطبع رقم الـ‬
‫‪ thread‬ورقم الدورة‪.‬‬
‫داخل الـ ‪ main‬عندنا ‪ ،3 threads‬كل واحدة بتنادي الدالة اللي اسمها‬
‫‪. threadFunction‬‬
‫هنالحظ إن البرنامج لما يشتغل في كل مرة الـ ‪ output‬هيكون مختلف عن المرة اللي‬
‫قبلها‪ .‬ليه؟ ألن البروسيسور بينتقل بين الـ‪ ، threads‬ينفذ جزء من األولى وبعدين جزء‬
‫من التانية وبعدين جزء من التالتة وهكذا‪.‬‬
‫فأنت في كل مرة البرنامج بيشتغل مش بتكون عارف البروسيسور هيشتغل على أي‬
‫‪. thread‬‬
‫دي الفكرة األساسية من مفهوم الـ‪ ، thread‬إن يكون عندك ‪ process‬فيها أجزاء من‬
‫الكود بتتنفذ من غير ما تعتمد على جزء تاني أو بتتنفذ بالتوازي (بسبب سرعة‬
‫البروسيسور‪ ،‬بيظهرلنا إنها بتتنفذ بالتوازي)‪.‬‬
‫ده شكل الـ ‪ Output‬فى اول مرة شغلنا فيه البرنامج‬

‫ده شكل الـ ‪ output‬فى تانى مرة شغلنا فيها البرنامج‬

‫ده شكل الـ ‪ output‬فى تالت مرة نشغل فيها البرنامج‬


‫محتاجين نوضح كام نقطة بخصوص الـ‪: thread‬‬

‫كل عملية )‪ (process‬بيشتغل فيها أكتر من ‪ thread‬كل الـ ‪ threads‬دي بتقدر‬ ‫‪‬‬

‫تشارك الموارد )‪ (resources‬بتاعت العملية‪ ،‬يعني كلهم بيتشاركوا في الـ‪، data‬‬


‫الـ‪ ، files‬والـ‪. code‬‬
‫كل عملية )‪ (process‬شغالة بنقول إنها على األقل تحتوي على ‪ thread‬واحد‪.‬‬ ‫‪‬‬
‫هنستخدم دلوقتي أداة اسمها ‪ProcessThreadsView‬هذه األداة تعرض معلومات‬
‫شاملة عن جميع الـ ‪ threads‬في العملية التي نختارها‪.‬‬

‫هنجرب على ‪Notepad.exe‬‬

‫بعد ما اخترنا الـ ‪ process‬اللي عايزين نشوف الـ ‪ threads‬بتاعتها‪ ،‬تعالوا نشوف‬
‫شكل الـ ‪ threads‬بيبقى عامل إزاي ‪.‬‬
‫هنا هنالحظ إن الـ ‪ process‬دي تحتوي على ‪3 threads‬‬
‫هنالحظ كمان أن فيه ‪ thread‬هي المسئولة عن الـ ‪ interface‬بتاعت الـ ‪process‬‬
‫اللي اسمها ‪ ،notepad‬ودي بتظهر عند )‪ (window title‬لو فكرنا نعمل ‪suspend‬‬
‫للـ ‪ thread‬دي‪ ،‬مش هنقدر نحرك الـ ‪ notepad‬نهائي وال نتعامل معاها وال حتى‬
‫نكتب أي حاجة ‪ ،‬ولو حاولنا نكتب حاجة مش هتظهر‪.‬‬

‫في الصورة التالية‪ ،‬ما عملناش ‪ suspend‬لسه‪ ،‬بس عايزك تالحظ حاجة‪ ،‬إننا لما‬
‫حركنا الـ ‪ ،notepad‬الدائرة الخضراء اللي عند الـ ‪ thread‬المسئولة عن الـ‬
‫‪window‬بقى لونها أخضر‪ ،‬وده معناه أن الـ ‪ thread‬دي هي اللي البروسيسور‬
‫شغال عليها حاليًا‪.‬‬
‫تعالى نشوف بقى لو عملنا ‪ suspend‬ايه اللى هيحصل اوآل لونها هيبقى احمر‬
‫ثانيآ مش هتقدر خالص تتعامل مع الـ ‪ notepad‬وال تحركها من مكانها‬
‫طيب إيه اللي هيحصل لو شيلت الـ ‪ thread‬دي خالص؟‬
‫الكيرنل هيقوم قافل الـ‪. notepad‬‬

‫‪Virtual Address Space‬‬


‫يعني إيه ‪ virtual address space‬؟‬

‫كل عملية )‪ (process‬شغالة بتحجز لنفسها مساحة من الرام فنظام التشغيل هنا بيعمل‬
‫حاجة ذكية ‪ ،‬وهو إنه بيخلي كل عملية تظن إنها ليها ‪ 2‬جيجا من مساحة الرام (في حالة‬
‫كان الويندوز ‪ 32‬بت) تقدر تحط فيهم البيانات بتاعتها‪ ،‬سواء كانت ‪ data‬أو ‪ code‬أو‬
‫‪rsrc‬أو غيره ‪ .‬المساحة اللي نظام التشغيل بيخليها متوفرة للـ ‪ process‬بتبدأ من عنوان‬
‫‪ 00000000‬لحد ‪ ،7fffffff‬ودي فعالً ‪ 2‬جيجا بالظبط‪.‬‬

‫طيب‪ ،‬الويندوز ‪ 32‬بت بيقدر يتعامل مع رامات حجمها قد إيه؟ بيقدر يتعامل مع رامات‬
‫حجمها ‪ 4‬جيجا كحد أقصى‪ ،‬يبقى هنالحظ إن في اتنين جيجا مقولناش بيروحوا فين وال‬
‫بيستخدموا في إيه؟ االتنين جيجا التانيين بيكونوا محجوزين لنظام التشغيل وتحديدًا للـ‬
‫‪. kernel‬‬
‫في حالة إن نظام التشغيل كان ‪ 64‬بت‪ ،‬نظام التشغيل هيخلي كل عملية )‪ (process‬تظن‬
‫إن المساحة المخصصة لها في الرام هي ‪ 128‬تيرا بايت‪.‬‬
‫طيب‪ ،‬مادام كل عملية )‪ (process‬بتظن إنها ليها مساحة ‪ 2‬جيجا من الرام في حالة ‪32‬‬
‫بت و‪ 128‬تيرا بايت من الرام في حالة ‪ 64‬بت‪ ،‬فهل ممكن كل عملية تحط البيانات‬
‫الخاصة بيها في مكان عملية تانية حاطة فيه بياناتها‪ ،‬يعني االتنين يختاروا نفس المكان؟‬

‫اإلجابة هي أل‪ ،‬ألن المساحة اللي بيوفرها نظام التشغيل دي مساحة وهمية افتراضية‬
‫مش حقيقية بالتالي لو عملية معينة اختارت مكان معين تحط فيه البيانات الخاصة بيها‬
‫بيحصل عملية اسمها ‪ virtual to physical translation‬العملية دي بيتم فيها تحويل‬
‫العناوين اللي العملية اختارتها للعناوين الحقيقية في الـ‪. physical RAM‬‬

‫طيب مين اللي بيقوم بالعملية دي؟ الكيرنل فيه جزء اسمه ‪Memory Manager‬‬
‫والبروسيسور فيه جزء اسمه)‪ ، MMU (Memory Management Unit‬هما‬
‫المسؤولين عن العملية دي‪ ،‬فبالتالي لو اتنين عمليات اختاروا نفس المساحة مش مشكلة‬
‫ألن في عملية الـ ‪ virtual to physical translation‬العناوين دي هتتغير للعناوين‬
‫الحقيقية في الرام‪.‬‬
‫هنشغل دلوقتي أداة ‪ Process Hacker‬ونشوف الـ ‪virtual address memory‬‬
‫اللي نظام التشغيل بيخلي العملية )‪ (process‬تظن إنها متاحة لها‪ .‬الصورة جاية من‬
‫نظام تشغيل ‪ 64‬بت‪.‬‬
‫هنالحظ في الصورة التالية أن العملية )‪ (process‬عندها مساحة فارغة من الرام تقارب‬
‫‪ 1600‬جيجا‪ ،‬يعني المساحة اللي نظام التشغيل بيخلي العملية تظن إنها متاحة لها‪،‬‬
‫استخدمت جزء منها والباقي حوالي ‪ 1600‬جيجا‪ ،‬طبعًا الجهاز اللي أخدت منه الصورة‬
‫الرام الكلية فيه ‪ 16‬جيجا بس‪.‬‬
‫لما أي عملية )‪ (process‬بتشتغل على األقل بتعمل تحميل )‪ (Load‬لملفين ‪ DLL‬وهما‬
‫‪ ntdll.dll‬و ‪ kernel32.dll‬طبعا في عمليات تانية بتعمل تحميل‬
‫ألكثر من كده‪ ،‬بس احنا بنقول على األقل أي عملية بتعمل تحميل للملفين دول‪.‬‬

‫آخر نقطة في الجزئية دي نظام التشغيل بيعمل حركة معينة لتحسين األداء‪،‬بيعمل ايه؟‬
‫بيعمل تحميل للـ ‪ DLLs‬في الذاكرة )‪ (RAM‬مرة واحدة بدل ما كل عملية تروح تعمل‬
‫تحميل للـ ‪ DLL‬اللي هي محتاجاه‪ ،‬وده ممكن يخلي في ثالث عمليات أو أكثر عاملين‬
‫تحميل لنفس الـ ‪ DLL‬نظام التشغيل بيوفر الـ ‪ DLLs‬في الذاكرة‪ ،‬وأي عملية تحتاج‬
‫‪DLL‬معين تقدر تاخده من الذاكرة على طول كده هو بيوفر من مساحة الرام ويحسن‬
‫األداء بشكل كبير‪.‬‬
‫‪Mutex‬‬

‫يعني إيه ‪ Mutex‬؟ ده اختصار لـ "‪ "mutual exclusion‬وترجمته "االستبعاد‬


‫المتبادل" تعال نتكلم بشكل عام عن المفهوم ده‪.‬‬

‫تخيل إنك مشغل برنامج الوورد وفي نفس الوقت مشغل برنامج اإلكسيل وعندك طابعة‪،‬‬
‫لو حبيت تطبع ملف من الوورد وملف من اإلكسيل‪ ،‬هل تقدر تطبع االتنين في نفس‬
‫الوقت وأنت عندك ‪ resource‬واحدة اللي هي الطابعة؟ أكيد أل‪ ،‬نظام التشغيل مش‬
‫هيسمح بكده المفروض األول تطبع ملف الوورد وبعدين تطبع ملف اإلكسيل مادام عندك‬
‫طابعة واحدة‪.‬‬

‫طيب إزاي بقى نظام التشغيل بيعمل كده؟ عن طريق الـ ‪ mutual exclusion‬يعني‬
‫إيه؟ هيجي ً‬
‫مثال على الوورد لو هو بيستخدم الطابعة دلوقتي لطباعة ملف‪ ،‬لو جه‬
‫اإلكسيل يحاول يستخدم الطابعة هيقول له آسف مش هتقدر تستخدمها دلوقتي‪.‬‬

‫بشكل مبسط جدًا تقدر تقول إن النظام بيخزن قيمة معينة في مكان ما‪ ،‬القيمة دي تكون يا‬
‫إما "‪ "lock‬يا إما "‪ "unlock‬في حالة إن الـ ‪ resource‬اللي عندنا (الطابعة في حالتنا)‬
‫في حيازة عملية معينة زي الوورد في المثال بتاعنا هيخلي حالة القفل "‪ "lock‬ولما‬
‫العملية تخلص شغل على الـ‪ resource‬هتخلي حالة القفل "‪ "unlock‬بالتالي لو عملية‬
‫ً‬
‫أصال كانت في حيازة عملية تانية (الوورد في مثالنا)‬ ‫اإلكسيل حاولت تطبع والطابعة‬
‫هتالقي حالة القفل"‪ ، "lock‬وبالتالي مش هتقدر تأكسس الطابعة‪.‬‬

‫طبعًا الموضوع أكبر من كده وفيه تفاصيل كتير واللي حابب يستزيد في النقطة دي عليه‬
‫بالقراءة عن مفهوم الـ ‪. Semaphore‬‬
‫ملخص مفهوم الـ‪Mutex‬‬

‫الـ ‪ Mutex‬بيضمن إن عملية واحدة بس تقدر توصل وتتعامل مع مورد واحد فقط‬ ‫‪‬‬

‫في وقت معين‪.‬‬


‫ممكن تعتبر الـ ‪ Mutex‬عبارة عن قفل بيتحط على مورد معين‪ ،‬لما المورد يكون‬ ‫‪‬‬

‫في حيازة عملية معينة القفل بيتقفل‪ ،‬ولما العملية تخلص شغل على المورد القفل‬
‫بيتشال بحيث أي عملية تانية تقدر تستخدمه‪.‬‬

‫الـ ‪ Mutex‬في البرمجة‬

‫لنفرض إن عندنا برنامج معين فيه أكتر من‪ ، thread‬وعندنا ملف معين مش عايزين‬
‫أكتر من ‪ thread‬يقدروا يوصلوا له في وقت واحد‪ ،‬نعمل إيه؟ ببساطة نستخدم الـ‬
‫‪ Mutex‬وإحنا بنكتب البرنامج بتاعنا‪.‬‬

‫ننشئ ‪( Mutex‬القفل)‪ ،‬ونقول لو القفل مفتوح يبقى الملف مفتوح ومفيش ‪ thread‬تانية‬
‫تقدر تتعامل معاه‪ ،‬ولو القفل مغلق يبقى الملف مش مفتوح وأي ‪ thread‬تانية تقدر‬
‫تتعامل معاه‪.‬‬

‫تعال نأخد مثال للتوضيح‪ ،‬هنكتب برنامج بالسي بلس بلس البرنامج ده بيستخدم الـ‬
‫‪Mutex‬بحيث لو البرنامج شغال والمستخدم حاول يشغله تاني‪ ،‬ميشتغلش ألنه بالفعل‬
‫شغال ولو البرنامج مش شغال والمستخدم حب يشغله البرنامج يشتغل عادي‪.‬‬
‫أنا هنا أنشأت ‪ Mutex‬باسم ‪ ،MyUniqueMutexName‬وعملت شرط باستخدام ‪if‬‬
‫فورا‪،‬‬
‫‪condition‬بقول فيه لو البرنامج موجود منه نسخة شغالة يخرج من البرنامج ً‬
‫ولو مش موجود نسخة شغالة يكمل تشغيل‪.‬‬

‫إيه هي ‪ CreateMutex‬دي؟ هي عبارة عن دالة )‪ (function‬موجودة في‬


‫‪ ،Windows API‬وبتستخدم إلنشاء الميوتكس اللي البرنامج محتاجه‪ ،‬في كمان دالة‬
‫اسمها ‪ OpenMutex‬و ‪. ReleaseMutex‬‬

‫البرنامج اللي كتبناه ده لما نيجي نشغله ألول مرة هيشتغل عادي إنما لو حاولت تشغله‬
‫تاني وهو شغال مش هيشتغل بسبب الميوتكس اللي أنشأناه ده‪.‬‬
‫انا حاولت اشغل البرنامج وهو شغال بس منفعش ‪ ،‬ممكن تجربها بنفسك علشان تتأكد ‪.‬‬
‫فائدة الميوتكس‬

‫طيب‪ ،‬إيه الفائدة من موضوع الميوتكس ده؟‬


‫انت كـ ‪ malware analyst‬وانت بتعمل تحليل )‪ (analysis‬لمالوير معين‪ ،‬لو لقيت إن‬
‫المالوير ده بيستخدم ميوتكس باسم معين زي المثال بتاعنا ما كان اسمه‬
‫)‪ ، (MyUniqueMutexName‬هتاخد اسم الميوتكس ده كـ ‪Indicator of‬‬
‫)‪. Compromise (IOC‬‬
‫تعال نستخدم أداة ‪ Process Hacker‬ونشوف الميوتكس اللي بيستخدمها برنامج معين‬
‫هنستخدم البرنامج اللي احنا عملناه في المثال اسمه (‪ )thread.exe‬ألني نسيت أغير‬
‫اسمه‪.‬‬
‫هنالحظ فى الصورة اللى جاية اننا هنشوف اسم الميوتكس اللى احنا عملناه‬

‫أنا كـ ‪ malware analyst‬لما أجي أحلل مالوير معين وأالحظ أنه بيستخدم ميوتكس‬
‫بأخذ اسم الميوتكس ده وأعتبره كـ)‪. Indicator of Compromise (IOC‬‬
‫طيب إيه اللي يحصل لو شلت الميوتكس ده من العملية )‪ (process‬؟ بسيطة الميوتكس‬
‫بيعمل إيه؟ بيمنع تشغيل البرنامج أكتر من مرة في نفس الوقت عن طريق التحقق من‬
‫وجود العملية شغالة لو شلت الميوتكس هتقدر تشغل البرنامج أي عدد من المرات بدون‬
‫قيود‪.‬‬

‫تعالوا نجرب العملية دي باستخدام أداة ‪ Process Hacker‬ونشوف تأثير إزالة‬


‫الميوتكس على البرنامج اللي عملناه في المثال)‪(thread.exe‬‬
‫طيب تعالوا دلوقتى نشغل البرنامج مرتين كده هنالقى بيشتغل عادى‬
‫‪Services‬‬

‫إيه هي الـ ‪ services‬وإيه الفرق بينها وبين البرنامج العادي؟‬


‫ً‬
‫أوال الـ ‪ service‬هي برنامج في األول واآلخر‪ ،‬بس برنامج له خصائص مختلفة‪ ،‬يعني‬
‫إيه؟‬

‫لما يكون عندك برنامج عادي موجود على الديسكتوب وعايز تشغله بتدوس عليه‬
‫‪double click‬وبيفتح قدامك‪ ،‬وتبدأ تتفاعل معاه وتعمل اللي أنت عايزه ‪ ،‬أما الـ‬
‫‪ service‬فهي برنامج عادي برضه بس بيشتغل في الخلفية يعني مش بيكون ظاهر‬
‫قدامك على الشاشة‪.‬‬

‫البرنامج العادي لما تشغله بتدوس عليه ‪ ، double click‬إنما الـ ‪ service‬لها طريقة‬
‫معينة للتشغيل ممكن تخليها تشتغل أوتوماتيك مع بداية تشغيل الجهاز)‪ ، (restart‬أو‬
‫تخليها تشتغل بعد وقت معين من تشغيل الجهاز‪ ،‬أو ممكن تروح لمكان معين هي‬
‫موجودة فيه وتشغلها يدوي)‪. (manual‬‬

‫إزاي أشوف كل الـ ‪ services‬الموجودة على الويندوز؟‬


‫عندك كذا طريقة‪:‬‬
‫ممكن من خالل أداة اسمها ‪services.msc‬‬ ‫‪‬‬
‫ممكن كمان تشوف الـ ‪ services‬اللي عندك من خالل الـ ‪. Task Manager‬‬ ‫‪‬‬

‫ممكن كمان نشوف الـ ‪ services‬من خالل فتح الـ ‪ CMD‬وكتابة ‪sc.exe‬‬ ‫‪‬‬

‫لكن لو حبينا نوقف سيرفس شغالة أو نمسحها‪ ،‬هنحتاج نشغل الـ ‪ CMD‬كـ‬
‫‪. Administrator‬‬

‫‪Svchost.exe‬‬

‫‪ svchost.exe‬دي عبارة عن خدمة )‪ (service‬في الويندوز‪ ،‬إيه مهمتها؟‬ ‫‪‬‬

‫الخدمة دي بتخلي بعض الخدمات التانية الموجودة في الويندوز تشتغل تحتها كأنها‬
‫هي اللي مشغالهم مش بتخلي الخدمات التانية تشتغل كعمليات مستقلة‪ ،‬دي حركة‬
‫تنظيمية كويسة جدًا بتساعد في تنظيم كل الخدمات الموجودة‪.‬‬
‫هل كل الـ ‪ services‬بتشتغل تحت ‪ svchost.exe‬؟‬

‫مش كل الخدمات الموجودة في الويندوز بتشتغل تحت ‪ svchost.exe‬في بعض‬ ‫‪‬‬

‫الخدمات التانية بتشتغل بشكل مستقل‪.‬‬

‫تعالوا دلوقتي نفتح ونشوف الخدمات الموجودة في الويندوز ونتكلم عن كام حاجة فيهم‪.‬‬

‫هنالحظ من الصورة إن كل سيرفس ليها اسم‪ ،‬وصف‪ ،‬والحالة الحالية بتاعتها (هل هي‬
‫شغالة دلوقتي وال أل) وكمان إعدادات التشغيل (مانيوال أو أوتوماتيك)‪.‬‬

‫هنشوف كمان إننا نقدر نتحكم في طريقة تشغيل السيرفس‪ ،‬ونخليها تشتغل بالطريقة اللي‬
‫نفضلها‪ ،‬سواء أوتوماتيك‪ ،‬أو أوتوماتيك بعد وقت معين أو مانيوال‪.‬‬

‫هنالحظ كمان إن كل سيرفس ليها اسمها واسم الظهور تحت السيرفسس التانية ‪.‬‬
‫هنالحظ هنا أن اسم السيرفس هو ‪ ،tzautoupdate‬واالسم اللي هتظهر به في قائمة‬
‫السيرفسس هو"‪. "Auto Time Zone Updater‬‬
‫كمان محتاجين ناخد بالنا من ‪ path to executable‬وده مسار السيرفس في النظام لو‬
‫أخذنا بالنا هنالقي المسار هو‬
‫‪C:\windows\system32\svchost.exe‬‬

‫وده بيوضح إن السيرفس دي بتشتغل تحت عملية ‪. svchost.exe‬‬


‫دلوقتي تعالوا نكتب برنامج بسيط بلغة ‪ C++‬بحيث يشتغل كسيرفس على الويندوز‪.‬‬
‫البرنامج هيكون بسيط جدًا هيشتغل كسيرفس وكمان هيضيف يوزر اسمه ‪Mohamed‬‬
‫من خالل الـ ‪. registry‬‬

‫>‪#include <windows.h‬‬
‫>‪#include <iostream‬‬
‫‪//‬تعريف اسم الخدمة‬
‫‪#define SERVICE_NAME‬‬ ‫"‪L"MyService‬‬
‫‪//‬متغيرات الخدمة‬
‫;}{ = ‪SERVICE_STATUS ServiceStatus‬‬
‫;‪SERVICE_STATUS_HANDLE hStatus = nullptr‬‬
‫‪//‬دالة التحكم في الخدمة‬
void WINAPI ServiceControlHandler(DWORD controlCode) {
switch (controlCode) {
case SERVICE_CONTROL_STOP:
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus, &ServiceStatus);
break;
default:
break;
}
}
‫دالة لبدء الخدمة‬//
void WINAPI ServiceMain(DWORD argc, LPWSTR* argv) {
hStatus = RegisterServiceCtrlHandler(SERVICE_NAME,
ServiceControlHandler);
if (!hStatus) {
return;
}
‫إعداد حالة الخدمة‬ //
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
SetServiceStatus(hStatus, &ServiceStatus);
‫الخدمة تعمل اآلن‬ //
while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) {
‫انتظر لمدة ثانية واحدة‬// Sleep(1000);
}
}
‫دالة التسجيل كخدمة‬//
int RegisterService() {
SERVICE_TABLE_ENTRY Service Table[] = {
{ (LPWSTR)SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
if (!StartServiceCtrlDispatcher(ServiceTable)) {
std::cerr << "Error: " << GetLastError() << std::endl;
return 1;
}
return 0;
}

int main() {
RegisterService();
return 0;
}
‫في الكود اللي كتبناه قررنا أن البرنامج ده يشتغل كسيرفس وهيكون اسمها‬
‫"‪."MyService‬‬

‫طيب‪ ،‬هل البرنامج اللي هيشتغل كسيرفس هنشغله عن طريق ‪ double click‬زي ما‬
‫بنعمل في البرامج العادية؟ أل‪ ،‬علشان نشغل برنامج كسيرفس أول حاجة الزم نعرف‬
‫نظام التشغيل أن البرنامج اللي هيشتغل كسيرفس موجود في المسار الفالني وده بيتم من‬
‫خالل فتح الـ ‪ CMD‬واستخدام ‪ ، SC‬زي ما هنشوف في الصورة اللي جاية‪.‬‬

‫الزم ما تنساش تشغل الـ ‪ CMD‬كـ ‪. Administrator‬‬


‫هنا إحنا عرفنا نظام التشغيل أن البرنامج بتاعنا اللي شغال كسيرفس موجود في المسار‬
‫التالي‪.‬‬
‫لو عايزين نشغل السيرفس هنفتح الـ ‪ CMD‬ونكتب األمر التالي‪:‬‬
‫‪sc start MyService‬‬

‫هنالحظ ان حالة السيرفس لسه ‪ START_PENDING‬يعنى لسه بتشتغل لو كتبنا‬


‫نشوف نفس االمر بعدها على طول هيقولنا انها شغالة خالص‬
‫كده السيرفس بتاعتنا شغالة ‪ ،‬تعالوا نشوفها بقى من قائمة السيرفسس اللى شغالة‬
‫ونشوف حالتها ايه‬
‫)‪Component Object Model (COM‬‬

‫إيه هو الـ‪ COM‬؟ الـ ‪ COM‬هو معيار واجهة )‪ (interface standard‬طورته‬


‫ميكروسوفت علشان يخلي برنامجين يقدروا يتواصلوا مع بعض‪ ،‬البرنامج اللي عايز‬
‫يتواصل مع برنامج تاني من خالل الـ ‪ COM‬كل اللي عليه إنه يعرف الـ ‪ comID‬بتاع‬
‫البرنامج التاني‪.‬‬

‫الـ ‪ COM‬بيستخدم بشكل كبير في المالوير‪ ،‬وبيستخدمه )‪(malware authors‬عشان‬


‫يقدروا يتخطوا العديد من برامج الحماية )‪ (antivirus‬وكمان عشان يشتتوا انتباه محللي‬
‫المالوير )‪ (malware analysts‬ألن الـ ‪ malware analyst‬لما يعمل تحليل ثابت‬
‫)‪(static analysis‬لمالوير هيالقي إن المالوير ده مش بيعمل استيراد )‪ (import‬ألي‬
‫دالة)‪ (function‬وده هيخليه يعتقد إن ده برنامج عادي مش مالوير‪.‬‬

‫كل برنامج يستخدم كـ ‪ com object‬بيكون له ‪ ، comID‬وده بيكون إما ‪ progID‬أو‬


‫‪. GUID/UUID‬‬

‫‪ :progID‬اسم عادي زي ‪ cyber‬أو ‪. service_hacking‬‬ ‫‪‬‬

‫‪ :GUID/UUID‬رقم عشوائي مكون من ‪ 128‬بت‪ ،‬شكله كده ‪.‬‬ ‫‪‬‬

‫‪AB1234567890-1234-1234-1234-12345678‬‬

‫مثال توضيحي‬

‫تخيل في ‪ attacker‬موجود على جهاز ما ومش عايز يتم رصده وعايز في أسوأ‬
‫الظروف لو المالوير بتاعه اتمسك يبقى صعب يعمله تحليل ويظهر في مرحلة الـ ‪static‬‬
‫‪ analysis‬إنه برنامج عادي وطبيعي الـ ‪ attacker‬هيعمل إيه؟‬

‫عادة ً لما يعمل مالوير هيحتاج يعمل ‪ import‬ألكتر من دالة من ‪ DLLs‬مختلفة علشان‬
‫الحاجات دي تعمل الوظيفة اللي المالوير معمول عشانها‪ .‬بس لو هو عمل كده والمالوير‬
‫بتاعه اتمسك‪ ،‬في مرحلة الـ ‪ static analysis‬المحلل هيقدر يشوف كل الدوال اللي‬
‫المالوير بيعملها ‪ import‬وبالتالي يستنتج بنسبة كبيرة هو المالوير ده بيعمل إيه‬
‫بالضبط‪ ،‬الـ ‪ attacker‬مش عايز كده ففكر إنه يستخدم حاجة ميكروسوفت عاملتها وهي‬
‫الـ ‪. COM‬‬

‫استخدام الـ ‪ COM‬في المالوير‬

‫الـ ‪ attacker‬عمل ملف اسمه ‪ Mycode.dll‬وحط فيه ‪ functions‬كتير بتعمل كل‬


‫حاجة هو عايز المالوير بتاعه يعملها بس الملف ده مش المالوير نفسه الملف ده تم كتابته‬
‫كـ ‪ com object‬بحيث أي برنامج تاني يقدر يستخدم الـ ‪ functions‬اللي فيه من خالل‬
‫الـ ‪ COM‬الملف ده اتحددله ‪ comID‬اسمه ‪. Code_Here‬‬

‫بعد كده الـ ‪ attacker‬راح على الريجستري في مكان معين وحط ملف الـ‬
‫‪Mycode.dll‬عشان أي حد يحب يستخدمه كـ ‪ com object‬يقدر يستخدمه وعرف‬
‫النظام مكانه ومساره فين بالضبط‪ ،‬الـ ‪ attacker‬لما جي يكتب الكود بتاع المالوير قال‬
‫في الكود إنه هيستخدم الـ ‪ COM‬وحدد الـ ‪ com object‬اللي عايز يتواصل معاه أو‬
‫يستخدمه وهو في حالتنا هنا ‪ Code_Here‬لما يجي برنامج المالوير اللي اسمه‬
‫‪ game.exe‬يشتغل هيتواصل مع الـ ‪ Mycode.dll‬وياخد منها الدوال اللي هو‬
‫عايزها ويعمل اللي الـ ‪ attacker‬عايزه‪.‬‬

‫لما المالوير بتاع الـ ‪ attacker‬اللي هو ‪ game.exe‬يتمسك‪ ،‬المحلل لما يشوف‬


‫المالوير ده مش هيظهرله في مرحلة الـ ‪ static analysis‬إن المالوير ده بيعمل‬
‫‪ import‬ألي دوال ضارة‪ ،‬لكن هيتضح في مرحلة الـ‪. behavioral analysis‬‬
‫مالحظات مهمة‬

‫في الكود الخاص بالبرنامج اللي اسمه ‪ game.exe‬علشان يقدر يستخدم الـ ‪ COM‬الزم‬ ‫‪‬‬

‫يستخدم دالة اسمها ‪. CoInitializeEx‬‬


‫خد بالك ممكن يكون الـ ‪ com object‬له ‪ comID‬مختلف عن اسمه يعني ممكن يكون‬ ‫‪‬‬

‫الـ ‪ comID‬الـ ‪ progID‬بتاعه اسمه ‪ scheduling_service‬واسم الملف‬


‫الـ ‪ dll‬اسمه ‪. tasksch.dll‬‬
‫‪Windows Registry‬‬

‫ما هو الريجستري؟ الريجستري في الويندوز هو قاعدة بيانات مركزية تحتوي على‬


‫إعدادات التكوين )‪ (configuration settings‬والمعلومات الخاصة بالنظام والبرامج‬
‫المثبتة على الجهاز يعتبر الريجستري جز ًءا أساسيًا من نظام التشغيل حيث يخزن‬
‫البيانات التي تحتاجها التطبيقات والنظام نفسه للعمل بشكل صحيح‪.‬‬

‫مكونات الريجستري األساسية‬

‫الريجستري مكون من عدة أجزاء رئيسية وهي تشبه إلى حد ما شجرة الملفات )‪file‬‬
‫‪ ) system‬كل جزء يسمى "خلية )‪" (hive‬ويحتوي على مفاتيح )‪ (keys‬وقيم‬
‫)‪ (values‬فرعية‪.‬‬

‫األجزاء الرئيسية للريجستري‪:‬‬


‫‪HKEY_CLASSES_ROOT (HKCR): .1‬‬
‫‪ o‬يحتوي على معلومات حول أنواع الملفات وارتباطاتها بالبرامج يستخدم‬
‫لتحديد البرنامج الذي يفتح نوع معين من الملفات عند الضغط عليها‪.‬‬
‫‪HKEY_CURRENT_USER (HKCU): .2‬‬
‫‪ o‬يحتوي على إعدادات التكوين والمعلومات الخاصة بالمستخدم الحالي الذي‬
‫قام بتسجيل الدخول يتضمن إعدادات سطح المكتب‪ ،‬تفضيالت المستخدم‪،‬‬
‫إعدادات الشبكة وغيرها‪.‬‬
‫‪HKEY_LOCAL_MACHINE (HKLM): .3‬‬
‫‪ o‬يحتوي على إعدادات التكوين والمعلومات الخاصة بالنظام ككل والمثبتة‬
‫على الجهاز يتضمن إعدادات النظام‪ ،‬تعريفات األجهزة‪ ،‬البرامج المثبتة‪،‬‬
‫وغيرها‪.‬‬
‫‪HKEY_USERS (HKU): .4‬‬
‫‪ o‬يحتوي على إعدادات التكوين الخاصة بجميع المستخدمين الذين لديهم‬
‫حسابات على الجهاز‪.‬‬
‫‪HKEY_CURRENT_CONFIG (HKCC): .5‬‬
‫‪ o‬يحتوي على معلومات حول التكوين الحالي لألجهزة المستخدمة في النظام‪.‬‬
‫كيفية الوصول إلى الريجستري‬
‫يمكن الوصول إلى الريجستري وتحريره باستخدام أداة تحرير الريجستري )‪Registry‬‬
‫‪(Editor‬التي يمكن تشغيلها عن طريق كتابة ‪ regedit‬في نافذة التشغيل )‪(Run‬‬
‫التي تفتح بالضغط على مفتاحي ‪. Windows + R‬‬

‫‪Windows coding conventions‬‬

‫مقدمة عن ‪Windows Coding Conventions‬‬


‫‪: Windows Coding Conventions‬هي مجموعة من اإلرشادات والتوصيات‬
‫التي وضعتها مايكروسوفت للمبرمجين لكتابة كود منظم‪ ،‬سهل القراءة والصيانة‪ ،‬وقابل‬
‫للتطوير هذه التوصيات تساعد في الحفاظ على اتساق وجودة الكود عبر مختلف‬
‫المشاريع والفرق‪.‬‬

‫تسمية الـ‪Data Types:‬‬

‫في ‪ Windows Coding Conventions‬يتم تجنب استخدام األسماء المباشرة ألنواع‬


‫البيانات بلغة ‪ C‬مثل ‪ int, char, float‬بدالً من ذلك يتم استخدام أسماء توضيحية أكثر‬
‫وضو ًحا وغالبًا تكون مرتبطة ببيئة ‪. Windows‬‬

‫أمثلة على تسمية الـ‪Data Types:‬‬


‫‪ : INT‬يستخدم كاختصار لـ ‪int‬‬ ‫‪‬‬

‫‪ : CHAR‬يستخدم كاختصار لـ ‪char‬‬ ‫‪‬‬

‫‪ : FLOAT‬يستخدم كاختصار لـ ‪float‬‬ ‫‪‬‬

‫‪ : DWORD‬يستخدم كاختصار لـ ‪unsigned long‬‬ ‫‪‬‬

‫‪ : BOOL‬يستخدم كاختصار لـ ‪. Boolean‬‬ ‫‪‬‬


‫)‪UNC (Universal Naming Convention‬‬

‫في نظام التشغيل ‪ Special Paths‬و ‪ UNC‬هما مفهومان مهمان للوصول إلى الملفات‬
‫والمجلدات عبر الشبكة أو األجهزة المحلية‪.‬‬

‫‪: Special Paths‬‬

‫تشمل األماكن الخاصة مثل‪:‬‬

‫‪ :%SystemRoot%‬يشير إلى مسار مجلد ‪ ، Windows‬عادة ً ما يكون‬ ‫‪‬‬

‫‪C:\Windows‬‬
‫‪ :%ProgramFiles%‬يشير إلى مسار مجلد البرامج‪ ،‬عادة ً ما يكون‬ ‫‪‬‬

‫‪C:\Program Files‬‬
‫‪ :%UserProfile%‬يشير إلى مسار مجلد المستخدم الحالي‪ ،‬عادة ً ما يكون‬ ‫‪‬‬

‫‪C:\Users‬‬

‫)‪: UNC (Universal Naming Convention‬‬


‫‪UNC‬هي طريقة لإلشارة إلى الملفات والمجلدات على الشبكة بطريقة موحدة‪ ،‬وتتكون‬
‫من عناصر مثل‪:‬‬
‫‪: \\ServerName\ShareName‬يمكنك استخدامها للوصول إلى مجلد‬ ‫‪‬‬

‫مشاركة على الشبكة مثل ‪\\ServerName\SharedFolder.‬‬


‫الصورة اللى جاية هتوضحلنا اننا نقدر نوصل لملف معين من خالل اننا كتبنا مسار‬
‫الملف ده بأكتر من طريق مختلفة‬
‫‪Handles‬‬
‫الـ ‪ Handle‬تقدر تعتبره مؤشر يشاور على ‪ object‬معين أو مكان معين في الـ‬
‫‪ memory‬والمكان ده بيحتوي على قيمة معينة‪.‬‬

‫تشبيه بالـ ‪ Pointer‬ممكن نشبه الـ ‪ handle‬بالـ‪ pointer‬لكن في بعض‬ ‫‪‬‬

‫االختالفات الـ ‪ Pointer‬ممكن تعمل عليه بعض العمليات الرياضية‬


‫)‪ (arithmetic operations‬زي اإلضافة والطرح من العنوان بينما الـ‬
‫‪ handle‬أل بتتعامل معاه زي ما هو بدون أي عمليات رياضية‪.‬‬
‫استخدام الـ ‪ Handles‬مع ‪ Windows Functions‬لما تستخدم دالة من دوال‬ ‫‪‬‬

‫الويندوز زي ‪ CreateWindowEx‬الدالة دي بترجع لك ‪ handle‬علشان‬


‫تقدر تتعامل مع الـ ‪ window‬بعد كده يعني مثالً لو حبيت تعمل تدمير‬
‫)‪ (destroy‬للـ‪ window‬مش هتتعامل معاه باسمه األصلي هتستخدم الـ‬
‫‪ handle‬اللي الدالة رجعته لك‪.‬‬
‫‪Common Networking functions in the API‬‬

‫ميكروسوفت بتوفر لنا واجهتين برمجيتين )‪ (API‬للتعامل مع الشبكات‪:‬‬


‫‪ (Low-level API) .1‬وتُسمى‪WinSock:‬‬
‫‪ WinSock o‬دي واجهة برمجية بتوفر وسيلة للتطبيقات إنها تتواصل عبر‬
‫الشبكات من خالل"‪. "sockets‬‬
‫‪ o‬الواجهة دي بتستخدم لالتصاالت اللي بتحتاج سيطرة كاملة على عمليات‬
‫الشبكة‪.‬‬

‫مثال ‪:‬لو في برنامج خبيث )‪ (Malware‬بيستخدم الـ ‪ API‬الخاصة بـ‬


‫‪ ،WinSock‬هيحتاج يهيئ مكتبة الشبكة األول باستخدام الدالة ‪WSAStartup‬‬
‫بعض مكتبات ‪ DLLs‬المرتبطة بـ‪WinSock API:‬‬

‫‪ws2_32.dll‬‬ ‫‪o‬‬

‫‪winsock.dll‬‬ ‫‪o‬‬

‫‪wsock32.dll‬‬ ‫‪o‬‬

‫‪mswsock.dll‬‬ ‫‪o‬‬

‫بعض الـ ‪ Functions‬في )‪:(Low-level API‬‬

‫‪WSAStartup‬‬ ‫‪o‬‬

‫‪socket‬‬ ‫‪o‬‬

‫‪bind‬‬ ‫‪o‬‬

‫‪listen‬‬ ‫‪o‬‬

‫‪recv‬‬ ‫‪o‬‬

‫‪send‬‬ ‫‪o‬‬

‫‪accept‬‬ ‫‪o‬‬

‫‪connect‬‬ ‫‪o‬‬
‫‪ (High-level API) .2‬وتُسمى ‪WinINet:‬‬
‫‪ o‬بتتيح ‪ WinINet‬للمبرمجين إنهم يستخدموا بروتوكوالت زى ‪ HTTP‬و‬
‫‪ FTP‬بسهولة وسرعة‪.‬‬
‫‪ o‬دى تعتبر أسهل في االستخدام وأسرع في التنفيذ علشان كده معظم‬
‫المبرمجين بيفضلوها ‪.‬‬

‫بعض الـ ‪: (High-level API) Functions‬‬

‫‪FtpGetFile‬‬ ‫‪o‬‬

‫‪FtpPutFile‬‬ ‫‪o‬‬

‫‪FtpDeleteFile‬‬ ‫‪o‬‬

‫‪FtpCreateDirectory‬‬ ‫‪o‬‬

‫‪HttpOpenRequest‬‬ ‫‪o‬‬

‫‪HttpSendRequest‬‬ ‫‪o‬‬

‫‪HttpQueryInfo‬‬ ‫‪o‬‬

‫‪HttpAddRequestHeader‬‬ ‫‪o‬‬

‫‪The Native API‬‬

‫التفاعل بين ‪ Win32 API‬و‪Kernel‬‬

‫‪ :Win32 API‬لما تستدعي أي دالة من ‪ Win32 AP‬زي الدوال الموجودة في‬ ‫‪‬‬

‫‪ kernel32.dll‬غالبًا الدوال دي بتستدعي دوال تانية موجودة في ‪ntdll.dll‬‬


‫‪ :ntdll.dll‬الملف ده بيحتوي على دوال بتستخدم للتفاعل مع النواة )‪(kernel‬‬ ‫‪‬‬

‫بشكل مباشر ‪ ntdll.dll‬بيشتغل كطبقة وسيطة بين تطبيقات الـ ‪ user mode‬و‬
‫‪. kernel mode‬‬
‫الصورة اللى جاية هتوضح النقطة دى‬

‫الوصول المباشر لـ ‪ntdll.dll‬‬

‫صحيح إنه مفيش حاجة تمنع التطبيقات من استخدام دوال ‪ ntdll.dll‬بشكل مباشر لكن‬
‫ده مش موثق رسميًا من مايكروسوفت وبيعتبر معقد شوية‪.‬‬

‫بعض المطورين‪ ،‬ومنهم كتاب المالوير)‪ (malware authors‬بيستخدموا الطرق دي‬


‫اللي مش موثقة علشان يتجنبوا الكشف من أدوات الحماية‪.‬‬

‫التخفي من أدوات الحماية‬

‫بعض أدوات الحماية بتراقب استدعاءات ‪ Win32 API‬التقليدية بس باستخدام‬


‫‪ Native API‬بشكل مباشر المالوير بيقدر يتجاوز الحماية ألن استدعاءات ‪Native‬‬
‫‪ API‬مش بتتراقب بنفس القدر‪.‬‬

‫الصورة اللى جاية هتوضح النقطة دى‬


‫الحمدهلل تم الشابتر االول ‪.‬‬

You might also like