Вопрос по ZwLoadDriver

Тема в разделе "WASM.WIN32", создана пользователем ZamDec, 16 ноя 2007.

  1. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Собственно вопрос заключается вот в чем. У меня программа при помощи ZwLoadDriver грузит драйвер в систему и сразу удаляет его с жесткого диска (в смысле сам SYS файл драйвера). Если делать все по такой схеме, то система уходит в БСОД и комп перезагружается. Но если же не удалять файл драйвера после его загрузки то все ОК. Потом можно ручками потереть файл и все. У меня мысль что ZwLoadDriver стартует загрузку и не дожидаясь полной загрузки драйвера передает управление моей программе где он удаляется и возникает ошибка. Что вы думаете на этот счёт?

    А еще маленький вопросик... можно ли загружать драйвера из РЕСУРСА программы а не из SYS файла с жесткого диска?
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ресурсы -> файл -> загрузка дрова -> удаление файла
    она кажись не возвращает управление пока не будет выполнена DriverEntry
     
  3. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Тогда какие мысли по поводу БСОДА? Ведь он 100% происходит если удалить файл драйвера сразу после загрузки дрова. А если не удалять то все ок!=\
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    документировано напрямую вроде нельзя.
    данные о бсоде в студию. желательно вывод !analyze -v
    интересно че за фигня
     
  5. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Great

    Нужен еще и объем памяти установленный на компе. Причина - если мало памяти - грузится вначале только заголовок (а последний в памяти будет всегда) и INIT секция, а далее уже по PAGE_FAULT все подгружается. Если недостатка в памяти нет - то грузится все сразу.
     
  6. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    ZamDec
    Хоглунд::Руткиты (53 стр.) может подойдет
    но все же драйвер хоть и находится в ресурсах все-равно перед установкой копируется на диск
     
  7. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Ага... только памяти на компе - 2 гб и проц Core 2 DUO. В железе проблемы нет :dntknw: тут в чем то другом ...
     
  8. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    ZamDec

    Вот те раз.

    NTSTATUS
    ZwLoadDriver(
    IN PUNICODE_STRING DriverServiceName
    );

    а что в NTSTATUS возвращено при загрузке. Добавь в файл драйвер вывод отладочной информации. + приложи расширенную информацию БСОД.

    Попробуй сделть все секции в файле драйвере Not Pageable. Тогда по идее все должно загрузиться сразу.

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

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Проще всего сделать ZwDeleteFile в DriverEntry и не мучиться, даже файл драйвера можно доставать автоматом с DriverObject->DriverSection
     
  10. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Возможна ли ручная установка кода драйвера в систему? Минуя сис вызовы.
    Подход с реверсом ZwLoadDriver например - не предлагать т к это ясно, может его уже кто то восстановил(имеется ввиду код ZwLoadDriver)?
     
  11. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Код (Text):
    1.     KPROCESSOR_MODE requestorMode;
    2.     UNICODE_STRING driverServiceName;
    3.     PWCHAR nameBuffer = (PWCHAR) NULL;
    4.     LOAD_PACKET loadPacket;
    5.  
    6.     PAGED_CODE();
    7.  
    8.     requestorMode = KeGetPreviousMode();
    9.  
    10.     if (requestorMode != KernelMode) {
    11.  
    12.         if (!SeSinglePrivilegeCheck( SeLoadDriverPrivilege, requestorMode )) {
    13.             return STATUS_PRIVILEGE_NOT_HELD;
    14.         }
    15.  
    16.          try {
    17.  
    18.             driverServiceName = ProbeAndReadUnicodeString( DriverServiceName );
    19.  
    20.             if (!driverServiceName.Length) {
    21.                 return STATUS_INVALID_PARAMETER;
    22.             }
    23.  
    24.             ProbeForRead( driverServiceName.Buffer,
    25.                           driverServiceName.Length,
    26.                           sizeof( WCHAR ) );
    27.  
    28.             nameBuffer = ExAllocatePoolWithQuota( PagedPool,
    29.                                                   driverServiceName.Length );
    30.  
    31.             RtlCopyMemory( nameBuffer,
    32.                            driverServiceName.Buffer,
    33.                            driverServiceName.Length );
    34.  
    35.             driverServiceName.Buffer = nameBuffer;
    36.  
    37.         } except(EXCEPTION_EXECUTE_HANDLER) {
    38.  
    39.             if (nameBuffer) {
    40.                 ExFreePool( nameBuffer );
    41.             }
    42.             return GetExceptionCode();
    43.         }
    44.     } else {
    45.         driverServiceName = *DriverServiceName;
    46.     }
    47.  
    48.     KeInitializeEvent( &loadPacket.Event, NotificationEvent, FALSE );
    49.     loadPacket.DriverObject = (PDRIVER_OBJECT) NULL;
    50.     loadPacket.DriverServiceName = &driverServiceName;
    51.  
    52.     ExInitializeWorkItem( &loadPacket.WorkQueueItem,
    53.                           IopLoadUnloadDriver,
    54.                           &loadPacket );
    55.  
    56.     ExQueueWorkItem( &loadPacket.WorkQueueItem, DelayedWorkQueue );
    57.  
    58.     KeWaitForSingleObject( &loadPacket.Event,
    59.                            UserRequest,
    60.                            KernelMode,
    61.                            FALSE,  (PLARGE_INTEGER) NULL );
    62.  
    63.     if (nameBuffer) {
    64.          ExFreePool( nameBuffer );
    65.     }
    66.  
    67.     return loadPacket.FinalStatus;
    68.  
    69. ************************************************************************
    70.  
    71. VOID IopLoadUnloadDriver( IN PVOID Parameter  )
    72. {
    73.     PLOAD_PACKET loadPacket;
    74.     NTSTATUS status;
    75.     HANDLE keyHandle;
    76.  
    77.     PAGED_CODE();
    78.  
    79.     loadPacket = (PLOAD_PACKET) Parameter;
    80.  
    81.     if (loadPacket->DriverObject) {
    82.  
    83.         loadPacket->DriverObject->DriverUnload( loadPacket->DriverObject );
    84.         status = STATUS_SUCCESS;
    85.  
    86.     } else {
    87.  
    88.         PLIST_ENTRY entry;
    89.         PREINIT_PACKET reinitEntry;
    90.  
    91.         status = IopOpenRegistryKey( &keyHandle,
    92.                                      (HANDLE) NULL,
    93.                                      loadPacket->DriverServiceName,
    94.                                      KEY_READ,
    95.                                      FALSE );
    96.         if (NT_SUCCESS( status )) {
    97.  
    98.  
    99.             status = IopLoadDriver( keyHandle );
    100.  
    101.             while (entry = ExInterlockedRemoveHeadList( &IopDriverReinitializeQueueHead, &IopDatabaseLock )) {
    102.                 reinitEntry = CONTAINING_RECORD( entry, REINIT_PACKET, ListEntry );
    103. //#if _PNP_POWER_
    104.                 reinitEntry->DriverObject->DriverExtension->Count++;
    105.                 reinitEntry->DriverReinitializationRoutine( reinitEntry->DriverObject,
    106.                                                             reinitEntry->Context,
    107.                                                             reinitEntry->DriverObject->DriverExtension->Count );
    108. //#else
    109. #if 0
    110.                 reinitEntry->DriverObject->Count++;
    111.                 reinitEntry->DriverReinitializationRoutine( reinitEntry->DriverObject,
    112.                                                             reinitEntry->Context,
    113.                                                             reinitEntry->DriverObject->Count );
    114. #endif // _PNP_POWER_
    115.                 ExFreePool( reinitEntry );
    116.             }
    117.         }
    118.     }
    119.     loadPacket->FinalStatus = status;
    120.     (VOID) KeSetEvent( &loadPacket->Event, 0, FALSE );
    121. }
    может поможет?
     
  12. xdf

    xdf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    21
    а если ручками запихнуть образ драйвера в ядро и на ЕП перейти с хука?
    релюки, импорт и т.п. из юзермода прекрасно правятся о_О
     
  13. slow_at_work

    slow_at_work New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    64
    xdf

    вопрос в принципе только в доступе к физической памяти, а это м.б. несколько проблематично)) т.к. device\physicalmemory просто так не откроешь - палится ав.
     
  14. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    slow_at_work

    physicalmemory - это не device, а section
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А хранится-то все равно в \Device
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да тут много чего есть:) и сплоенты всякие и ntsysdbgctrl и вообще очень странные штуки, разрешенные виндой и еще не палящиеся.
     
  17. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Great

    А попробуй поработай с секцией как с Device? Read Write еще покатят, а вот DeviceIoControl...
    ScsiPort0 тоже в Device хранится - только хен откроешь из User Mode :)
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Снова к секции Read Write, зачем?