Драйвер на pascal'е

Тема в разделе "WASM.WIN32", создана пользователем ZAZ, 3 дек 2005.

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    для Дельфи есть порт DDK, называется DDDK, можно взыть на hxdef.net.ru
     
  2. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
  3. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    slow, мдя, я уш было начал радоваться, а тут...

    я думаю, если любой из вас возьмется с нуля что-то делать, то будет этого весомей чем то, что я там увидел.

    Портированные исходники пока показать не могу, потому как без ДДК, толку они вам не дадут, но может быть в скором будущем это случиться.
     
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    CARDINAL, тут речь не о размере письки шла, тем более что у Си-ков она без базара длиней :), просто есть люди которым надо само-утверждаться, я из этой породы, ну и азарт был.
     
  5. _CC

    _CC New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    52
    2ZAZ:

    >> лень Cpp учить

    А DDK для Паскаля тебе не лень писать?.. ;))
     
  6. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    _CC, ты прав, если честно все равно без знаний базовых основ Си, ни о каком ДДК для дельфи\паскаль речи и быть не может, по любому знать надо.

    Другое дело, что производитель(borland) по какой то причине, не пытается занять эту нишу, причем практически все для этого есть, кроме полноценного линкера, да и желающих дельфийцев будет тьма тьмущая, но ... они молчать, а зря.
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    LuckyDevil

    на сайте же написано, что это всего лишь proof-of-concept

    хотя может через годик... и к тому же, как я понимаю, людям просто не до этого, и так работы хватает :))



    наверное было бы прикольно писать дрова ринг-0 на паскале, но хз лучше это чем на си или масме али нет.

    з.ы. сорри за флейм
     
  8. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    slow? а что прикольного?

    если ты хоть раз портировал из Си в дельфи, то должен понимать что по коду, дельфи ничем не уступает Си, т.е. структура первоисточника отсается такой же без каких либо дополнительных наворотов, вот пример:

    на Си
    Код (Text):
    1.  
    2. BOOLEAN
    3. HookDrive(
    4.     IN ULONG Drive,
    5.     IN PDRIVER_OBJECT DriverObject
    6.     )
    7. {
    8.     IO_STATUS_BLOCK     ioStatus;
    9.     HANDLE              ntFileHandle;  
    10.     OBJECT_ATTRIBUTES   objectAttributes;
    11.     PDEVICE_OBJECT      fileSysDevice;
    12.     PDEVICE_OBJECT      hookDevice;
    13.     UNICODE_STRING      fileNameUnicodeString;
    14.     PFILE_FS_ATTRIBUTE_INFORMATION fileFsAttributes;
    15.     ULONG               fileFsAttributesSize;
    16.     WCHAR               filename[] = L"\\DosDevices\\A:\\";
    17.     NTSTATUS            ntStatus;
    18.     ULONG               i;
    19.     PFILE_OBJECT        fileObject;
    20.     PHOOK_EXTENSION     hookExtension;
    21.    
    22.     //
    23.     // Is it a legal drive letter?
    24.     //
    25.     if( Drive >= 26 )  {
    26.  
    27.         return FALSE;
    28.     }
    29.  
    30.     //
    31.     // Has this drive already been hooked?
    32.     //
    33.     if( DriveHookDevices[Drive] == NULL )  {
    34.  
    35.         //
    36.         // Frob the name to make it refer to the drive specified in the input
    37.         // parameter.
    38.         //
    39.         filename[12] = (CHAR) ('A'+Drive);
    40.  
    41.         //
    42.         // We have to figure out what device to hook - first open the volume's
    43.         // root directory
    44.         //
    45.         RtlInitUnicodeString( &fileNameUnicodeString, filename );
    46.         InitializeObjectAttributes( &objectAttributes, &fileNameUnicodeString,
    47.                                     OBJ_CASE_INSENSITIVE, NULL, NULL );
    48.         ntStatus = ZwCreateFile( &ntFileHandle, SYNCHRONIZE|FILE_ANY_ACCESS,
    49.                                  &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE,
    50.                                  FILE_OPEN,
    51.                                  FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE,
    52.                                  NULL, 0 );
    53.         if( !NT_SUCCESS( ntStatus ) ) {
    54.  
    55.             DbgPrint(("Filemon: Could not open drive %c: %x\n", 'A'+Drive, ntStatus ));
    56.             return FALSE;
    57.         }
    58.  
    59.         DbgPrint(("Filemon:  opened the root directory!!! handle: %x\n", ntFileHandle));  
    60.  
    61.         //
    62.         // Got the file handle, so now look-up the file-object it refers to
    63.         //
    64.         ntStatus = ObReferenceObjectByHandle( ntFileHandle, FILE_READ_DATA,
    65.                                               NULL, KernelMode, &fileObject, NULL );
    66.         if( !NT_SUCCESS( ntStatus )) {
    67.  
    68.             DbgPrint(("Filemon: Could not get fileobject from handle: %c\n", 'A'+Drive ));
    69.             ZwClose( ntFileHandle );
    70.             return FALSE;
    71.         }
    72.  
    73.         //  
    74.         // Next, find out what device is associated with the file object by getting its related
    75.         // device object
    76.         //
    77.         fileSysDevice = IoGetRelatedDeviceObject( fileObject );
    78.  
    79.         if( ! fileSysDevice ) {
    80.  
    81.             DbgPrint(("Filemon: Could not get related device object: %c\n", 'A'+Drive ));
    82.             ObDereferenceObject( fileObject );
    83.             ZwClose( ntFileHandle );
    84.             return FALSE;
    85.         }
    86.  
    87.         //  
    88.         // Check the device list to see if we've already attached to this particular device.
    89.         // This can happen when more than one drive letter is being handled by the same network
    90.         // redirecter
    91.         //  
    92.         for( i = 0; i < 26; i++ ) {
    93.  
    94.             if( DriveHookDevices[i] == fileSysDevice ) {
    95.  
    96.                 //
    97.                 // If we're already watching it, associate this drive letter
    98.                 // with the others that are handled by the same network driver. This
    99.                 // enables us to intelligently update the hooking menus when the user
    100.                 // specifies that one of the group should not be watched -we mark all
    101.                 // of the related drives as unwatched as well
    102.                 //
    103.                 ObDereferenceObject( fileObject );
    104.                 ZwClose( ntFileHandle );
    105.                 DriveHookDevices[ Drive ] = fileSysDevice;
    106.                 return TRUE;
    107.             }
    108.         }
    109.  
    110.         //
    111.         // The file system's device hasn't been hooked already, so make a hooking device
    112.         //  object that will be attached to it.
    113.         //
    114.         ntStatus = IoCreateDevice( DriverObject,
    115.                                    sizeof(HOOK_EXTENSION),
    116.                                    NULL,
    117.                                    fileSysDevice->DeviceType,
    118.                                    0,
    119.                                    FALSE,
    120.                                    &hookDevice );
    121.         if( !NT_SUCCESS(ntStatus) ) {
    122.  
    123.             DbgPrint(("Filemon: failed to create associated device: %c\n", 'A'+Drive ));  
    124.  
    125.             ObDereferenceObject( fileObject );
    126.             ZwClose( ntFileHandle );
    127.  
    128.             return FALSE;
    129.         }
    130.  
    131.         //
    132.         // Clear the device's init flag as per NT DDK KB article on creating device
    133.         // objects from a dispatch routine
    134.         //
    135.         hookDevice->Flags &= ~DO_DEVICE_INITIALIZING;
    136.  
    137.         //
    138.         // Setup the device extensions. The drive letter and file system object are stored
    139.         // in the extension.
    140.         //
    141.         hookExtension = hookDevice->DeviceExtension;
    142.         hookExtension->LogicalDrive = 'A'+Drive;
    143.         hookExtension->FileSystem   = fileSysDevice;
    144.         hookExtension->Hooked       = TRUE;
    145.         hookExtension->Type         = STANDARD;
    146.  
    147.         //
    148.         // Finally, attach to the device. The second we're successfully attached, we may
    149.         // start receiving IRPs targetted at the device we've hooked.
    150.         //
    151.         ntStatus = IoAttachDeviceByPointer( hookDevice, fileSysDevice );
    152.         if( !NT_SUCCESS(ntStatus) )  {
    153.  
    154.             //
    155.             // Couldn' attach for some reason
    156.             //
    157.             DbgPrint(("Filemon: Connect with Filesystem failed: %c (%x) =>%x\n",
    158.                       'A'+Drive, fileSysDevice, ntStatus ));
    159.  
    160.             //
    161.             // Derefence the object and get out
    162.             //
    163.             ObDereferenceObject( fileObject );
    164.             ZwClose( ntFileHandle );
    165.  
    166.             return FALSE;
    167.  
    168.         } else {
    169.  
    170.             //
    171.             // Make a new drive group for the device,l if it does not have one
    172.             // already
    173.             //
    174.             DbgPrint(("Filemon: Successfully connected to Filesystem device %c\n", 'A'+Drive ));
    175.         }
    176.  
    177.         //
    178.         // Determine if this is a NTFS drive
    179.         //
    180.         fileFsAttributesSize = sizeof( FILE_FS_ATTRIBUTE_INFORMATION) + MAXPATHLEN;
    181.         hookExtension->FsAttributes = (PFILE_FS_ATTRIBUTE_INFORMATION) ExAllocatePool( NonPagedPool,
    182.                                                                                        fileFsAttributesSize );
    183.         if( hookExtension->FsAttributes &&
    184.             !NT_SUCCESS( IoQueryVolumeInformation( fileObject, FileFsAttributeInformation,
    185.                                                    fileFsAttributesSize, hookExtension->FsAttributes,
    186.                                                    &fileFsAttributesSize ))) {
    187.  
    188.             //
    189.             // On failure, we just don't have attributes for this file system
    190.             //
    191.             ExFreePool( hookExtension->FsAttributes );
    192.             hookExtension->FsAttributes = NULL;
    193.         }
    194.  
    195.         //
    196.         // Close the file and update the hooked drive list by entering a
    197.         // pointer to the hook device object in it.
    198.         //
    199.         ObDereferenceObject( fileObject );
    200.  
    201.         ZwClose( ntFileHandle );
    202.  
    203.         DriveHookDevices[Drive] = hookDevice;
    204.        
    205.     } else {
    206.  
    207.         hookExtension = DriveHookDevices[Drive]->DeviceExtension;
    208.         hookExtension->Hooked = TRUE;
    209.     }
    210.     return TRUE;
    211. }
    212.  
     
  9. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    и на дельфи
    Код (Text):
    1.  
    2. function
    3. HookDrive(
    4.     Drive: ULONG;
    5.     DriverObject: PDRIVER_OBJECT
    6.     ): BOOLEAN;
    7. var
    8.     ioStatus: IO_STATUS_BLOCK;
    9.     ntFileHandle: HANDLE;
    10.     objectAttributes: OBJECT_ATTRIBUTES;
    11.     fileSysDevice: PDEVICE_OBJECT;
    12.     hookDevice: PDEVICE_OBJECT;
    13.     fileNameUnicodeString: UNICODE_STRING;
    14.     fileFsAttributes: PFILE_FS_ATTRIBUTE_INFORMATION;
    15.     fileFsAttributesSize: ULONG;
    16.     filename:array[0..32] of char;//[] = L"\\DosDevices\\A:\\";
    17.     Status: NTSTATUS;
    18.     i: ULONG;
    19.     fileObject: PFILE_OBJECT;
    20.     hookExtension: PHOOK_EXTENSION;
    21. begin
    22.      filename := '\DosDevices\A:\'#0;
    23.     //
    24.     // Is it a legal drive letter?
    25.     //
    26.     if( Drive >= 26 )  then
    27.     begin
    28.         Result := FALSE;
    29.         exit;
    30.     end;
    31.  
    32.     //
    33.     // Has this drive already been hooked?
    34.     //
    35.     if( DriveHookDevices[Drive] = NiL )  then
    36.     begin
    37.         //
    38.         // Frob the name to make it refer to the drive specified in the input
    39.         // parameter.
    40.         //
    41.         filename[12] := CHR (Ord('A')+Drive);
    42.  
    43.         //
    44.         // We have to figure out what device to hook - first open the volume's
    45.         // root directory
    46.         //
    47.         RtlInitUnicodeString( @fileNameUnicodeString, '\DosDevices\C:\'#0 );
    48.         DbgPrint('fileNameUnicodeString: %wZ',@fileNameUnicodeString);
    49.         InitializeObjectAttributes( @objectAttributes, @fileNameUnicodeString,
    50.                                     OBJ_CASE_INSENSITIVE, NiL, NiL );
    51.         Status := ZwCreateFile( @ntFileHandle, SYNCHRONIZE or FILE_ANY_ACCESS,
    52.                                  @objectAttributes, @ioStatus, NiL, 0, FILE_SHARE_READ or FILE_SHARE_WRITE,
    53.                                  FILE_OPEN,
    54.                                  FILE_SYNCHRONOUS_IO_NONALERT or FILE_DIRECTORY_FILE,
    55.                                  0, 0 );
    56.         if( not NT_SUCCESS( Status ) ) then
    57.         begin
    58.             DbgPrint('Filemon: Could not open drive %c: %x', Ord('A')+Drive, Status );
    59.             Result := FALSE;
    60.         end;
    61.  
    62.         DbgPrint('Filemon:  opened the root directory!!! handle: %x\n', ntFileHandle);
    63.  
    64.         //
    65.         // Got the file handle, so now look-up the file-object it refers to
    66.         //
    67.         Status := ObReferenceObjectByHandle( ntFileHandle, FILE_READ_DATA,
    68.                                               NiL, KPROCESSOR_MODE(KernelMode), @fileObject, NiL );
    69.         if( not NT_SUCCESS( Status )) then
    70.         begin
    71.             DbgPrint('Filemon: Could not get fileobject from handle: %c', ord('A')+Drive );
    72.             ZwClose( ntFileHandle );
    73.             Result := FALSE;
    74.             exit;
    75.         end;
    76.  
    77.         //
    78.         // Next, find out what device is associated with the file object by getting its related
    79.         // device object
    80.         //
    81.         fileSysDevice := IoGetRelatedDeviceObject( fileObject );
    82.  
    83.         if( fileSysDevice = nil ) then
    84.         begin
    85.             DbgPrint('Filemon: Could not get related device object: %c', ord('A')+Drive );
    86.             ObDereferenceObject( fileObject );
    87.             ZwClose( ntFileHandle );
    88.             Result := FALSE;
    89.             exit;
    90.         end;
    91.  
    92.         //
    93.         // Check the device list to see if we've already attached to this particular device.
    94.         // This can happen when more than one drive letter is being handled by the same network
    95.         // redirecter
    96.         //
    97.         for i := 0 to 26-1 do
    98.         begin
    99.             if( DriveHookDevices[i] = fileSysDevice ) then
    100.             begin
    101.  
    102.                 //
    103.                 // If we're already watching it, associate this drive letter
    104.                 // with the others that are handled by the same network driver. This
    105.                 // enables us to intelligently update the hooking menus when the user
    106.                 // specifies that one of the group should not be watched -we mark all
    107.                 // of the related drives as unwatched as well
    108.                 //
    109.                 ObDereferenceObject( fileObject );
    110.                 ZwClose( ntFileHandle );
    111.                 DriveHookDevices[ Drive ] := fileSysDevice;
    112.                 Result := TRUE;
    113.                 exit;
    114.             end;
    115.         end;
    116.  
    117.         //
    118.         // The file system's device hasn't been hooked already, so make a hooking device
    119.         //  object that will be attached to it.
    120.         //
    121.         Status := IoCreateDevice( DriverObject,
    122.                                    sizeof(HOOK_EXTENSION),
    123.                                    NiL,
    124.                                    fileSysDevice^.DeviceType,
    125.                                    0,
    126.                                    FALSE,
    127.                                    @hookDevice );
    128.         if( not NT_SUCCESS(Status) ) then
    129.         begin
    130.             DbgPrint('Filemon: failed to create associated device: %c', ord('A')+Drive );
    131.  
    132.             ObDereferenceObject( fileObject );
    133.             ZwClose( ntFileHandle );
    134.  
    135.             Result := FALSE;
    136.             exit;
    137.         end;
    138.  
    139.         //
    140.         // Clear the device's init flag as per NT DDK KB article on creating device
    141.         // objects from a dispatch routine
    142.         //
    143.         hookDevice^.Flags := hookDevice^.Flags and (not DO_DEVICE_INITIALIZING);
    144.           DbgPrint('hookDevice->Flags: %d',hookDevice^.Flags);
    145.  
    146.         //
    147.         // Setup the device extensions. The drive letter and file system object are stored
    148.         // in the extension.
    149.         //
    150.         hookExtension := hookDevice^.DeviceExtension;
    151.         hookExtension^.LogicalDrive := ord('A')+Drive;
    152.         hookExtension^.FileSystem   := fileSysDevice;
    153.         hookExtension^.Hooked       := TRUE;
    154.         hookExtension^.Type_        := STANDARD;
    155.         hookExtension^.CurrentMaskIrp := nil;
    156.         DbgPrint('hookExtension^.FileSystem : %p',hookExtension^.FileSystem);
    157.         //
    158.         // Finally, attach to the device. The second we're successfully attached, we may
    159.         // start receiving IRPs targetted at the device we've hooked.
    160.         //
    161.         Status := IoAttachDeviceByPointer( hookDevice, fileSysDevice );
    162.         if( not NT_SUCCESS(Status) )  then
    163.         begin
    164.             //
    165.             // Couldn' attach for some reason
    166.             //
    167.             DbgPrint('Filemon: Connect with Filesystem failed: %c (%x) =>%x',
    168.                       ord('A')+Drive, fileSysDevice, Status );
    169.  
    170.             //
    171.             // Derefence the object and get out
    172.             //
    173.             ObDereferenceObject( fileObject );
    174.             ZwClose( ntFileHandle );
    175.  
    176.             Result := FALSE;
    177.             exit;
    178.  
    179.         end else
    180.  
    181.             //
    182.             // Make a new drive group for the device,l if it does not have one
    183.             // already
    184.             //
    185.             DbgPrint('Filemon: Successfully connected to Filesystem device %c', ord('A')+Drive );
    186.  
    187.         //
    188.         // Determine if this is a NTFS drive
    189.         //
    190.         fileFsAttributesSize := sizeof( FILE_FS_ATTRIBUTE_INFORMATION) + MAXPATHLEN;
    191.             DbgPrint('fileFsAttributesSize: %d',fileFsAttributesSize);
    192.         hookExtension^.FsAttributes := PFILE_FS_ATTRIBUTE_INFORMATION( ExAllocatePool( NonPagedPool,
    193.                                                                                        fileFsAttributesSize ));
    194.         if  boolean( hookExtension^.FsAttributes) and
    195.             (not NT_SUCCESS( IoQueryVolumeInformation( fileObject, FileFsAttributeInformation,
    196.                                                    fileFsAttributesSize, hookExtension^.FsAttributes,
    197.                                                    @fileFsAttributesSize )
    198.                                                    )
    199.                                                    )
    200.                                                     then
    201.         begin
    202.             //
    203.             // On failure, we just don't have attributes for this file system
    204.             //
    205.             ExFreePool( hookExtension^.FsAttributes );
    206.             hookExtension^.FsAttributes := NiL;
    207.               DbgPrint('On failure, we just don''t have attributes for this file system');
    208.         end;
    209.           DbgPrint('hookExtension->FsAttributes: %d',hookExtension^.FsAttributes);
    210.  
    211.         //
    212.         // Close the file and update the hooked drive list by entering a
    213.         // pointer to the hook device object in it.
    214.         //
    215.         ObDereferenceObject( fileObject );
    216.  
    217.         ZwClose( ntFileHandle );
    218.  
    219.         DriveHookDevices[Drive] := hookDevice;
    220.  
    221.     end else begin
    222.  
    223.         hookExtension := DriveHookDevices[Drive]^.DeviceExtension;
    224.         hookExtension^.Hooked := TRUE;
    225.     end;
    226.     result := TRUE;
    227. end;
    228.  


    Извините за флэйм и я ни в коем случае не призываю всех писать на паскале, просто если уж говорить, а тем более ругать, то хотя бы надо знать суть темы.

    Еще раз извиняюсь, если кого-то обидел.
     
  10. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    LuckyDevil

    я ни в коем случае не ругаю Delphi. Вообще на мой личный взгляд Паскаль мало чем уступает Си, но гораздо доступнее в понимании простому неказистому программисту типа меня. Слово

    "прикольно" в данном контексте означает "интересно" и ни в коем случае не является ругательством.



    з.ы. интересный код :))



    з.з.ы. а я на паскале написал брут к одной очччень известной

    системе удаленного администрирования :)))
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    я польщен :)) столько слов, и все из-за delphi :)) не дадим в обиду лучший продукт BoRLaND!! :))
     
  12. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    На самом деле лучший их продукт: Borland Paradox. :) И драверов на нем еще никто и никогда не писал. :)))



    Чтобы не было оффтопиком: а можно ли писать драйвера на каких-нибудь экзотических языках, типа Modula-2, Oberon, Basic, Cobol, Fortran, etc?
     
  13. _CC

    _CC New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    52
    Да.. Для полного счастья не хватает драйвера на BrainFuck-е.. ))