Kernel mode - برمجة Driver Filter
#11
السلام عليكم ورحمة الله
إقتباس :لم اكن اعلم اني من الأعضاء المميزين
ههههه
ان لم تكن من الأعضاء المميزين فلن نستطيع العيش في Kernel land بدونك Smile

إقتباس :جئت القي التحية والسلام على صديقي وزميل الكفاح الأخ STRELiTZIA

اشتقنا اليك كثيرا ، لتوّي انتهيت من الامتحانات وامامي 4 شهور كاملة لنلعب فيها بالكرنل .
مرحبا بك اخي العزيز الغالي Smile

و الله اشتقت لكم كثيرا جدا و لكن هي مشيئة الله.

إقتباس :لدي أشياء ستعجبك في KD STRELiTZIA Edition لكن أترك هذا لوقته
في انتظار تجربتها في احر من الجمر...

إقتباس :P.S. هذا ليس Filter driver .
Smile

في امان الله و بالتوفيق في الامتحانات ان شاء الله
الرد
#12
عودة للموضوع الأصلي ...
أين يسير هذا الموضوع ؟
هل تريدون برمجة Hook driver ام filter driver ؟
الرد
#13
السلام عليكم

1- أظن أن الأستاذ STRELiTZIA يريد أن نعمل برنامج يستقبل إستدعاءات النظام
لهده الدوال + تغير مسار الإستدعاء الأصلي الى الدوال الجديدة (NewZwXXXHook) .
يعني Hook & Filter (حسب معلوماتي) .

2- أكملت الواجهة + الأن **** إستقبال معلومات من الـ Kernel (مبدئيا StringBuffer )
خطوة خطوة .

PHP كود :
function DispatchRead(p_DeviceObject: PDEVICE_OBJECT; p_Irp: PIRP):
   
NTSTATUS; stdcall;
Var
  
CurrentIrpStack:PIO_STACK_LOCATION;
  
pDevExt:PDEVICE_EXTENSION;
  
userBuffer:PVOID;
  
xferSize:ULONG;
begin
 DbgPrint
('DispatchRead!');

 
// The stack location contains the user buffer info
 
CurrentIrpStack:= IoGetCurrentIrpStackLocation(p_Irp);
 
// Dig out the Device Extension from the Device object
 
pDevExt:= p_DeviceObject.DeviceExtension;


 
// Determine the length of the request
 
xferSize:=CurrentIrpStack.Parameters.Read.Length;
 
userBuffer:=p_Irp.AssociatedIrp.SystemBuffer;

 
// Don't transfer more than the user's request
 // ...

 // Now copy the pool buffer into user space
 
RtlCopyMemory(userBuffer,pDevExt.deviceBuffer,xferSize);

 
// Free pool buffer
    
ExFreePool(pDevExt.deviceBuffer);
    
pDevExt.deviceBuffer := Nil;
    
pDevExt.deviceBufferSize := 0;
  
 
// Now complete the IRP
 
p_Irp^.IoStatus.Status := STATUS_SUCCESS;
 
p_Irp^.IoStatus.Information := xferSize;
 
IofCompleteRequest(p_Irp, IO_NO_INCREMENT);
 
result := STATUS_SUCCESS;
end; 

هذا إجتهادي إن كان خطا ****ا التصحيح .... لكن المشكلة هنا هي الدالة RtlCopyMemory
أعدت تعريفها من الـ ntoskrnl لكن لم ينجح الإستدعاء هكذا :

PHP كود :
const
  
NtKernel='ntoskrnl.exe';

procedure RtlCopyMemory(Destination : PVOID ;Source: PVOID;Length: SIZE_T );StdCall;
-
implementation
-
procedure RtlCopyMemory; external NtKernel name '_RtlCopyMemory'; 

هل من الممكن أن يكون لنسخة النظام تأثير (تبديل الدالة لإسم أخر) أم أخطأت في مصدر التصدير ؟؟
I'M Fly Like A G6

الرد
#14
السلام عليكم ورحمة الله
إقتباس :هل تريدون برمجة Hook driver ام filter driver ؟
في اول الأمر نريد فقط برمجة Driver يعمل هوك للدوال المذكورة في اول مشاركة عن طريق هوك SSDT للحصول على المعلومات التي تمرر لتلك الدوال... يعني Driver hook فقط. Monitoring

ثم حسب كفاءة الأعضاء المشاركين و المرحلة العملية التي سنصل اليها في الموضوع سننتوجه للجزء الخاص برمجة Driver filter مستقل تماما.

اخي TF6M خذ وقتك...
يجب ان يأخذ المشروع كل الوقت الذي يلزم من البحث و التعلم لان الفائدة هي التحكم في برمجة الدرايفرات..

بالتوفيق ان شاء الله
الرد
#15
سأشارككم إن شاء الله بعد تعلمي لبعض الأمور الأساسية في برمجة الدرايفرات
إذا أي شخص صعندو مرجع أو درس لهذا الموضوع و يكون بالدلفي يضعه أو يبعوتو و ألف شكر مقدما
الرد
#16
إقتباس :هل من الممكن أن يكون لنسخة النظام تأثير (تبديل الدالة لإسم أخر) أم أخطأت في مصدر التصدير

نعم كان من المفروض أن تكون macro هكدا :

PHP كود :
procedure RtlCopyMemory(Destination: PVOID; const Source: PVOID; _Length: SIZE_T);
begin
  memcpy
(Destination, Source, _Length);
end; 

فقط للإفادة :thumbs: .
I'M Fly Like A G6

الرد
#17
السلام عليكم ورحمة الله

إقتباس :أم أخطأت في مصدر التصدير

للتتأكد من تصدير اي دالة من ملف ntoskrnl.exe افتحه فقط بــ PE Explorer مثلا ثم اذهب الى قائمة الــ Exports ان كان اسم الدالة موجود، هنا يمكنك اضافتها في الملف المصدريى ntoskrnl.pas و اعادة عمل compilation لملف ntoskrnl.pas.

مثلا :
ملف kernel32.dll يصدر : RtlCopyMemory
ملف ntoskrnl.exe لا يصدر RtlCopyMemory


إقتباس :نعم كان من المفروض أن تكون macro هكدا

عند محاولة اضافة دوال احرص على عدم وجودها في الوحدات المصدرية الأخرى -الوحدات الموجودة في مجلد sources الخاص بــ Kernel kit-

ملف macro.pas يحتوي على الدالة التي كتبتها، يمكنك استداءها فقط باضافة macro.pas في قائمة الــ uses.

و التي بدوره يعني ملف macro.pas يستدعي دالة : memcpy الموجودة في ملف ntoskrnl.pas. التي يصدرها ملف ntoskrnl.exe

يعني جولة طويلة للرجوع الى memcpy المعرفة في ملف ntoskrnl.exe.


إقتباس :
كود :
procedure RtlCopyMemory(Destination: PVOID; const Source: PVOID; _Length: SIZE_T); begin memcpy(Destination, Source, _Length); end;
بما يخص الدالة التي وضعت هي ترجمة لملف "winnt.h"

PHP كود :
#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length)) 

PHP كود :
RtlCopyMemory (
   
VOID UNALIGNED *Destination,
   CONST 
VOID UNALIGNED *Source,
   
SIZE_T Length
   
); 

إقتباس :فقط للإفادة
فقط للإفادة ايضا :monster1:
الرد
#18
خروج مؤقت عن الموضوع الاصلي
اسف يا جماعة لكن وجب علي ان أسلم علي اخي العزيز STRELiTZIA
والله وحشتنا جدا جدا جدا جدا والفريق من دونك ملوش طعم Sad
--
ايضا هذا القسم هل ممكن طرح فية نسخة FS التي من المفترض ان تكون بالدلفي لكي نستفيد من خبرات الاخوة الدلفاوية Big GrinBig Grin ؟
الرد
#19
Ahmed18 كتب :خروج مؤقت عن الموضوع الاصلي
اسف يا جماعة لكن وجب علي ان أسلم علي اخي العزيز STRELiTZIA
والله وحشتنا جدا جدا جدا جدا والفريق من دونك ملوش طعم Sad
--
ايضا هذا القسم هل ممكن طرح فية نسخة FS التي من المفترض ان تكون بالدلفي لكي نستفيد من خبرات الاخوة الدلفاوية Big GrinBig Grin ؟

هههه Smile فيك الخير اخي احمد... و سلامك وصل على العين و الراس...
اخي احمد لن اكون بعيدا و ان شاء الله حاضر في منتدى AT4RE

نعم يمكنك وضع FS هنا و لك كل الحريةفي وضع ما يهمك في هذا القسم...
و نحن في الخدمة...


خاج الموضوع :
TF6M ذهب الى الصين :monster2:

بالتوفيق ان شاء الله
الرد
#20
إقتباس :tf6m ذهب الى الصين
اذا لدينا ciono1 جديد :d
الرد


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


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