delphi4arab منتديات دلفي للعرب

نسخة كاملة : Kernel mode - برمجة Driver Filter
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2 3 4
إقتباس :اذا لدينا ciono1 جدي

هل تعرف ماذا تعني :d
يالمناسبة هل من اخبار عنه ؟
لم أسمع منه منذ مدة كبيرة ، أكيد مطحون في الدنيا ...
السلام عليكم

واجهت مشكلة أثناء تحميل 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:؟؟.
و عليكم السلام و رحمة الله

إقتباس :السؤال هنا أن صاحب الموضوع و المشاركين نجحو في تشغيله دون bsod
اخذت السورس الذي و ضعته اخي TF6M و انتج عندي درايفر يعمل بدون مشاكل. تمت التجربة على Xp SP2 و SP3.

العمليات:
- انتاج الدرايفر - ناجحة.
- تسجيل، تحميل، الغاء التحميل و الغاء التسجيل - ناجحة.
- Hook لدالة ZwCreateFile - ناجحة

[صورة: 87208626.jpg]

[صورة: 80603985.jpg]

[صورة: 60224788.jpg]


إقتباس :على عكسي
اظن ان المشكل سببه الــ Kit التي تستعمل في انتاج الدرايفر !
حمل آخر اصدار للــ Kit من الموقع الرسمي ثم حاول من جديد، انتبه فقط لمسارات MakeFile التي يجب ان توجهك الى الــ Kit الجديدة و ليس مسار الــ Kit التي عندك...

كيفية التعامل مع المرفق:
المرفق يحتوي على : ملف مصدري -الذي وضعته في مشاركتك-، الدرايفر المنتج عندي و ملف Object هذا الأخير له دور آخر...

1- حاول تسجيل و تحميل الدرايفر المرفق.
2- ضع ملف Object بجانب الملف المصدري و قم بعمل درايفر جديد في جهازك، عملية الانتاج ستأخذ ملف Object المرفق لبناء الدرايفر دون استعمال الذي في جهازك.

جرب هذه العمليات قبل ان تستعمل الــ Kit الموجودة في الموقع الرسمي، و اخبرني...


إقتباس :الداكرة المخصصة لـ SSDT داكرة للقراءة فقط , و نحن نريد التغير في مسار الإستدعاء ؟؟
بخصوص هذا التعجب سنجيب عليه ان شاء الله في آخر مراحل اكتمال المشروع، الآن يجب ان ننتهي من معالجة الأخطاء الأولية الخاصة بكتابة الأوامر و غيرها...
بارك الله فيك أستاد

سأجرب و أظع النتيجة !! .

سؤال تاني خارج عن الموضوع لكن أحتاجه :

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
هل من طريقة لدمج '\??\' مع المسار آليا .
STRELITZIA تم حل المشكلة , ببساطة جربته في Real M
عادي لكن عند تحميله في الـ Virtual Machine أتحصل على Bsod .
إقتباس :RtlInitUnicodeString(DeviceName, 'DeviceZwDeleteFileFromRing3');
RtlInitUnicodeString(SymbolicLinkName, '??DirectIO');
اخي TF6M في المشاركة رقم 25 هل تاكدت من كتابة الأوامر ام هي مشكلة في النسخ و اللصق في المشاركة ؟
كاتبة المسارات خاطئة...

إقتباس :DbgPrint('IoCreateDevice Fail!#13#10);
هنا ايضا تنقصك نقطة لتحديد النص...

إقتباس :STRELITZIA تم حل المشكلة , ببساطة جربته في Real M
عادي لكن عند تحميله في الـ Virtual Machine أتحصل على Bsod .
على الــ VMWare لا مشكل..
اذا كنت تستعمل Virtual PC فالقي به في سله المحذوفات...
1- لا قمت بكتابتها .. المشكل كما قلت لك لم أعرف كيف أظيف '\??\' للمسار الممر من الـ UserMode
فهو دريفر بسيط يقوم بحدف الملف الدي نحدده من الـ Kernel ؟؟ .
2- أنا أستعمل
VMWare لم أنجح في تحميل الدريفر فيه نفس الدريفرالدي قمت أنت بإرفاقه.
إقتباس : لا قمت بكتابتها
انا لا اقصد انك الم تكتبها انت، الذي اقصده هو حين تضع كود -نسخ و لصق- في المشاركة بصيغة php تحذف بعض الرموز... مثل هنا:

كود :
RtlInitUnicodeString(DeviceName, 'DeviceZwDeleteFileFromRing3'); RtlInitUnicodeString(SymbolicLinkName, '??DirectIO'); RtlInitUnicodeString(DeviceName, 'Device[color=red]\[/color]ZwDeleteFileFromRing3'); RtlInitUnicodeString(SymbolicLinkName, '[color=Red]\[/color]??[color=red]\[/color]DirectIO');

ارفق نسخة من المشروع مع ملفات الدوال التي تستدعيها لنستطيع التجربة...
إقتباس :اظن ان المشكل سببه الــ 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.

ايهما الصحيح ؟؟؟؟؟
الصفحات : 1 2 3 4