Kernel mode - برمجة Driver Filter
#6
السلام عليكم و رحمة الله و بركاته
شكر خاص للأستاذ STRELiTZIA على هذا الطرح المتميز :bye1: بارك الله فيك .

- أظن أنه قبل أن نبدأ بالعمل أظن أنه يجب شرح بعض المفاهيم المتعلقة بالـ Kernel Mode إظافة على
ذلك فإنه يتيح لي و للأخوة الأعضاء تصحيح الأخطاء (فما بني على باطل فهو باطلSmile) .

==================================================

1-القسم النظري :

//System Service Dispatch Table

الـ SSDT عبارة عن جدول يقع في الكيرنل لاند يقوم بإدارة الـ SYSCALL
كمثال على بعض الإستدعاءات :

NtDeleteFile / NtCreateFile .... هدا من أجل التعامل مع الملفات !!! .

[صورة: mod.gif]

حيث يتم وضع ZwOpenFile في جدول التعريفات وهكذا يتم تنفيذ كل الدوال المسجل بطريقة
متسلسلة .

//كيف ننشأ دريفر

1- كل دريفر يبدأ بالدالة DriverEntry كما يوحي اسمها هي نقطة دخول أو بداية الدريفر , يقوم الكيرنل بتنفيذ التعليمات أو الكود المكتوب في الدريفر و ذلك
عن طريق إرسال طلبات الإدخال و الإخراج I/O request packets - IRPs على سبيل المثال في Win32 يتم إستقبال الدالة ReadFile
على أنها طلب من أجل القراءة read IRP , و عليه يمكن أن نحدد كل دالة من اليوزد مود و طبيعة تعاملها مع الدريفر :

CreateFile == IRP_MJ_CREATE
CloseHandle == IRP_MJ_CLEANUP & IRP_MJ_CLOSE
WriteFile == IRP_MJ_WRITE
ReadFile == IRP_MJ_READ
DeviceIoControl == IRP_MJ_DEVICE_CONTROL

2- يقوم الكيرنل بإستدعاء DriverEntry عند تحميل الدريفر كما يمكن أيضا أن تستدعي العديد من الدوال أو الأجراءات الأخرى , يعني أنه كل ما
يتم فيها تهيئة الدريفر للتحميل فأنه يسجل كافة الدوال و الإجراءات المدعومة من الكيرنل فقط , عندها يقوم الكيرنل بإستدعاء هده الدوال أو
الإجراءات وفق روتينات و حالات خاصة

3- بطريقة عملية و مثالية يمكن لنا أن نقسم نقطة الدخول أو التحميل الخاصة بالدريفر هكدا :

DriverEntry : نقطة البداية أو الدخول يتم على مستواها تسجيل كل الإستدعاءات المبرمجة نحو الكيرنل .
Unload : إلغاء تحميل الدريفر .
IRP Handlers : مقابض روتينات الإرسال و الإستقبال التي نريد التعامل معها .

يمكن أيضا إظافة :

StartIo : روتين لجلب مقابض IRPs بشكل متسلسل .
Interrupt Service Routine - ISR : الإتصال بمقابض قطاعات الجهاز .

إذن الشكل العام للدريفر (على أساس تنظيم المشروع ) DriverFilter :

PHP كود :
var
    
DeviceName, SymbolicLinkName: UNICODE_STRING;
    
   
procedure DriverUnload(p_DriverObject: PDRIVER_OBJECT); stdcall;
   
begin
    
if IoDeleteSymbolicLink(@SymbolicLinkName) <> STATUS_SUCCESS then
     DbgPrint
('DeleteSymbolicLink Fail!');
    
IoDeleteDevice(p_DriverObject^.DeviceObject);
   
end;
   
   function 
DispatchCreate(p_DeviceObject: PDEVICE_OBJECT; p_Irp: PIRP):
   
NTSTATUS; stdcall;
   
begin
    DbgPrint
('DisPatchCreate!');
    
p_Irp^.IoStatus.Status := STATUS_SUCCESS;
    
p_Irp^.IoStatus.Information := 0;
    
IofCompleteRequest(p_Irp, IO_NO_INCREMENT);
    
result := STATUS_SUCCESS;
   
end;
    
   function 
_DriverEntry(pDriverObject: PDRIVER_OBJECT; RegistryPath:
   
PUnicodeString): NTSTATUS; stdcall;
   var
    
pDeviceObject: TDeviceObject;
    
   
begin
    Result 
:= STATUS_DEVICE_CONFIGURATION_ERROR;
    
RtlInitUnicodeString(DeviceName, '\DriverFilter');
    
RtlInitUnicodeString(SymbolicLinkName, '\??\DriverFilterApp');
    if (
IoCreateDevice(pDriverObject, 0, @DeviceName, FILE_DEVICE_UNKNOWN,
   
0, FALSE, pDeviceObject) = STATUS_SUCCESS) then
    begin
     
if (IoCreateSymbolicLink(@SymbolicLinkName, @DeviceName) = STATUS_SUCCESS)
   
then
     begin
      pDriverObject
^.MajorFunction[IRP_MJ_CREATE] := @DispatchCreate;
      
//pDriverObject^.MajorFunction[IRP_MJ_CLOSE] := @DispatchClose;
      //pDriverObject^.MajorFunction[IRP_MJ_WRITE] := @DispatchWRITE;
      //pDriverObject^.MajorFunction[IRP_MJ_READ] := @DispatchREAD;
      
pDriverObject^.DriverUnload := @DriverUnload;
      
Result := STATUS_SUCCESS;
     
end else
     
begin
      DbgPrint
('IoCreateSymbolicLink fail!');
      
IoDeleteDevice(@pDeviceObject);
     
end;
    
end else
     
DbgPrint('IoCreateDevice Fail!');
    
result := STATUS_SUCCESS;
   
end; 

أكتفي بهذا القدر مع الذكر بأني لم أجرب تشغيل الكود أعلاه
لكن فقط إستنتاجات ... أكمل المرة القادمة إن شاء الله .


الملفات المرفقة
.rar   KernelUtils.rar (الحجم : 6.3 ك ب / التحميلات : 31)
I'M Fly Like A G6

الرد


الردود في هذا الموضوع
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 15-01-2010, 10:12 AM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 21-01-2010, 09:18 AM
Kernel mode - برمجة Driver Filter - بواسطة mohfa - 21-01-2010, 11:13 AM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 21-01-2010, 11:44 AM
Kernel mode - برمجة Driver Filter - بواسطة mohfa - 21-01-2010, 12:47 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 23-01-2010, 11:29 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 25-01-2010, 12:14 PM
Kernel mode - برمجة Driver Filter - بواسطة GamingMasteR - 27-01-2010, 03:53 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 27-01-2010, 06:23 PM
Kernel mode - برمجة Driver Filter - بواسطة GamingMasteR - 28-01-2010, 01:09 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 28-01-2010, 02:28 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 28-01-2010, 06:55 PM
Kernel mode - برمجة Driver Filter - بواسطة o15s19 - 29-01-2010, 10:52 AM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 30-01-2010, 08:56 AM
Kernel mode - برمجة Driver Filter - بواسطة Ahmed18 - 01-02-2010, 12:55 AM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 01-02-2010, 01:41 PM
Kernel mode - برمجة Driver Filter - بواسطة GamingMasteR - 01-02-2010, 02:11 PM
Kernel mode - برمجة Driver Filter - بواسطة GamingMasteR - 01-02-2010, 08:09 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 20-02-2010, 10:12 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 21-02-2010, 10:31 AM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 21-02-2010, 11:11 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 22-02-2010, 01:29 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 22-02-2010, 03:35 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 22-02-2010, 04:25 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 22-02-2010, 04:55 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 22-02-2010, 05:09 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 22-02-2010, 05:36 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 22-02-2010, 05:44 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 22-02-2010, 05:49 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 22-02-2010, 06:00 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 22-02-2010, 06:39 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 25-01-2010, 12:33 PM
Kernel mode - برمجة Driver Filter - بواسطة STRELiTZIA - 25-01-2010, 12:45 PM
Kernel mode - برمجة Driver Filter - بواسطة TF6M - 29-01-2010, 12:07 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم