[تمرين] الكل يسأل و الكل يجيب
#11
إقتباس :شكرا اخي strelitzia على فتح هكذا مواضيع .
بارك الله فيكم انتم اخواني اعضاء المنتدى على اثراء المواضيع...
الرد
#12
فكرة رائعة بارك الله فيك يا أستاذ Big Grin:

الدالة ZwLoadDriver

كود :
Function [color=Red]ZwLoadDriver[/color];External 'NtDll.Dll' Name 'ZwLoadDriver';

1- الهدف من الدالة : تحميل الدريفر للنظام أما عن مود التحميل لا أعلم .. ؟؟.

2- لها براماتر وحيد (هل كتابة الدالة صحيحة ؟؟؟) :

كود :
Function [color=Red]ZwLoadDriver[/color](DriverServiceName:PUNICODE_STRING):NTSTATUS; stdcall;

In_DriverServiceName : اليونيكوند الخاص بتحويل مسار الدريفر من الريجيستري نتحصل عليه بالدالة :

RtlInitUnicodeString مثال :

Registry > Machine > SystemCurrent > ControlSet > Services > DriverName

كود :
Var UNICODESTRING: PUNICODE_STRING; RtlInitUnicodeString(UNICODESTRING,'Machine\System\CurrentControlSet\Services\DriverName.Sys'); ZwLoadDriver(UNICODESTRING);

في إنتظار التصحيح .. بالتوفيق ,,

ممكن أخطأت في المثال :

كود :
procedure [color=Red]RtlInitUnicodeString[/color]; external 'ntoskrnl.exe' name 'RtlInitUnicodeString';


كود :
var UNICODESTRING: UNICODE_STRING; obj_Attrib: OBJECT_ATTRIBUTES; RtlInitUnicodeString(UNICODESTRING, 'Machine\System\CurrentControlSet\Services\DriverName.Sys'); InitializeObjectAttributes(obj_Attrib, @UNICODESTRING, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil); ZwLoadDriver (@obj_Attrib);
الرد
#13
إقتباس :الدالة zwloaddriver
يعني الحكاية اليوم على الدرافرات :Cup:
في انتظار تعاليق الاخوة اولا :crazy:
الرد
#14
السلام عليكم و رحمة الله

إقتباس :ممكن أخطأت في المثال :
الدالة تنتظر براميتر من نوع Pointer على المسار الريجستري الذي هو بدوره Unicode.
1- يجب ان يكون الدرايفر مسجل من قبل في النظام لتستطيع الدالة تحميلة و تشغيله.
2- الدالة لا تعمل Unload يجب استدعاء الدالة ZwUnloadDriver لتحرير الدرايفر - تعمل بنفس برامترات دالة التحميل.


PHP كود :
ZwLoadDriver (@obj_Attrib); 
لا...... ادخال البراميتر بهذه الطريقة يعتبر خطأ قاتل : BSOD :bangin: Blue Screen of Death
لا يوجد عندك Object بل مسار ريجيستري unicode فقط.


[صورة: bsod.png]


المرفق يحتوي على مثال تطبيقي للدالة :


طريقة كتابة الدالة، لم اغير هيكل الدالة الأولى لعدم تعقيد الأمور.
PHP كود :
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
var 
UNICODESTRING: UNICODE_STRING;
begin
 
  DbgPrint
('Test Driver :: Loaded');
  
DriverObject^.DriverUnload := @DriverUnload;
  
RtlInitUnicodeString(UNICODESTRING, '\Registry\Machine\System\CurrentControlSet\Services\ZwDeleteFile');
  
Result := ZwLoadDriver(@UNICODESTRING);
 
  if 
Result = STATUS_SUCCESS then
  begin
    DbgPrint
('Driver loaded sucessfully Result:0x%.8X', Result); // Result to get Error Code
  
end else
  
begin
    DbgPrint
('Fail to load driver Result:0x%.8X', Result); // Result to get Error Code
  
end;
  
Result := STATUS_SUCCESS;
 
end; 

اخي TF6M الطريقة التي كتبت اولا و ظننت انك اخطأت فيها هي الصحيحة :thumbsup:
قارن بين الكود الذي وضعت و ستجد الأخطاء التي يجب اصلاحها...

طريقة استعمال المرفق :
يــــــرجى اتباع المراحل بالترتيب الدقيق.

- تشغيل الأداة Dbgview لاتقاط رسائل الكرنل.
- تشغيل نسخة من اداة KmdManager و اختيار درايفر ZwDeleteFile
- تسجيل فقط الدرايفر ZwDeleteFile.
- تشغيل نسخة ثانية من اداة KmdManager و اختيار الدرايفر ZwLoadDriver.
- تسجيل و تشغيل الدرايفر ZwLoadDriver.

و بالطبع الاطلاع على رسائل الكرنل التي تظهر في DbgView.
يعني اننا سنقوم بتشغيل الدرايفر ZwLoadDriver و منه يتم استدعاء دايفر ثاني مسجل في النظام اسمه ZwDeleteFile و هذا الأخير يحاول حدف ملف تجريبي اسمه test.exe موجود في قرص C.

بالتوفيق ان شاء الله


الملفات المرفقة
.rar   ZwLoadDriver.rar (الحجم : 94.63 ك ب / التحميلات : 103)
الرد
#15
السلام عليكم

1- يعن بواسطة الدريفر ZwLoadDriver حملنا الدريفر ZwDeleteFile المسجل مسبقا في الريجيستري .

2- طريقة كتابة الدالة بالدلفي ؟؟ ... يعني صحيحة لكن أين أضيفها هل في System أم في NtDll

3- الدالة ZwCreateFile و توزظيفها هي نفسها CreateFile في الـ User Mode :

ملاحظة : لكن إذا أردنا أن نستدعيها من الـ User Mode نستعمل NtCreateFile في مكان ZwCreateFile .

المثال :
كود :
uses nt_status, ntoskrnl, ntifs, native, winioctl, fcall, macros; Var RtnCode: NTSTATUS; oa: OBJECT_ATTRIBUTES; iosb: IO_STATUS_BLOCK; hDirectory: HwnD; { function _DriverEntry(pDriverObject:PDRIVER_OBJECT; pusRegistryPath:PUNICODE_STRING): NTSTATUS; stdcall;} RtnCode := ZwCreateFile(@hDirectory, SYNCHRONIZE, @oa, @iosb, nil, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN_IF, FILE_DIRECTORY_FILE + FILE_SYNCHRONOUS_IO_NONALERT, nil, 0); if RtnCode = STATUS_SUCCESS then begin if iosb.Information = FILE_CREATED then begin DbgPrint('FileWorks: Directory created'#13#10); end else if iosb.Information = FILE_OPENED then begin DbgPrint('FileWorks: Directory exists and was opened'#13#10); end; ZwClose(hDirectory); end;

- بالطبع نتيجة الدالة من NTSTATUS لأن كل رقم مرجع يوافق حالة ما مسجلة مسبقا أو غير مسجلة في الوحدة nt_status كما يمكننا أن نستعمل حاصل دالة IoStatusBlock كالـ IoResult لتحقق من الأخطاء .

- صيغة الدالة (****ا أن تكون صحيحة) :
كود :
Function [color=Red]ZwCreateFile[/color](FileHandle:PHANDLE; DesiredAccess:ACCESS_MASK;ObjectAttributes:POBJECT_ATTRIBUTES; IoStatusBlock:PIO_STATUS_BLOCK ;AllocationSize:PLARGE_INTEGER ; FileAttributes,ShareAccess,CreateDisposition,CreateOptions:ULONG ; EaBuffer:PVOID;EaLength:ULONG):NTSTATUS;StdCall;

بالتوفيق ,,
الرد
#16
السلام عليكم

PHP كود :
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle;Stdcall;
External'kernel32.dll' Name 'CreateToolhelp32Snapshot'; 


1-شرح هدفها
2-كيفية ادخال ال [COLOR="Red"]Parameters الخاصة بهذه الدالة [/COLOR]


ان شاء الله غدا في مثل هذا الوقت ساضع الشرح مع مثال توضيحي
الرد
#17
TF6M كتب :السلام عليكم
- صيغة الدالة (****ا أن تكون صحيحة) :
بالتوفيق ,,

و عليكم السلام و رحمة الله
جيد اخي TF6M اخذت المثال الخاص بــ KmdKit4D :thumbsup:

نفس الدالة بعد بعض التعديل و التنظيم.

PHP كود :
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
var
  
UnicodeDirPath: UNICODE_STRING;
  
UnicodeFilePath: UNICODE_STRING;

  
DirObject: OBJECT_ATTRIBUTES;
  
FileObject: OBJECT_ATTRIBUTES;

  
hDirectory: THANDLE;
  
hFile: THANDLE;
  

  
IOSTATUSBLOCK: IO_STATUS_BLOCK;
begin

  DbgPrint
('Test Driver :: Loaded');
  
DriverObject^.DriverUnload := @DriverUnload;

  
RtlInitUnicodeString(UnicodeDirPath, '\??\C:\Delphi4Arab');
  
RtlInitUnicodeString(UnicodeFilePath, '\??\C:\Delphi4Arab\Test.txt');

  
InitializeObjectAttributes(DirObject, @UnicodeDirPath, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil);
  
InitializeObjectAttributes(FileObject, @UnicodeFilePath, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil);


  
Result := ZwCreateFile(@hDirectory,
    
SYNCHRONIZE,
    @
DirObject,
    @
IOSTATUSBLOCK,
    
nil,
    
FILE_ATTRIBUTE_NORMAL,
    
0,
    
FILE_OPEN_IF,
    
FILE_DIRECTORY_FILE + FILE_SYNCHRONOUS_IO_NONALERT,
    
nil,
    
0);

  if 
Result = STATUS_SUCCESS then
  begin
    
if IOSTATUSBLOCK.Information = FILE_CREATED then
    begin
      DbgPrint
('Directory Created Sucessfully');
    
end else
      if 
IOSTATUSBLOCK.Information = FILE_OPENED then
      begin
        DbgPrint
('Directory Already Exists and Was Opened');
      
end;
    
ZwClose(hDirectory);
  
end;

  
Result := ZwCreateFile(@hFile,
    
SYNCHRONIZE,
    @
FileObject,
    @
IOSTATUSBLOCK,
    
nil,
    
FILE_ATTRIBUTE_NORMAL,
    
0,
    
FILE_CREATE,
    
FILE_SYNCHRONOUS_IO_NONALERT,
    
nil,
    
0);

  if 
Result = STATUS_SUCCESS then
  begin
    DbgPrint
('File Created Sucessfully');
    
ZwClose(hFile);
  
end else
  
begin
    DbgPrint
('Can''t Create File - Already Exists Status: %08X', Result);
  
end;
  
Result := STATUS_SUCCESS;
end; 

الدريفر مرفق ايضا.


الملفات المرفقة
.rar   ZwCreateFile.rar (الحجم : 1.5 ك ب / التحميلات : 61)
الرد
#18
شكرا بارك الله فيك .
فقط ماذا عن 1,2 .
الرد
#19
TF6M كتب :شكرا بارك الله فيك .
فقط ماذا عن 1,2 .

إقتباس :1- يعن بواسطة الدريفر ZwLoadDriver حملنا الدريفر ZwDeleteFile المسجل مسبقا في الريجيستري .
دالة LoadDriver سواء كان استدعائها من الــ User mode او الــ Kernel modeتحمل فقط الدرايفرات المسجلة مسبقا في النظام.

نعم في المثال السابق قمنا بتحميل درايفر ZwDeleteFile.sys انطلاقا من الــ kernel mode بواسطة الدرايفر ZwLoadDriver.sys.

إقتباس :2- طريقة كتابة الدالة بالدلفي ؟؟ ... يعني صحيحة لكن أين أضيفها هل في System أم في NtDll
لا...
اذا اردت التعامل مع تصديرات Exports الكرنل ntoskrnl.exe يجب اضافتها في المكتبة الأصلية ntoskrnl.pas الخاصة بــ KmdKit4D.

بالتوفيق ان شاء الله
الرد
#20
السلام عليكم

الشرح عام ومبسط

دور الدالة هو الحصول على قائمة البرامج النشطة في الذاكرة.

بالنسبة البراماتر الاول يحدد ما المراد ارجاعه

th32ProcessID البرامترالثاني ياخذ رقم التعريف الخاص ب ال Process



PHP كود :
Var
   
Handle: THandle;
   
Struc: TProcessEntry32;
begin
   AdjustProcessPrivilege
(GetCurrentProcess,'SeDebugPrivilege');
 
begin
   Handle
:=CreateToolHelp32SnapShot($00000002, 0);
   
Struc.dwSize:=Sizeof(TProcessEntry32);
   if 
Process32First(Handle, Struc) then
   ProcList
.Items.Add(Struc.szExeFile);
   while 
Process32Next(Handle, Struc) do
   
ProcList.Items.Add(Struc.szExeFile);
 
end;
end; 

بالنسبة لدالة AdjustProcessPrivilege فهي تعطينا صلاحيات في النظام لاضهار processes
المثال التوضيحي مرفق
الرد


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


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