06-08-2009, 12:59 PM
08-08-2009, 12:05 PM
فكرة رائعة بارك الله فيك يا أستاذ
:
الدالة ZwLoadDriver
1- الهدف من الدالة : تحميل الدريفر للنظام أما عن مود التحميل لا أعلم .. ؟؟.
2- لها براماتر وحيد (هل كتابة الدالة صحيحة ؟؟؟) :
In_DriverServiceName : اليونيكوند الخاص بتحويل مسار الدريفر من الريجيستري نتحصل عليه بالدالة :
RtlInitUnicodeString مثال :
Registry > Machine > SystemCurrent > ControlSet > Services > DriverName
في إنتظار التصحيح .. بالتوفيق ,,
ممكن أخطأت في المثال :
:الدالة 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);08-08-2009, 12:56 PM
إقتباس :الدالة zwloaddriverيعني الحكاية اليوم على الدرافرات :Cup:
في انتظار تعاليق الاخوة اولا :crazy:
09-08-2009, 10:44 AM
السلام عليكم و رحمة الله
1- يجب ان يكون الدرايفر مسجل من قبل في النظام لتستطيع الدالة تحميلة و تشغيله.
2- الدالة لا تعمل Unload يجب استدعاء الدالة ZwUnloadDriver لتحرير الدرايفر - تعمل بنفس برامترات دالة التحميل.
لا...... ادخال البراميتر بهذه الطريقة يعتبر خطأ قاتل : BSOD :bangin: Blue Screen of Death
لا يوجد عندك Object بل مسار ريجيستري unicode فقط.
![[صورة: bsod.png]](http://img411.imageshack.us/img411/144/bsod.png)
المرفق يحتوي على مثال تطبيقي للدالة :
طريقة كتابة الدالة، لم اغير هيكل الدالة الأولى لعدم تعقيد الأمور.
اخي TF6M الطريقة التي كتبت اولا و ظننت انك اخطأت فيها هي الصحيحة :thumbsup:
قارن بين الكود الذي وضعت و ستجد الأخطاء التي يجب اصلاحها...
طريقة استعمال المرفق :
يــــــرجى اتباع المراحل بالترتيب الدقيق.
- تشغيل الأداة Dbgview لاتقاط رسائل الكرنل.
- تشغيل نسخة من اداة KmdManager و اختيار درايفر ZwDeleteFile
- تسجيل فقط الدرايفر ZwDeleteFile.
- تشغيل نسخة ثانية من اداة KmdManager و اختيار الدرايفر ZwLoadDriver.
- تسجيل و تشغيل الدرايفر ZwLoadDriver.
و بالطبع الاطلاع على رسائل الكرنل التي تظهر في DbgView.
يعني اننا سنقوم بتشغيل الدرايفر ZwLoadDriver و منه يتم استدعاء دايفر ثاني مسجل في النظام اسمه ZwDeleteFile و هذا الأخير يحاول حدف ملف تجريبي اسمه test.exe موجود في قرص C.
بالتوفيق ان شاء الله
إقتباس :ممكن أخطأت في المثال :الدالة تنتظر براميتر من نوع Pointer على المسار الريجستري الذي هو بدوره Unicode.
1- يجب ان يكون الدرايفر مسجل من قبل في النظام لتستطيع الدالة تحميلة و تشغيله.
2- الدالة لا تعمل Unload يجب استدعاء الدالة ZwUnloadDriver لتحرير الدرايفر - تعمل بنفس برامترات دالة التحميل.
PHP كود :
ZwLoadDriver (@obj_Attrib);
لا يوجد عندك Object بل مسار ريجيستري unicode فقط.
![[صورة: bsod.png]](http://img411.imageshack.us/img411/144/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.
بالتوفيق ان شاء الله
09-08-2009, 12:19 PM
السلام عليكم
1- يعن بواسطة الدريفر ZwLoadDriver حملنا الدريفر ZwDeleteFile المسجل مسبقا في الريجيستري .
2- طريقة كتابة الدالة بالدلفي ؟؟ ... يعني صحيحة لكن أين أضيفها هل في System أم في NtDll
3- الدالة ZwCreateFile و توزظيفها هي نفسها CreateFile في الـ User Mode :
ملاحظة : لكن إذا أردنا أن نستدعيها من الـ User Mode نستعمل NtCreateFile في مكان ZwCreateFile .
المثال :
- بالطبع نتيجة الدالة من NTSTATUS لأن كل رقم مرجع يوافق حالة ما مسجلة مسبقا أو غير مسجلة في الوحدة nt_status كما يمكننا أن نستعمل حاصل دالة IoStatusBlock كالـ IoResult لتحقق من الأخطاء .
- صيغة الدالة (****ا أن تكون صحيحة) :
بالتوفيق ,,
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;بالتوفيق ,,
09-08-2009, 09:45 PM
السلام عليكم
1-شرح هدفها
2-كيفية ادخال ال [COLOR="Red"]Parameters الخاصة بهذه الدالة [/COLOR]
ان شاء الله غدا في مثل هذا الوقت ساضع الشرح مع مثال توضيحي
PHP كود :
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle;Stdcall;
External'kernel32.dll' Name 'CreateToolhelp32Snapshot';
1-شرح هدفها
2-كيفية ادخال ال [COLOR="Red"]Parameters الخاصة بهذه الدالة [/COLOR]
ان شاء الله غدا في مثل هذا الوقت ساضع الشرح مع مثال توضيحي
10-08-2009, 12:01 PM
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;
الدريفر مرفق ايضا.
10-08-2009, 12:25 PM
شكرا بارك الله فيك .
فقط ماذا عن 1,2 .
فقط ماذا عن 1,2 .
10-08-2009, 12:43 PM
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.
بالتوفيق ان شاء الله
11-08-2009, 01:14 PM
السلام عليكم
الشرح عام ومبسط
دور الدالة هو الحصول على قائمة البرامج النشطة في الذاكرة.
بالنسبة البراماتر الاول يحدد ما المراد ارجاعه
th32ProcessID البرامترالثاني ياخذ رقم التعريف الخاص ب ال Process
بالنسبة لدالة AdjustProcessPrivilege فهي تعطينا صلاحيات في النظام لاضهار processes
المثال التوضيحي مرفق
الشرح عام ومبسط
دور الدالة هو الحصول على قائمة البرامج النشطة في الذاكرة.
بالنسبة البراماتر الاول يحدد ما المراد ارجاعه
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
المثال التوضيحي مرفق