текущая версия 0.0.4, прямая ссылка http://hxdef.net.ru/download/DDDK004.zip а это ссылка на рабочий пример http://hxdef.net.ru/download/hookX.zip
slow, мдя, я уш было начал радоваться, а тут... я думаю, если любой из вас возьмется с нуля что-то делать, то будет этого весомей чем то, что я там увидел. Портированные исходники пока показать не могу, потому как без ДДК, толку они вам не дадут, но может быть в скором будущем это случиться.
CARDINAL, тут речь не о размере письки шла, тем более что у Си-ков она без базара длиней , просто есть люди которым надо само-утверждаться, я из этой породы, ну и азарт был.
_CC, ты прав, если честно все равно без знаний базовых основ Си, ни о каком ДДК для дельфи\паскаль речи и быть не может, по любому знать надо. Другое дело, что производитель(borland) по какой то причине, не пытается занять эту нишу, причем практически все для этого есть, кроме полноценного линкера, да и желающих дельфийцев будет тьма тьмущая, но ... они молчать, а зря.
LuckyDevil на сайте же написано, что это всего лишь proof-of-concept хотя может через годик... и к тому же, как я понимаю, людям просто не до этого, и так работы хватает ) наверное было бы прикольно писать дрова ринг-0 на паскале, но хз лучше это чем на си или масме али нет. з.ы. сорри за флейм
slow? а что прикольного? если ты хоть раз портировал из Си в дельфи, то должен понимать что по коду, дельфи ничем не уступает Си, т.е. структура первоисточника отсается такой же без каких либо дополнительных наворотов, вот пример: на Си Код (Text): BOOLEAN HookDrive( IN ULONG Drive, IN PDRIVER_OBJECT DriverObject ) { IO_STATUS_BLOCK ioStatus; HANDLE ntFileHandle; OBJECT_ATTRIBUTES objectAttributes; PDEVICE_OBJECT fileSysDevice; PDEVICE_OBJECT hookDevice; UNICODE_STRING fileNameUnicodeString; PFILE_FS_ATTRIBUTE_INFORMATION fileFsAttributes; ULONG fileFsAttributesSize; WCHAR filename[] = L"\\DosDevices\\A:\\"; NTSTATUS ntStatus; ULONG i; PFILE_OBJECT fileObject; PHOOK_EXTENSION hookExtension; // // Is it a legal drive letter? // if( Drive >= 26 ) { return FALSE; } // // Has this drive already been hooked? // if( DriveHookDevices[Drive] == NULL ) { // // Frob the name to make it refer to the drive specified in the input // parameter. // filename[12] = (CHAR) ('A'+Drive); // // We have to figure out what device to hook - first open the volume's // root directory // RtlInitUnicodeString( &fileNameUnicodeString, filename ); InitializeObjectAttributes( &objectAttributes, &fileNameUnicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntStatus = ZwCreateFile( &ntFileHandle, SYNCHRONIZE|FILE_ANY_ACCESS, &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, NULL, 0 ); if( !NT_SUCCESS( ntStatus ) ) { DbgPrint(("Filemon: Could not open drive %c: %x\n", 'A'+Drive, ntStatus )); return FALSE; } DbgPrint(("Filemon: opened the root directory!!! handle: %x\n", ntFileHandle)); // // Got the file handle, so now look-up the file-object it refers to // ntStatus = ObReferenceObjectByHandle( ntFileHandle, FILE_READ_DATA, NULL, KernelMode, &fileObject, NULL ); if( !NT_SUCCESS( ntStatus )) { DbgPrint(("Filemon: Could not get fileobject from handle: %c\n", 'A'+Drive )); ZwClose( ntFileHandle ); return FALSE; } // // Next, find out what device is associated with the file object by getting its related // device object // fileSysDevice = IoGetRelatedDeviceObject( fileObject ); if( ! fileSysDevice ) { DbgPrint(("Filemon: Could not get related device object: %c\n", 'A'+Drive )); ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return FALSE; } // // Check the device list to see if we've already attached to this particular device. // This can happen when more than one drive letter is being handled by the same network // redirecter // for( i = 0; i < 26; i++ ) { if( DriveHookDevices[i] == fileSysDevice ) { // // If we're already watching it, associate this drive letter // with the others that are handled by the same network driver. This // enables us to intelligently update the hooking menus when the user // specifies that one of the group should not be watched -we mark all // of the related drives as unwatched as well // ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); DriveHookDevices[ Drive ] = fileSysDevice; return TRUE; } } // // The file system's device hasn't been hooked already, so make a hooking device // object that will be attached to it. // ntStatus = IoCreateDevice( DriverObject, sizeof(HOOK_EXTENSION), NULL, fileSysDevice->DeviceType, 0, FALSE, &hookDevice ); if( !NT_SUCCESS(ntStatus) ) { DbgPrint(("Filemon: failed to create associated device: %c\n", 'A'+Drive )); ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return FALSE; } // // Clear the device's init flag as per NT DDK KB article on creating device // objects from a dispatch routine // hookDevice->Flags &= ~DO_DEVICE_INITIALIZING; // // Setup the device extensions. The drive letter and file system object are stored // in the extension. // hookExtension = hookDevice->DeviceExtension; hookExtension->LogicalDrive = 'A'+Drive; hookExtension->FileSystem = fileSysDevice; hookExtension->Hooked = TRUE; hookExtension->Type = STANDARD; // // Finally, attach to the device. The second we're successfully attached, we may // start receiving IRPs targetted at the device we've hooked. // ntStatus = IoAttachDeviceByPointer( hookDevice, fileSysDevice ); if( !NT_SUCCESS(ntStatus) ) { // // Couldn' attach for some reason // DbgPrint(("Filemon: Connect with Filesystem failed: %c (%x) =>%x\n", 'A'+Drive, fileSysDevice, ntStatus )); // // Derefence the object and get out // ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return FALSE; } else { // // Make a new drive group for the device,l if it does not have one // already // DbgPrint(("Filemon: Successfully connected to Filesystem device %c\n", 'A'+Drive )); } // // Determine if this is a NTFS drive // fileFsAttributesSize = sizeof( FILE_FS_ATTRIBUTE_INFORMATION) + MAXPATHLEN; hookExtension->FsAttributes = (PFILE_FS_ATTRIBUTE_INFORMATION) ExAllocatePool( NonPagedPool, fileFsAttributesSize ); if( hookExtension->FsAttributes && !NT_SUCCESS( IoQueryVolumeInformation( fileObject, FileFsAttributeInformation, fileFsAttributesSize, hookExtension->FsAttributes, &fileFsAttributesSize ))) { // // On failure, we just don't have attributes for this file system // ExFreePool( hookExtension->FsAttributes ); hookExtension->FsAttributes = NULL; } // // Close the file and update the hooked drive list by entering a // pointer to the hook device object in it. // ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); DriveHookDevices[Drive] = hookDevice; } else { hookExtension = DriveHookDevices[Drive]->DeviceExtension; hookExtension->Hooked = TRUE; } return TRUE; }
и на дельфи Код (Text): function HookDrive( Drive: ULONG; DriverObject: PDRIVER_OBJECT ): BOOLEAN; var ioStatus: IO_STATUS_BLOCK; ntFileHandle: HANDLE; objectAttributes: OBJECT_ATTRIBUTES; fileSysDevice: PDEVICE_OBJECT; hookDevice: PDEVICE_OBJECT; fileNameUnicodeString: UNICODE_STRING; fileFsAttributes: PFILE_FS_ATTRIBUTE_INFORMATION; fileFsAttributesSize: ULONG; filename:array[0..32] of char;//[] = L"\\DosDevices\\A:\\"; Status: NTSTATUS; i: ULONG; fileObject: PFILE_OBJECT; hookExtension: PHOOK_EXTENSION; begin filename := '\DosDevices\A:\'#0; // // Is it a legal drive letter? // if( Drive >= 26 ) then begin Result := FALSE; exit; end; // // Has this drive already been hooked? // if( DriveHookDevices[Drive] = NiL ) then begin // // Frob the name to make it refer to the drive specified in the input // parameter. // filename[12] := CHR (Ord('A')+Drive); // // We have to figure out what device to hook - first open the volume's // root directory // RtlInitUnicodeString( @fileNameUnicodeString, '\DosDevices\C:\'#0 ); DbgPrint('fileNameUnicodeString: %wZ',@fileNameUnicodeString); InitializeObjectAttributes( @objectAttributes, @fileNameUnicodeString, OBJ_CASE_INSENSITIVE, NiL, NiL ); Status := ZwCreateFile( @ntFileHandle, SYNCHRONIZE or FILE_ANY_ACCESS, @objectAttributes, @ioStatus, NiL, 0, FILE_SHARE_READ or FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT or FILE_DIRECTORY_FILE, 0, 0 ); if( not NT_SUCCESS( Status ) ) then begin DbgPrint('Filemon: Could not open drive %c: %x', Ord('A')+Drive, Status ); Result := FALSE; end; DbgPrint('Filemon: opened the root directory!!! handle: %x\n', ntFileHandle); // // Got the file handle, so now look-up the file-object it refers to // Status := ObReferenceObjectByHandle( ntFileHandle, FILE_READ_DATA, NiL, KPROCESSOR_MODE(KernelMode), @fileObject, NiL ); if( not NT_SUCCESS( Status )) then begin DbgPrint('Filemon: Could not get fileobject from handle: %c', ord('A')+Drive ); ZwClose( ntFileHandle ); Result := FALSE; exit; end; // // Next, find out what device is associated with the file object by getting its related // device object // fileSysDevice := IoGetRelatedDeviceObject( fileObject ); if( fileSysDevice = nil ) then begin DbgPrint('Filemon: Could not get related device object: %c', ord('A')+Drive ); ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); Result := FALSE; exit; end; // // Check the device list to see if we've already attached to this particular device. // This can happen when more than one drive letter is being handled by the same network // redirecter // for i := 0 to 26-1 do begin if( DriveHookDevices[i] = fileSysDevice ) then begin // // If we're already watching it, associate this drive letter // with the others that are handled by the same network driver. This // enables us to intelligently update the hooking menus when the user // specifies that one of the group should not be watched -we mark all // of the related drives as unwatched as well // ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); DriveHookDevices[ Drive ] := fileSysDevice; Result := TRUE; exit; end; end; // // The file system's device hasn't been hooked already, so make a hooking device // object that will be attached to it. // Status := IoCreateDevice( DriverObject, sizeof(HOOK_EXTENSION), NiL, fileSysDevice^.DeviceType, 0, FALSE, @hookDevice ); if( not NT_SUCCESS(Status) ) then begin DbgPrint('Filemon: failed to create associated device: %c', ord('A')+Drive ); ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); Result := FALSE; exit; end; // // Clear the device's init flag as per NT DDK KB article on creating device // objects from a dispatch routine // hookDevice^.Flags := hookDevice^.Flags and (not DO_DEVICE_INITIALIZING); DbgPrint('hookDevice->Flags: %d',hookDevice^.Flags); // // Setup the device extensions. The drive letter and file system object are stored // in the extension. // hookExtension := hookDevice^.DeviceExtension; hookExtension^.LogicalDrive := ord('A')+Drive; hookExtension^.FileSystem := fileSysDevice; hookExtension^.Hooked := TRUE; hookExtension^.Type_ := STANDARD; hookExtension^.CurrentMaskIrp := nil; DbgPrint('hookExtension^.FileSystem : %p',hookExtension^.FileSystem); // // Finally, attach to the device. The second we're successfully attached, we may // start receiving IRPs targetted at the device we've hooked. // Status := IoAttachDeviceByPointer( hookDevice, fileSysDevice ); if( not NT_SUCCESS(Status) ) then begin // // Couldn' attach for some reason // DbgPrint('Filemon: Connect with Filesystem failed: %c (%x) =>%x', ord('A')+Drive, fileSysDevice, Status ); // // Derefence the object and get out // ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); Result := FALSE; exit; end else // // Make a new drive group for the device,l if it does not have one // already // DbgPrint('Filemon: Successfully connected to Filesystem device %c', ord('A')+Drive ); // // Determine if this is a NTFS drive // fileFsAttributesSize := sizeof( FILE_FS_ATTRIBUTE_INFORMATION) + MAXPATHLEN; DbgPrint('fileFsAttributesSize: %d',fileFsAttributesSize); hookExtension^.FsAttributes := PFILE_FS_ATTRIBUTE_INFORMATION( ExAllocatePool( NonPagedPool, fileFsAttributesSize )); if boolean( hookExtension^.FsAttributes) and (not NT_SUCCESS( IoQueryVolumeInformation( fileObject, FileFsAttributeInformation, fileFsAttributesSize, hookExtension^.FsAttributes, @fileFsAttributesSize ) ) ) then begin // // On failure, we just don't have attributes for this file system // ExFreePool( hookExtension^.FsAttributes ); hookExtension^.FsAttributes := NiL; DbgPrint('On failure, we just don''t have attributes for this file system'); end; DbgPrint('hookExtension->FsAttributes: %d',hookExtension^.FsAttributes); // // Close the file and update the hooked drive list by entering a // pointer to the hook device object in it. // ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); DriveHookDevices[Drive] := hookDevice; end else begin hookExtension := DriveHookDevices[Drive]^.DeviceExtension; hookExtension^.Hooked := TRUE; end; result := TRUE; end; Извините за флэйм и я ни в коем случае не призываю всех писать на паскале, просто если уж говорить, а тем более ругать, то хотя бы надо знать суть темы. Еще раз извиняюсь, если кого-то обидел.
LuckyDevil я ни в коем случае не ругаю Delphi. Вообще на мой личный взгляд Паскаль мало чем уступает Си, но гораздо доступнее в понимании простому неказистому программисту типа меня. Слово "прикольно" в данном контексте означает "интересно" и ни в коем случае не является ругательством. з.ы. интересный код ) з.з.ы. а я на паскале написал брут к одной очччень известной системе удаленного администрирования ))
На самом деле лучший их продукт: Borland Paradox. И драверов на нем еще никто и никогда не писал. )) Чтобы не было оффтопиком: а можно ли писать драйвера на каких-нибудь экзотических языках, типа Modula-2, Oberon, Basic, Cobol, Fortran, etc?