Kernel mode - برمجة Driver Filter - محمد عبد العزيز - 01-02-2010
إقتباس :اذا لدينا ciono1 جدي
هل تعرف ماذا تعني :d
يالمناسبة هل من اخبار عنه ؟
Kernel mode - برمجة Driver Filter - GamingMasteR - 01-02-2010
لم أسمع منه منذ مدة كبيرة ، أكيد مطحون في الدنيا ...
Kernel mode - برمجة Driver Filter - TF6M - 20-02-2010
السلام عليكم
واجهت مشكلة أثناء تحميل ZwCreateFileHook هذا كود الدريفر من موقع :rtfm: KMD
PHP كود : unit ZwCreateFileHook;
interface
uses nt_status, ntoskrnl, native, winioctl,fcall, macros;
function _DriverEntry(pDriverObject: PDRIVER_OBJECT; pusRegistryPath: PUNICODE_STRING): NTSTATUS; stdcall;
implementation
type TfnZwCreateFile = function(FileHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIO_STATUS_BLOCK; AllocationSize: PLARGE_INTEGER; FileAttributes: ULONG; ShareAccess: ULONG; CreateDisposition: ULONG; CreateOptions: ULONG; EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall;
var m_UserTime : LARGE_INTEGER; m_KernelTime : LARGE_INTEGER; o_ZwCreateFile : TfnZwCreateFile; g_pmdlSystemCall: PMDL; MappedSystemCallTable: Pointer; lpKeServiceDescriptorTable: PServiceDescriptorEntry;
function GetImportFunAddr(lpImportAddr: Pointer): Pointer; stdcall; begin Result := PPointer(PPointer(Cardinal(lpImportAddr) + 2)^)^; end;
function SystemServiceName(AFunc: Pointer): PLONG; stdcall; begin Result := PLONG(Cardinal(lpKeServiceDescriptorTable^.ServiceTableBase) + (SizeOf(ULONG) * PULONG(ULONG(AFunc) + 1)^)); end;
function NewZwCreateFile(FileHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIO_STATUS_BLOCK; AllocationSize: PLARGE_INTEGER; FileAttributes: ULONG; ShareAccess: ULONG; CreateDisposition: ULONG; CreateOptions: ULONG; EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall; begin DbgPrint('NewZwCreateFile enter ...'); Result := o_ZwCreateFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength); DbgPrint('NewZw Leave.'); end;
procedure OnUnload(pDriverObject: PDRIVER_OBJECT); stdcall; begin DbgPrint('ROOTKIT: OnUnload called'#13#10);
InterlockedExchange(SystemServiceName(GetImportFunAddr(@ZwCreateFile)), LONG(@o_ZwCreateFile));
if g_pmdlSystemCall <> nil then begin MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall); IoFreeMdl(g_pmdlSystemCall); end; end;
function _DriverEntry(pDriverObject: PDRIVER_OBJECT; pusRegistryPath: PUNICODE_STRING): NTSTATUS;stdcall; begin
lpKeServiceDescriptorTable := GetImportFunAddr(@KeServiceDescriptorTable);
pDriverObject^.DriverUnload := @OnUnload;
DbgPrint('ROOTKIT: load called'#13#10);
m_UserTime.QuadPart := 0; m_KernelTime.QuadPart := 0;
o_ZwCreateFile := TfnZwCreateFile(SystemServiceName(GetImportFunAddr(@ZwCreateFile)));
g_pmdlSystemCall := MmCreateMdl(nil, lpKeServiceDescriptorTable^.ServiceTableBase, lpKeServiceDescriptorTable^.NumberOfServices * 4); if g_pmdlSystemCall = nil then begin Result := STATUS_UNSUCCESSFUL; Exit; end;
MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
g_pmdlSystemCall^.MdlFlags := g_pmdlSystemCall^.MdlFlags or MDL_MAPPED_TO_SYSTEM_VA;
MappedSystemCallTable := MmMapLockedPages(g_pmdlSystemCall, KernelMode);
o_ZwCreateFile := TfnZwCreateFile(InterlockedExchange(SystemServiceName(GetImportFunAddr(@ZwCreateFile)), LONG(@NewZwCreateFile)));
Result := STATUS_SUCCESS; end;
end.
السؤال هنا أن صاحب الموضوع و المشاركين نجحو في تشغيله دون Bsod
على عكسي :frusty: لدا أعدة مراجعه الموضوع, هل من الممكن :
الداكرة المخصصة لـ SSDT داكرة للقراءة فقط , و نحن نريد التغير في مسار الإستدعاء :crazy:؟؟.
Kernel mode - برمجة Driver Filter - STRELiTZIA - 21-02-2010
و عليكم السلام و رحمة الله
إقتباس :السؤال هنا أن صاحب الموضوع و المشاركين نجحو في تشغيله دون bsod
اخذت السورس الذي و ضعته اخي TF6M و انتج عندي درايفر يعمل بدون مشاكل. تمت التجربة على Xp SP2 و SP3.
العمليات:
- انتاج الدرايفر - ناجحة.
- تسجيل، تحميل، الغاء التحميل و الغاء التسجيل - ناجحة.
- Hook لدالة ZwCreateFile - ناجحة
![[صورة: 87208626.jpg]](http://img46.imageshack.us/img46/7968/87208626.jpg)
![[صورة: 80603985.jpg]](http://img25.imageshack.us/img25/2226/80603985.jpg)
![[صورة: 60224788.jpg]](http://img52.imageshack.us/img52/9370/60224788.jpg)
إقتباس :على عكسي
اظن ان المشكل سببه الــ Kit التي تستعمل في انتاج الدرايفر !
حمل آخر اصدار للــ Kit من الموقع الرسمي ثم حاول من جديد، انتبه فقط لمسارات MakeFile التي يجب ان توجهك الى الــ Kit الجديدة و ليس مسار الــ Kit التي عندك...
كيفية التعامل مع المرفق:
المرفق يحتوي على : ملف مصدري -الذي وضعته في مشاركتك-، الدرايفر المنتج عندي و ملف Object هذا الأخير له دور آخر...
1- حاول تسجيل و تحميل الدرايفر المرفق.
2- ضع ملف Object بجانب الملف المصدري و قم بعمل درايفر جديد في جهازك، عملية الانتاج ستأخذ ملف Object المرفق لبناء الدرايفر دون استعمال الذي في جهازك.
جرب هذه العمليات قبل ان تستعمل الــ Kit الموجودة في الموقع الرسمي، و اخبرني...
إقتباس :الداكرة المخصصة لـ SSDT داكرة للقراءة فقط , و نحن نريد التغير في مسار الإستدعاء ؟؟
بخصوص هذا التعجب سنجيب عليه ان شاء الله في آخر مراحل اكتمال المشروع، الآن يجب ان ننتهي من معالجة الأخطاء الأولية الخاصة بكتابة الأوامر و غيرها...
Kernel mode - برمجة Driver Filter - TF6M - 21-02-2010
بارك الله فيك أستاد
سأجرب و أظع النتيجة !! .
سؤال تاني خارج عن الموضوع لكن أحتاجه :
PHP كود : unit ZwDeleteFileFromRing3;
interface
uses nt_status, ntoskrnl, macros;
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
implementation
var DeviceName, SymbolicLinkName: UNICODE_STRING; //********************************************************************************// Function Example_IsStringTerminated(pString:PAnsiChar; uiLength: ULONG):Boolean; stdCall; var bStringIsTerminated:Boolean; uiIndex:ULONG; begin bStringIsTerminated:= False; uiIndex := 0; { here, uiIndex must be initialized! } while(uiIndex < uiLength) and (bStringIsTerminated = False) do begin if pString[uiIndex] = #0 then bStringIsTerminated := True else Inc(uiIndex); end; Result:= bStringIsTerminated; end;
function MmGetSystemAddressForMdlSafe(MDL: PMDL; PRIORITY: DWORD): PVOID; begin if ((MDL^.MdlFlags and (MDL_MAPPED_TO_SYSTEM_VA or MDL_SOURCE_IS_NONPAGED_POOL)) <> 0) then Result := MDL^.MappedSystemVa else Result := MmMapLockedPagesSpecifyCache(MDL, KernelMode, MmCached, nil, 0, PRIORITY); end;
//********************************************************************************//
procedure DriverUnload(DriverObject: PDriverObject); stdcall; begin IoDeleteSymbolicLink(@SymbolicLinkName); IoDeleteDevice(DriverObject^.DeviceObject); DbgPrint('Driver :: Unloaded'); end;
function CreateCloseDispatch(const DeviceObject : PDEVICE_OBJECT; const Irp : PIRP) : NTSTATUS; stdcall; begin DbgPrint('DirectIO: CreateDispatch'#13#10); Irp^.IoStatus.Status:= STATUS_SUCCESS; Irp^.IoStatus.Information:= 0; IoCompleteRequest(Irp,IO_NO_INCREMENT); Result:=STATUS_SUCCESS; end;
Procedure DeleteFileReq (pWDB: pwidechar); Var UNICODESTRING: UNICODE_STRING; obj: OBJECT_ATTRIBUTES; Rslt: NTSTATUS;
Begin RtlInitUnicodeString(UNICODESTRING,pWDB); InitializeObjectAttributes(obj, @UNICODESTRING, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil); Rslt := ZwDeleteFile(@obj); if Rslt = STATUS_SUCCESS then begin DbgPrint('File deleted sucessfully - Result:0x%.8X', Rslt); end else begin DbgPrint('Fail to delete file - Result:0x%.8X', Rslt); DbgPrint('Object name :%wZ', obj.ObjectName); end; End; function WriteDispatch(DeviceObject: PDEVICE_OBJECT;Irp: PIRP):NTSTATUS;stdcall; var pIoStackIrp :PIO_STACK_LOCATION ; pWriteDataBuffer: PAnsiChar ; begin DbgPrint('DirectIO: WriteDispatch'#13#10); pWriteDataBuffer := nil; pIoStackIrp := IoGetCurrentIrpStackLocation(Irp); if pIoStackIrp <> nil then begin if Irp^.MdlAddress <> nil then pWriteDataBuffer:= MmGetSystemAddressForMdlSafe(Irp^.MdlAddress, NormalPagePriority) else pWriteDataBuffer := Irp^.UserBuffer; if pWriteDataBuffer <> nil then if Example_IsStringTerminated(pWriteDataBuffer, pIoStackIrp^.Parameters.Write.Length) then Begin DbgPrint('File Req To Deleted ? : %s'#13#10, pWriteDataBuffer); DeleteFileReq (PwideChar('\??\' + pWriteDataBuffer)); End; end; Irp^.IoStatus.Status:= STATUS_SUCCESS; Irp^.IoStatus.Information:= 0; IoCompleteRequest(IRP,IO_NO_INCREMENT); Result:=STATUS_SUCCESS; end;
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall; var pDeviceObject: TDeviceObject; begin DbgPrint('Driver :: Loaded'#13#10); RtlInitUnicodeString(DeviceName, '\Device\ZwDeleteFileFromRing3'); RtlInitUnicodeString(SymbolicLinkName, '\??\DirectIO'); Result:=IoCreateDevice(DriverObject, 0, @DeviceName, FILE_DEVICE_UNKNOWN,0, False, pDeviceObject); if Result = STATUS_SUCCESS then begin if (IoCreateSymbolicLink(@SymbolicLinkName, @DeviceName) = STATUS_SUCCESS) then begin DriverObject^.MajorFunction[IRP_MJ_CREATE] := @CreateCloseDispatch; DriverObject^.MajorFunction[IRP_MJ_CLOSE] := @CreateCloseDispatch; DriverObject^.MajorFunction[IRP_MJ_WRITE] := @WriteDispatch; DriverObject^.DriverUnload := @DriverUnload; end else begin DbgPrint('IoCreateSymbolicLink fail!'#13#10); IoDeleteDevice(@pDeviceObject); end; end else DbgPrint('IoCreateDevice Fail!'#13#10); result := STATUS_SUCCESS;
end;
end.
هنا أقع في Bsod لمادا لأني لم أعرف كيف أظيف '\??\' للمسار الممر من الـ UserMode
هل من طريقة لدمج '\??\' مع المسار آليا .
Kernel mode - برمجة Driver Filter - TF6M - 22-02-2010
STRELITZIA تم حل المشكلة , ببساطة جربته في Real M
عادي لكن عند تحميله في الـ Virtual Machine أتحصل على Bsod .
Kernel mode - برمجة Driver Filter - STRELiTZIA - 22-02-2010
إقتباس :RtlInitUnicodeString(DeviceName, 'DeviceZwDeleteFileFromRing3');
RtlInitUnicodeString(SymbolicLinkName, '??DirectIO');
اخي TF6M في المشاركة رقم 25 هل تاكدت من كتابة الأوامر ام هي مشكلة في النسخ و اللصق في المشاركة ؟
كاتبة المسارات خاطئة...
إقتباس :DbgPrint('IoCreateDevice Fail!#13#10);
هنا ايضا تنقصك نقطة لتحديد النص...
إقتباس :STRELITZIA تم حل المشكلة , ببساطة جربته في Real M
عادي لكن عند تحميله في الـ Virtual Machine أتحصل على Bsod .
على الــ VMWare لا مشكل..
اذا كنت تستعمل Virtual PC فالقي به في سله المحذوفات...
Kernel mode - برمجة Driver Filter - TF6M - 22-02-2010
1- لا قمت بكتابتها .. المشكل كما قلت لك لم أعرف كيف أظيف '\??\' للمسار الممر من الـ UserMode
فهو دريفر بسيط يقوم بحدف الملف الدي نحدده من الـ Kernel ؟؟ .
2- أنا أستعمل VMWare لم أنجح في تحميل الدريفر فيه نفس الدريفرالدي قمت أنت بإرفاقه.
Kernel mode - برمجة Driver Filter - STRELiTZIA - 22-02-2010
إقتباس : لا قمت بكتابتها
انا لا اقصد انك الم تكتبها انت، الذي اقصده هو حين تضع كود -نسخ و لصق- في المشاركة بصيغة php تحذف بعض الرموز... مثل هنا:
كود : RtlInitUnicodeString(DeviceName, 'DeviceZwDeleteFileFromRing3');
RtlInitUnicodeString(SymbolicLinkName, '??DirectIO');
RtlInitUnicodeString(DeviceName, 'Device[color=red]\[/color]ZwDeleteFileFromRing3');
RtlInitUnicodeString(SymbolicLinkName, '[color=Red]\[/color]??[color=red]\[/color]DirectIO');
ارفق نسخة من المشروع مع ملفات الدوال التي تستدعيها لنستطيع التجربة...
Kernel mode - برمجة Driver Filter - STRELiTZIA - 22-02-2010
إقتباس :اظن ان المشكل سببه الــ Kit التي تستعمل في انتاج الدرايفر !
حمل آخر اصدار للــ Kit من الموقع الرسمي ثم حاول من جديد، انتبه فقط لمسارات MakeFile التي يجب ان توجهك الى الــ Kit الجديدة و ليس مسار الــ Kit التي عندك...
هذا الحل الذي اقترحته عليك في المشاركة السابقة...
إقتباس :تم حل المشكلة , ببساطة جربته في Real M
عادي لكن عند تحميله في الـ Virtual Machine أتحصل على Bsod .
و هذا هو ردك هنا...
إقتباس :mickeylan Thank you for your interest !
i fixed the problem , it just"Kmdkit" UpDate , Because I used old Version !
و هذا ردك لنفس السؤال الذي طرحته في منتدى صاحب الــ Kit.
ايهما الصحيح ؟؟؟؟؟
|