Суть проблемы: есть драйвер, перехватывающий функцию ZwUnloadDriver. В процессе отладки требуется периодически выгружать его из ядра, а затем подгружать обратно. При выгрузке вначале срабатывает перехват, потом вызывается оригинальная функция, затем происходит возврат в перехват, который уже благополучно из памяти испарился, затем естественно появляется BSOD. Вопрос: есть ли способ обхода этой проблемы? Какой-то легальный способ драйверу самоубиться.
rkscout, а что вы в двух местах перехватываете? тут проверяете. Если выгружаться надо, быстренько всё восстанавливаете на свои места и спокойно уходите в небытиё.
Перехват один. Схематично выглядит все так: ->MyZwUnloadDriver()->ZwUnloadDriver()->MyDriverOnUnload()->перехваты убраны, хвосты подчищены->возвращаемся в MyZwUnloadDriver()->BSOD Почему БСОД, в данном случае понятно. А вот как выгрузиться... не совсем.
rkscout, ето "реальниый бок" ! Хотя что может си ... ничего болшего. делайте так хотя бы: ->MyZwUnloadDriver()->5+ZwUnloadDriver() ->в небытиё MyZwUnloadDriver() = если надо валить-> восстанавливаем всё и прыгаем на 5+ZwUnloadDriver()
Не, как решить проблему, это понятно (см. выше), мне больше интересно, зачем вообще хукать NtUnloadDriver?
Дело в том, что возврат и в этом случае происходит в функцию, которую я уже удалил. Вот я и туплю что-то, может и выход из тупика простой?
x64, шоб не выгрузили, неужели непонятно ))), ну ето понятно и так. а хукать ZwUnloadDriver проще всего, может быть поэтому?
Задача состояла в обработке параметров поступивших на вход определенных системных сервисов. Список сервисов был в постановке задачи.
rkscout, Код (Text): ; jmp from > to from: jmp (to-from-5) почитайте статьи на сайте! P.S. как вы вообще пишете такие методы перехвата?
И как тогда у тебя получается возврат на твой же код, если должно быть так: NtUnloadDriver -> jmp -> MyNtUnloadDriver -> trampoline -> NtUnloadDriver + sizeof (jmp). Как видишь, в MyNtUnloadDriver попадаем только один раз, в чём же проблема?
rkscout Обычно под Zw* подразумевается стаб, под Nt* идентификатор и соответственно линк на хэндлер сервиса. Никогда не видел в стабах пролог, наверно имеется ввиду хэндлер непосредственно.. Тогда как обратно в дров управление возвращается после отработки оригинального сервиса, это что рекурсивный вызов ?
Спасибо всем за комментарии, ошибка была при освобождении ресурсов. Мой недосмотр, не надо все-таки ночами сидеть. Ещё раз всем спасибо.