Reverse Code Engineering
Reverse Code Engineering
Chapter 1
By / Mohamed Adel
بسم هللا
Welcome to Reverse Code Engineering Course
Win32
OS/2
خلينا نتفق في البداية إنه حاليًا صعب نالقي malwareشغال على POSIXأو. OS/2
ثانية واحدة ،يعني في المثال اللي تم ذكره ده أنا أقدر أشغل نظام لينكس وأنا مشغل
الويندوز ؟ آه تقدر ،هو ده مفهوم الـ 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
أنا كده اتلخبط ،إنت قولت إن الـ 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كلها ،يعني الزم يروحوا
على العملية (المالوير) ويخلوا السهم اللي بيشاور على العملية (المالوير) يشاور على
سا ،والعملية اللي بتشاور على المالوير اللي هي
العملية اللي بيشاور عليها المالوير أسا ً
قدام المالوير ،يشاوروا على العملية اللي بعد المالوير.
)عارف إن الحتة دي ممكن تلخبط ،بس قولت أقولها للتوضيح ،وفهمها مش ضروري
ومش هيفيد بشكل كبير ،فتقدر تعديها (.
قبل ما أقولك يعني إيه ، threadتعال نتكلم شوية عن الـ processالـ processدي
عبارة عن إيه؟ عبارة عن كود أوامر يعنى كاتبها مبرمج ما ،والبروسيسور بينفذ
األوامر دي ،لما تيجي تشغل أي برنامج بتدوس عليه ، double clickبيقوم الـ
windows loaderياخد كل التعليمات الخاصة بالبرنامج ده ويحطها في الميموري.
الـ processلما تروح الميموري ،نظام التشغيل بيحجز لها مساحة في الميموري،
وكمان بيبقى معاها شوية Registers valuesباإلضافة للـ PCBبتاعها ،وكمان بيبقى
ليها الـ stackالخاص بيها وحاجات تانية ،فأنت لما تيجي تشغل برنامج وليكن، VLC
بيحجز مساحة في الميموري والحاجات اللي قولنا عليها ،ولما تشغل جنبه برنامج تاني
وليكن Firefoxنفس النظام بيحجز مساحة في الميموري باإلضافة للحاجات بتاعته.
برنامج VLCميقدرش يأكسس المساحة بتاعة الـ Firefoxوالعكس صحيح ،دي
بتبقى processمستقلة تما ًما عن دي.
طيب أنا لما بشغل أكتر من processفي نفس الوقت ،البروسيسور بيتعامل معاهم
إزاي؟ أظن بيشغلهم كلهم مع بعض ألني ببقى مشغل بسمع بودكاست ً
مثال وأنا بذاكر
وفي نفس الوقت فاتح برنامج PDF readerبقرأ كتاب معين ،صح؟ أل مش صح.
البروسيسور مش بيقدر يتعامل غير مع processواحدة فقط في كل مرة أمال إزاي أنا
بحس إن كلهم شغالين مع بعض؟ بسبب سرعته ،فبتظن إن كل الـ processesدي
البروسيسور شغال عليها في نفس الوقت.
الـ threadهو جزء من كود مكتوب بواسطة مبرمج ،والبروسيسور بينفذ األوامر دي.
الفرق بين الـ processوالـ threadهو إن الـ processعبارة عن برنامج كامل
بيشغل كل األجزاء المطلوبة منه ،أما الـ threadفهو جزء صغير من البرنامج بينفذ
مهمة معينة داخل البرنامج.
بس المشكلة هنا إن كل processبتشتغل بشكل مستقل تما ًما ومش بتقدر تتواصل مع
بعض .علشان كده ،حل المشكلة كان باستخدام الـ threadsيعني بيكون عندنا
processواحدة ،وكل وظيفة من الوظائف دي تتعمل عن طريق threadمنفصلة.
مثال بسيط:
كده كل الـ threadsدي بتشتغل داخل نفس الـ processوبتقدر تتشارك البيانات
بسهولة.
لو عايز تكتب برنامج بلغة C++يحتوي على أكتر من ، threadممكن يكون شكله كده
ده برنامج بسيط بيحتوي على ،3 threadsالبرنامج ده بيعمل اآلتي:
فيه دالة اسمها ،threadFunctionالدالة دي بتعمل for loopوبتطبع رقم الـ
threadورقم الدورة.
داخل الـ mainعندنا ،3 threadsكل واحدة بتنادي الدالة اللي اسمها
. threadFunction
هنالحظ إن البرنامج لما يشتغل في كل مرة الـ outputهيكون مختلف عن المرة اللي
قبلها .ليه؟ ألن البروسيسور بينتقل بين الـ ، threadsينفذ جزء من األولى وبعدين جزء
من التانية وبعدين جزء من التالتة وهكذا.
فأنت في كل مرة البرنامج بيشتغل مش بتكون عارف البروسيسور هيشتغل على أي
. thread
دي الفكرة األساسية من مفهوم الـ ، threadإن يكون عندك processفيها أجزاء من
الكود بتتنفذ من غير ما تعتمد على جزء تاني أو بتتنفذ بالتوازي (بسبب سرعة
البروسيسور ،بيظهرلنا إنها بتتنفذ بالتوازي).
ده شكل الـ Outputفى اول مرة شغلنا فيه البرنامج
كل عملية ) (processبيشتغل فيها أكتر من threadكل الـ threadsدي بتقدر
بعد ما اخترنا الـ processاللي عايزين نشوف الـ threadsبتاعتها ،تعالوا نشوف
شكل الـ threadsبيبقى عامل إزاي .
هنا هنالحظ إن الـ processدي تحتوي على 3 threads
هنالحظ كمان أن فيه threadهي المسئولة عن الـ interfaceبتاعت الـ process
اللي اسمها ،notepadودي بتظهر عند ) (window titleلو فكرنا نعمل suspend
للـ threadدي ،مش هنقدر نحرك الـ notepadنهائي وال نتعامل معاها وال حتى
نكتب أي حاجة ،ولو حاولنا نكتب حاجة مش هتظهر.
في الصورة التالية ،ما عملناش suspendلسه ،بس عايزك تالحظ حاجة ،إننا لما
حركنا الـ ،notepadالدائرة الخضراء اللي عند الـ threadالمسئولة عن الـ
windowبقى لونها أخضر ،وده معناه أن الـ threadدي هي اللي البروسيسور
شغال عليها حاليًا.
تعالى نشوف بقى لو عملنا suspendايه اللى هيحصل اوآل لونها هيبقى احمر
ثانيآ مش هتقدر خالص تتعامل مع الـ notepadوال تحركها من مكانها
طيب إيه اللي هيحصل لو شيلت الـ threadدي خالص؟
الكيرنل هيقوم قافل الـ. notepad
كل عملية ) (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
تخيل إنك مشغل برنامج الوورد وفي نفس الوقت مشغل برنامج اإلكسيل وعندك طابعة،
لو حبيت تطبع ملف من الوورد وملف من اإلكسيل ،هل تقدر تطبع االتنين في نفس
الوقت وأنت عندك resourceواحدة اللي هي الطابعة؟ أكيد أل ،نظام التشغيل مش
هيسمح بكده المفروض األول تطبع ملف الوورد وبعدين تطبع ملف اإلكسيل مادام عندك
طابعة واحدة.
طيب إزاي بقى نظام التشغيل بيعمل كده؟ عن طريق الـ mutual exclusionيعني
إيه؟ هيجي ً
مثال على الوورد لو هو بيستخدم الطابعة دلوقتي لطباعة ملف ،لو جه
اإلكسيل يحاول يستخدم الطابعة هيقول له آسف مش هتقدر تستخدمها دلوقتي.
بشكل مبسط جدًا تقدر تقول إن النظام بيخزن قيمة معينة في مكان ما ،القيمة دي تكون يا
إما " "lockيا إما " "unlockفي حالة إن الـ resourceاللي عندنا (الطابعة في حالتنا)
في حيازة عملية معينة زي الوورد في المثال بتاعنا هيخلي حالة القفل " "lockولما
العملية تخلص شغل على الـ resourceهتخلي حالة القفل " "unlockبالتالي لو عملية
ً
أصال كانت في حيازة عملية تانية (الوورد في مثالنا) اإلكسيل حاولت تطبع والطابعة
هتالقي حالة القفل" ، "lockوبالتالي مش هتقدر تأكسس الطابعة.
طبعًا الموضوع أكبر من كده وفيه تفاصيل كتير واللي حابب يستزيد في النقطة دي عليه
بالقراءة عن مفهوم الـ . Semaphore
ملخص مفهوم الـMutex
الـ Mutexبيضمن إن عملية واحدة بس تقدر توصل وتتعامل مع مورد واحد فقط
في حيازة عملية معينة القفل بيتقفل ،ولما العملية تخلص شغل على المورد القفل
بيتشال بحيث أي عملية تانية تقدر تستخدمه.
لنفرض إن عندنا برنامج معين فيه أكتر من ، threadوعندنا ملف معين مش عايزين
أكتر من threadيقدروا يوصلوا له في وقت واحد ،نعمل إيه؟ ببساطة نستخدم الـ
Mutexوإحنا بنكتب البرنامج بتاعنا.
ننشئ ( Mutexالقفل) ،ونقول لو القفل مفتوح يبقى الملف مفتوح ومفيش threadتانية
تقدر تتعامل معاه ،ولو القفل مغلق يبقى الملف مش مفتوح وأي threadتانية تقدر
تتعامل معاه.
تعال نأخد مثال للتوضيح ،هنكتب برنامج بالسي بلس بلس البرنامج ده بيستخدم الـ
Mutexبحيث لو البرنامج شغال والمستخدم حاول يشغله تاني ،ميشتغلش ألنه بالفعل
شغال ولو البرنامج مش شغال والمستخدم حب يشغله البرنامج يشتغل عادي.
أنا هنا أنشأت Mutexباسم ،MyUniqueMutexNameوعملت شرط باستخدام if
فورا،
conditionبقول فيه لو البرنامج موجود منه نسخة شغالة يخرج من البرنامج ً
ولو مش موجود نسخة شغالة يكمل تشغيل.
البرنامج اللي كتبناه ده لما نيجي نشغله ألول مرة هيشتغل عادي إنما لو حاولت تشغله
تاني وهو شغال مش هيشتغل بسبب الميوتكس اللي أنشأناه ده.
انا حاولت اشغل البرنامج وهو شغال بس منفعش ،ممكن تجربها بنفسك علشان تتأكد .
فائدة الميوتكس
أنا كـ malware analystلما أجي أحلل مالوير معين وأالحظ أنه بيستخدم ميوتكس
بأخذ اسم الميوتكس ده وأعتبره كـ). Indicator of Compromise (IOC
طيب إيه اللي يحصل لو شلت الميوتكس ده من العملية ) (process؟ بسيطة الميوتكس
بيعمل إيه؟ بيمنع تشغيل البرنامج أكتر من مرة في نفس الوقت عن طريق التحقق من
وجود العملية شغالة لو شلت الميوتكس هتقدر تشغل البرنامج أي عدد من المرات بدون
قيود.
لما يكون عندك برنامج عادي موجود على الديسكتوب وعايز تشغله بتدوس عليه
double clickوبيفتح قدامك ،وتبدأ تتفاعل معاه وتعمل اللي أنت عايزه ،أما الـ
serviceفهي برنامج عادي برضه بس بيشتغل في الخلفية يعني مش بيكون ظاهر
قدامك على الشاشة.
البرنامج العادي لما تشغله بتدوس عليه ، double clickإنما الـ serviceلها طريقة
معينة للتشغيل ممكن تخليها تشتغل أوتوماتيك مع بداية تشغيل الجهاز) ، (restartأو
تخليها تشتغل بعد وقت معين من تشغيل الجهاز ،أو ممكن تروح لمكان معين هي
موجودة فيه وتشغلها يدوي). (manual
ممكن كمان نشوف الـ servicesمن خالل فتح الـ CMDوكتابة sc.exe
لكن لو حبينا نوقف سيرفس شغالة أو نمسحها ،هنحتاج نشغل الـ CMDكـ
. Administrator
Svchost.exe
الخدمة دي بتخلي بعض الخدمات التانية الموجودة في الويندوز تشتغل تحتها كأنها
هي اللي مشغالهم مش بتخلي الخدمات التانية تشتغل كعمليات مستقلة ،دي حركة
تنظيمية كويسة جدًا بتساعد في تنظيم كل الخدمات الموجودة.
هل كل الـ servicesبتشتغل تحت svchost.exe؟
تعالوا دلوقتي نفتح ونشوف الخدمات الموجودة في الويندوز ونتكلم عن كام حاجة فيهم.
هنالحظ من الصورة إن كل سيرفس ليها اسم ،وصف ،والحالة الحالية بتاعتها (هل هي
شغالة دلوقتي وال أل) وكمان إعدادات التشغيل (مانيوال أو أوتوماتيك).
هنشوف كمان إننا نقدر نتحكم في طريقة تشغيل السيرفس ،ونخليها تشتغل بالطريقة اللي
نفضلها ،سواء أوتوماتيك ،أو أوتوماتيك بعد وقت معين أو مانيوال.
هنالحظ كمان إن كل سيرفس ليها اسمها واسم الظهور تحت السيرفسس التانية .
هنالحظ هنا أن اسم السيرفس هو ،tzautoupdateواالسم اللي هتظهر به في قائمة
السيرفسس هو". "Auto Time Zone Updater
كمان محتاجين ناخد بالنا من path to executableوده مسار السيرفس في النظام لو
أخذنا بالنا هنالقي المسار هو
C:\windows\system32\svchost.exe
>#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زي ما هنشوف في الصورة اللي جاية.
AB1234567890-1234-1234-1234-12345678
مثال توضيحي
تخيل في attackerموجود على جهاز ما ومش عايز يتم رصده وعايز في أسوأ
الظروف لو المالوير بتاعه اتمسك يبقى صعب يعمله تحليل ويظهر في مرحلة الـ static
analysisإنه برنامج عادي وطبيعي الـ attackerهيعمل إيه؟
عادة ً لما يعمل مالوير هيحتاج يعمل importألكتر من دالة من DLLsمختلفة علشان
الحاجات دي تعمل الوظيفة اللي المالوير معمول عشانها .بس لو هو عمل كده والمالوير
بتاعه اتمسك ،في مرحلة الـ static analysisالمحلل هيقدر يشوف كل الدوال اللي
المالوير بيعملها importوبالتالي يستنتج بنسبة كبيرة هو المالوير ده بيعمل إيه
بالضبط ،الـ attackerمش عايز كده ففكر إنه يستخدم حاجة ميكروسوفت عاملتها وهي
الـ . COM
بعد كده الـ attackerراح على الريجستري في مكان معين وحط ملف الـ
Mycode.dllعشان أي حد يحب يستخدمه كـ com objectيقدر يستخدمه وعرف
النظام مكانه ومساره فين بالضبط ،الـ attackerلما جي يكتب الكود بتاع المالوير قال
في الكود إنه هيستخدم الـ COMوحدد الـ com objectاللي عايز يتواصل معاه أو
يستخدمه وهو في حالتنا هنا Code_Hereلما يجي برنامج المالوير اللي اسمه
game.exeيشتغل هيتواصل مع الـ Mycode.dllوياخد منها الدوال اللي هو
عايزها ويعمل اللي الـ attackerعايزه.
في الكود الخاص بالبرنامج اللي اسمه game.exeعلشان يقدر يستخدم الـ COMالزم
الريجستري مكون من عدة أجزاء رئيسية وهي تشبه إلى حد ما شجرة الملفات )file
) systemكل جزء يسمى "خلية )" (hiveويحتوي على مفاتيح ) (keysوقيم
) (valuesفرعية.
في نظام التشغيل Special Pathsو UNCهما مفهومان مهمان للوصول إلى الملفات
والمجلدات عبر الشبكة أو األجهزة المحلية.
C:\Windows
:%ProgramFiles%يشير إلى مسار مجلد البرامج ،عادة ً ما يكون
C:\Program Files
:%UserProfile%يشير إلى مسار مجلد المستخدم الحالي ،عادة ً ما يكون
C:\Users
ws2_32.dll o
winsock.dll o
wsock32.dll o
mswsock.dll o
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دى تعتبر أسهل في االستخدام وأسرع في التنفيذ علشان كده معظم
المبرمجين بيفضلوها .
FtpGetFile o
FtpPutFile o
FtpDeleteFile o
FtpCreateDirectory o
HttpOpenRequest o
HttpSendRequest o
HttpQueryInfo o
HttpAddRequestHeader o
:Win32 APIلما تستدعي أي دالة من Win32 APزي الدوال الموجودة في
بشكل مباشر ntdll.dllبيشتغل كطبقة وسيطة بين تطبيقات الـ user modeو
. kernel mode
الصورة اللى جاية هتوضح النقطة دى
صحيح إنه مفيش حاجة تمنع التطبيقات من استخدام دوال ntdll.dllبشكل مباشر لكن
ده مش موثق رسميًا من مايكروسوفت وبيعتبر معقد شوية.