Kernel-mode programming #1 - REinvestigator - 20-10-2018
اقتباس من الموضوع الأصلي لـــ GamingMasteR
إقتباس :السلام عليكم ورحمة الله وبركاته
في أول درس لنا سنتعلم بعض المفاهيم الأساسية عن أنظمة NT , لابد أولا أن نأخذ فكرة عن مكونات النظام الأساسية , يجب التنويه أيضا عن أن كل ما سيتم شرحه ينطبق فقط على بيئة win32 .
يمكن تقسيم مكونات النظام كالتالي :-
User-mode components :
- Subsystem : وهو يتمثل في العملية Csrss.exe وهو المسؤول عن الـConsoleWindows بالاضافة الى انشاء وحذف الـThreads .
- System Processes : وهي تتمثل في العمليات التي تساعد النظام بشكل اساسي كي يعمل مثل SMSS.EXE/WINLOGON.EXE .
- Services : وهي عمليات لابد من وجودها كي تستطيع برامج اخرى ان تعمل بشكل صحيح مثل SQL Server/Spooler/MS Exchange Server .
- User Applications : وهي البرامج العادية التي نستخدمها يوميا .
Kernel-mode components :
- Kernel : ويحتوي على الروتينات الاساسية لنظام التشغيل مثل الـInterrupts Dispatcher/Thread Scheduler/Synchronization System .
- Executive : يحتوي على الـMemory Manager/Objects Manager/Security/IO System/Networking .
الـKernel و الـExecutive يتواجدان في ملف ntoskrnl.exe وهو يمثل نواة النظام .
- Hardware Abstraction Layer (HAL) : وهي طبقة لعزل باقي الكرنل عن الهاردوير بانواعه المختلفة والغرض من ذلك هو الـPortability حيث ان كل hardware مختلف سيحتاج الى HAL مختلف فقط بدون التعديل في باقي الكرنل لأن الـHAL هو الذي يوفر روتينات التعامل مع الهاردوير .
يوجد الـHAL في ملف HAL.DLL .
- GUI Kernel : وهو المسؤول عن الـUserInterface كالتعامل مع النوافذ و كائنات الـGDI كلها , ويتمثل في ملف win32k.sys .
الفرق بين User-mode و Kernel-mode :
في مستوى المستخدم User-mode كل عملية لها ذاكرة وهمية VirtualMemory خاصة بها , كل Thread داخل العملية يتم تنفيذ الكود الخاص به داخل هذه الـVM ولا يمكنه تغيير الذاكرة الوهمية الخاصة بعملية اخرى , في مستوى الكرنل يمكن لأي Thread ان يغير من ذاكرة أي بروسس اخر وسنتكلم عن ذلك لاحقاً .
أيضا من المعلوم ان هناك Privileged Instructions لا يستطيع Thread يعمل في اليوزر مود استخدامها مثل IN/OUT/ LLDT , في مستوى الكرنل يمكنك استخدام جميع التعليمات بلا أي قيود .
أي Thread يعمل في اليوزر مود لا يمكنه استخدام موارد النظام مباشرة مثل الذاكرة الخاصة بالنظام او التعامل مباشرة مع الـHardware .
عند حدوث أي خطأ في Thread يعمل بمستوى المستخدم ولم يكن هناك ExceptionHandler فإن الذي يحدث هو إغلاق البروسس الذي يحتوي على الـThread , بينما عند حدوث خطأ اثناء عمل الـThread بمستوى النظام ولم يكن هناك ExceptionHandler مناسب فان النظام كله ينهار وربما يحدث bugcheck و ترى الشاشة الزرقاء BSoD .
هل يمكن الانتقال للكرنل من خلال Thread يعمل في يوزر مود ؟؟
نعم , وذلك عن طريق استدعاء خدمات النظام او عن طريق احداث Exception او استدعاء المقاطعات , لكن اثناء وجود الـThread في الكرنل مود لا يمكنك التحكم في سير التنفيذ حتى يعود الـThread الى الوضع السابق .
هل يمكنني استدعاء دوال الـuser-mode مثل الدوال الموجودة في Kernel32.dll/User32.dll/Ntdll.dll من خلال الكرنل مود ؟
لا يمكنك فعل ذلك مباشرة , اذا كنت تظن انه يمكنك اظهار MessageBox من driver فأنت مخطئ تماماً , لكن بالطبع هناك طرق لفعل ذلك بشكل غير مباشر , سنتكلم عن هذا في الدروس اللاحقة .
ما هي انواع الذاكرة التي سنتعامل معها ؟
نوعان PagedPool/NonpagedPool , PagedPool هي الذاكرة التي يتم عمل swapping لها اثناء انتقال الـExecution من process الى اخر فيتم تخزينها في الـPagefile الى ان ينتقل الـتنفيذ مرة اخرى الى نفس البروسس فيتم ارجاعها الى الرام , كمثال الذاكرة التي تحتوي على ملف dll في بروسس معين .
اما الـNonpagedpool فهي ذاكرة تظل موجودة في الرام ولا يتم تخزينها في الـPagefile حيث انها تمثل عناصر مهمة لا يستغني النظام عن تواجدها اثناء التنفيذ في أي بروسس كان , كمثال الـkernel نفسه و معظم الدرايفرات و الـExecutive Objects مثل الـObjects التي تمثل الـThread/Process/Key/Device .. الخ .
ما هي الادوات التي سنحتاجها للبدأ في كتابة درايفر ؟
سنحتاج الى حزمة الـDDK , أي نسخة ابتداءا من 2600 ستنفع , هذه النسخة التي استعملها حاليا وهي 3790 الخاصة بـWindows 2003 :
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
لدي ايضا النسخة الخاصة بـWindows 7 لكن لم اجربها بعد .
ستحتاج أيضا الى أي اداة تقوم باظهار الـDebug Output مثل DbgView/KernelDetective/Syser , عن نفسي أفضل استخدام DbgView .
بالطبع ستحتاج الى أي محرر للكود , يمكنك استخدام VS/Code::Block/Notepad++ او أي شئ اخر .
اترككم يومين في رعاية الله حتى تحصلوا على العدة اللازمة للبدأ وكي اقوم انا بتحضير الدرس القادم
السبت 7/2/2009
GamingMasteR / AT4RE
References :
Microsoft® Windows® Internals, Fourth Edition - Mark E. Russinovich, David A. Solomon
|