Выгрузка драйвера без перезагрузки

Тема в разделе "WASM.NT.KERNEL", создана пользователем shinoda, 31 июл 2007.

  1. shinoda

    shinoda New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2007
    Сообщения:
    36
    Может мой вопрос глупый, т.к. я не спец. в области ring0 приложений.
    Есть драйвер который загружается вместе с системой как сервис. Мне нужно выгрузить этот драйвер без перезагрузки комп.. Вот два метода выгрузки которые мне знакомы:
    1.
    Код (Text):
    1.   SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
    2.   if (scm == NULL) return FALSE;
    3.   SC_HANDLE svc = OpenService(scm, SERVICENAME, SERVICE_START | DELETE | SERVICE_STOP);
    4.   if(svc == NULL) return FALSE;
    5.   SERVICE_STATUS status;
    6.   ControlService(svc, SERVICE_CONTROL_STOP, &status);
    7.   DeleteService(svc);
    8.   CloseServiceHandle(svc);
    9.   CloseServiceHandle(scm);
    2.
    Код (Text):
    1. Через функцию NtUnLoadDriver
    Но ни первый ни второй код драйвер не выгрузили. Почему?
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    а что они сказали?
     
  3. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    насколько я понимаю если DriveEntry не зарегестрировал процедуру для выхода то его выгрузить нельзя никак.
    я про:
    theDriverObject->DriverUnload=DriverUnload;
    Буду рад если меня поправят.
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    spencer
    насколько позволяют мои скромные познания ядра то это может быть одна из причин, другие причины:
    2) не хватает прав, либо функция остановки хукается - тут ничего происходит
    3) драйвер занят - в этом случае он помечается к удалению и удаляется при случае окончания работы с ним занятым приложением либо перезагрузке
    я тоже буду рад если меня поправят ;)
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    shihoda
    В первом способе смотри на возвращаемые функциями значения и GetLastError`ы.
    Вероятнее всего не закрываешь какой-нибудь хендл
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    gilg
    да и во втором случае интересует возвращаемый NTSTATUS
     
  7. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Первый способ у меня работал тогда, когда функция DriverUnload не была зарегистрирована. Как только я её зарегистрировал, так сразу же исчезла возможность выгрузить драйвер без перезагрузки. Может существуют специальные программы, позволяющие выгружать драйвера принудительно?
     
  8. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Попробуй загрузить/выгрузить минемальный драйвер используя стандартные средства:
    net start mydrv
    net stop mydrv
     
  9. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Командой net stop невозможно остановить тип служб SERVICE_KERNEL_DRIVER. Может есть другие идеи?
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SysProger
    Есть. Удалить из списков(загрузчика и др.), тормознуть в ипи или какомнибудь спинлоке всю систему(чтоб левый проц не мешал), восстановить секции кода всех системных дров с диска, похучить KiTrap0E(#PF) и из хэндлера смореть кто память того дрова заюзает, если на исполнение выполнить развёртку стека, короче долго епацца придется.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    и нафига это надо? :lol: D
    все равно если драйвер очень очень занят то хрен ты его выгрузить даже если перелопатишь все ядро кверх ногами - в ринг0 отлично действует фраза "против лома нет приема если нет другого лома", и войнушку из драйверов устраивать смысла практически нет :)
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Я и сам прекрасно это знаю, да и вообще это не мне нужно.

    Great: а то я не знаю кому это надо =) Я просто говорю что чето ты странное пишешь...
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Если быть открытым, то у тебя подход прост - есть у нас лом, у них тоже лом есть, значит в войне мы проиграем.
    Одна мысль что боротся в кернелмоде и ты уже сдался. Ничего странного, лом у них есть, но редко кто им пользоватсо умеет.
    Я так понимаю что выгрузить - удалить на него все ссылки, чтобы он не получал управление. Человек спросил как его можно выгрузить - ну так ответь ему что мол никак не выгрузишь, тема закрыта. Я хотябы могу попытаться, в большинстве случаев выгрузить удастся. А если и руткит, то он использует модуль - это плохой руткит.
    Допустим подвесилсо он на прерывание, освободили мы память дрова, возникло исключение при передаче управления в дров по этому прерыванию, мы обработаем исключение, возьмём из стека адрес возврата, и вернём управление. Если знать откуда вызов, а это не состовляет труда узнать - мы возвратим корректное значение, к примеру дабы не нарушить цепочку обработчиков, иначе будет если не крах, то полное зависание системы. Для большинства случаев, покрайней мере те драйвера что загружены у меня сейчас, не юзают низкоуровневые перехваты и тп., что не удастся снять. Единственный момент - не всё экспортируется и принудительная выгрузка дрова внесёт некоторые ограничения в систему. Кстати насчёт войнушки - это не борьба руткитов, выгружаемый дров сопротивляться не будет.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вообще я частично пошутил, с долей правды, конечно, но все-таки не стоило воспринимать так серьезно.
    все-таки, наверное, под выгрузкой он понимал нормальную выгрузку. ведь если после такой твоей "выгрузки" попробовать потом его снова загрузить, ничего хорошего не получится. если конечно аккуратно все-все-все не подтереть, что не очень просто
     
  15. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    конечно.
    А я сейчас и не говорю про занятые драйвера. Выгружать занятый драйвер - это уже совсем другая проблема. Вот спокойная выгрузка - текущая проблема.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Нужно ставить в сисире бряк на NtUnloadDriver в процессе services.exe, затем заюзать код с первого поста, когда будет вызван этот сервис(либо сам заюзай NtUnloadDriver) и посмотреть код ошибки, винапи используют rpc, загрузка/выгрузка в контексте services.exe. Пока без возвращаемого значения трудно сказать.