Проблема выгрузки драйвера, перехватившего ZwUnloadDriver

Тема в разделе "WASM.NT.KERNEL", создана пользователем rkscout, 27 мар 2010.

  1. rkscout

    rkscout New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    6
    Суть проблемы: есть драйвер, перехватывающий функцию ZwUnloadDriver. В процессе отладки требуется периодически выгружать его из ядра, а затем подгружать обратно. При выгрузке вначале срабатывает перехват, потом вызывается оригинальная функция, затем происходит возврат в перехват, который уже благополучно из памяти испарился, затем естественно появляется BSOD.

    Вопрос: есть ли способ обхода этой проблемы? Какой-то легальный способ драйверу самоубиться.
     
  2. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    rkscout, а что вы в двух местах перехватываете?
    тут проверяете. Если выгружаться надо, быстренько всё восстанавливаете на свои места и спокойно уходите в небытиё.
     
  3. rkscout

    rkscout New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    6
    Перехват один. Схематично выглядит все так:
    ->MyZwUnloadDriver()->ZwUnloadDriver()->MyDriverOnUnload()->перехваты убраны, хвосты подчищены->возвращаемся в MyZwUnloadDriver()->BSOD

    Почему БСОД, в данном случае понятно. А вот как выгрузиться... не совсем.
     
  4. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    rkscout, ето "реальниый бок" ! Хотя что может си ... ничего болшего.
    делайте так хотя бы: ->MyZwUnloadDriver()->5+ZwUnloadDriver() ->в небытиё
    MyZwUnloadDriver() = если надо валить-> восстанавливаем всё и прыгаем на 5+ZwUnloadDriver()
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не, как решить проблему, это понятно (см. выше), мне больше интересно, зачем вообще хукать NtUnloadDriver?
     
  6. rkscout

    rkscout New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    6
    Дело в том, что возврат и в этом случае происходит в функцию, которую я уже удалил. Вот я и туплю что-то, может и выход из тупика простой?
     
  7. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    x64, шоб не выгрузили, неужели непонятно ))), ну ето понятно и так. а хукать ZwUnloadDriver проще всего, может быть поэтому?
     
  8. rkscout

    rkscout New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    6
    Задача состояла в обработке параметров поступивших на вход определенных системных сервисов. Список сервисов был в постановке задачи.
     
  9. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    rkscout,
    Код (Text):
    1. ; jmp from > to
    2. from: jmp (to-from-5)
    почитайте статьи на сайте!
    P.S. как вы вообще пишете такие методы перехвата?
     
  10. rkscout

    rkscout New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    6
    Перехваты самые простые - сплайсинг пролога с помощью jmp на мой код.
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    И как тогда у тебя получается возврат на твой же код, если должно быть так:
    NtUnloadDriver -> jmp -> MyNtUnloadDriver -> trampoline -> NtUnloadDriver + sizeof (jmp).
    Как видишь, в MyNtUnloadDriver попадаем только один раз, в чём же проблема?
     
  12. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    зачем регистрировать driver unload routine, если не нужно выгружать?
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    rkscout
    Обычно под Zw* подразумевается стаб, под Nt* идентификатор и соответственно линк на хэндлер сервиса. Никогда не видел в стабах пролог, наверно имеется ввиду хэндлер непосредственно.. Тогда как обратно в дров управление возвращается после отработки оригинального сервиса, это что рекурсивный вызов ?
     
  14. rkscout

    rkscout New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    6
    Спасибо всем за комментарии, ошибка была при освобождении ресурсов. Мой недосмотр, не надо все-таки ночами сидеть. Ещё раз всем спасибо.