Собственно вопрос заключается вот в чем. У меня программа при помощи ZwLoadDriver грузит драйвер в систему и сразу удаляет его с жесткого диска (в смысле сам SYS файл драйвера). Если делать все по такой схеме, то система уходит в БСОД и комп перезагружается. Но если же не удалять файл драйвера после его загрузки то все ОК. Потом можно ручками потереть файл и все. У меня мысль что ZwLoadDriver стартует загрузку и не дожидаясь полной загрузки драйвера передает управление моей программе где он удаляется и возникает ошибка. Что вы думаете на этот счёт? А еще маленький вопросик... можно ли загружать драйвера из РЕСУРСА программы а не из SYS файла с жесткого диска?
ресурсы -> файл -> загрузка дрова -> удаление файла она кажись не возвращает управление пока не будет выполнена DriverEntry
Тогда какие мысли по поводу БСОДА? Ведь он 100% происходит если удалить файл драйвера сразу после загрузки дрова. А если не удалять то все ок!=\
документировано напрямую вроде нельзя. данные о бсоде в студию. желательно вывод !analyze -v интересно че за фигня
Great Нужен еще и объем памяти установленный на компе. Причина - если мало памяти - грузится вначале только заголовок (а последний в памяти будет всегда) и INIT секция, а далее уже по PAGE_FAULT все подгружается. Если недостатка в памяти нет - то грузится все сразу.
ZamDec Хоглунд::Руткиты (53 стр.) может подойдет но все же драйвер хоть и находится в ресурсах все-равно перед установкой копируется на диск
Ага... только памяти на компе - 2 гб и проц Core 2 DUO. В железе проблемы нет тут в чем то другом ...
ZamDec Вот те раз. NTSTATUS ZwLoadDriver( IN PUNICODE_STRING DriverServiceName ); а что в NTSTATUS возвращено при загрузке. Добавь в файл драйвер вывод отладочной информации. + приложи расширенную информацию БСОД. Попробуй сделть все секции в файле драйвере Not Pageable. Тогда по идее все должно загрузиться сразу. Попробуй создать объект событие, которое переходит в сигнальное состояние после отработки DriverEntry. И ждать этого события в лоадере, а только потом удалять файл.
Проще всего сделать ZwDeleteFile в DriverEntry и не мучиться, даже файл драйвера можно доставать автоматом с DriverObject->DriverSection
Возможна ли ручная установка кода драйвера в систему? Минуя сис вызовы. Подход с реверсом ZwLoadDriver например - не предлагать т к это ясно, может его уже кто то восстановил(имеется ввиду код ZwLoadDriver)?
Код (Text): KPROCESSOR_MODE requestorMode; UNICODE_STRING driverServiceName; PWCHAR nameBuffer = (PWCHAR) NULL; LOAD_PACKET loadPacket; PAGED_CODE(); requestorMode = KeGetPreviousMode(); if (requestorMode != KernelMode) { if (!SeSinglePrivilegeCheck( SeLoadDriverPrivilege, requestorMode )) { return STATUS_PRIVILEGE_NOT_HELD; } try { driverServiceName = ProbeAndReadUnicodeString( DriverServiceName ); if (!driverServiceName.Length) { return STATUS_INVALID_PARAMETER; } ProbeForRead( driverServiceName.Buffer, driverServiceName.Length, sizeof( WCHAR ) ); nameBuffer = ExAllocatePoolWithQuota( PagedPool, driverServiceName.Length ); RtlCopyMemory( nameBuffer, driverServiceName.Buffer, driverServiceName.Length ); driverServiceName.Buffer = nameBuffer; } except(EXCEPTION_EXECUTE_HANDLER) { if (nameBuffer) { ExFreePool( nameBuffer ); } return GetExceptionCode(); } } else { driverServiceName = *DriverServiceName; } KeInitializeEvent( &loadPacket.Event, NotificationEvent, FALSE ); loadPacket.DriverObject = (PDRIVER_OBJECT) NULL; loadPacket.DriverServiceName = &driverServiceName; ExInitializeWorkItem( &loadPacket.WorkQueueItem, IopLoadUnloadDriver, &loadPacket ); ExQueueWorkItem( &loadPacket.WorkQueueItem, DelayedWorkQueue ); KeWaitForSingleObject( &loadPacket.Event, UserRequest, KernelMode, FALSE, (PLARGE_INTEGER) NULL ); if (nameBuffer) { ExFreePool( nameBuffer ); } return loadPacket.FinalStatus; ************************************************************************ VOID IopLoadUnloadDriver( IN PVOID Parameter ) { PLOAD_PACKET loadPacket; NTSTATUS status; HANDLE keyHandle; PAGED_CODE(); loadPacket = (PLOAD_PACKET) Parameter; if (loadPacket->DriverObject) { loadPacket->DriverObject->DriverUnload( loadPacket->DriverObject ); status = STATUS_SUCCESS; } else { PLIST_ENTRY entry; PREINIT_PACKET reinitEntry; status = IopOpenRegistryKey( &keyHandle, (HANDLE) NULL, loadPacket->DriverServiceName, KEY_READ, FALSE ); if (NT_SUCCESS( status )) { status = IopLoadDriver( keyHandle ); while (entry = ExInterlockedRemoveHeadList( &IopDriverReinitializeQueueHead, &IopDatabaseLock )) { reinitEntry = CONTAINING_RECORD( entry, REINIT_PACKET, ListEntry ); //#if _PNP_POWER_ reinitEntry->DriverObject->DriverExtension->Count++; reinitEntry->DriverReinitializationRoutine( reinitEntry->DriverObject, reinitEntry->Context, reinitEntry->DriverObject->DriverExtension->Count ); //#else #if 0 reinitEntry->DriverObject->Count++; reinitEntry->DriverReinitializationRoutine( reinitEntry->DriverObject, reinitEntry->Context, reinitEntry->DriverObject->Count ); #endif // _PNP_POWER_ ExFreePool( reinitEntry ); } } } loadPacket->FinalStatus = status; (VOID) KeSetEvent( &loadPacket->Event, 0, FALSE ); } может поможет?
а если ручками запихнуть образ драйвера в ядро и на ЕП перейти с хука? релюки, импорт и т.п. из юзермода прекрасно правятся о_О
xdf вопрос в принципе только в доступе к физической памяти, а это м.б. несколько проблематично)) т.к. device\physicalmemory просто так не откроешь - палится ав.
да тут много чего есть и сплоенты всякие и ntsysdbgctrl и вообще очень странные штуки, разрешенные виндой и еще не палящиеся.
Great А попробуй поработай с секцией как с Device? Read Write еще покатят, а вот DeviceIoControl... ScsiPort0 тоже в Device хранится - только хен откроешь из User Mode