Завершения драйвера вместе с процессом...

Тема в разделе "WASM.WIN32", создана пользователем valix7, 20 июн 2007.

  1. valix7

    valix7 New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    143
    Привет!
    Есть драйвер(сетевой фильтр) и прога которая его запускает(OpenSCManager, CreateService...) и с ним "общается".... так вот, если в таск манэд. отрубить процесс то драйвер всеравно работает.. т.е. фильтрует сетевой траффик.... мне надо сделать чтоб драйвер выгружался вместе с процессом, т.е. если его даже убили из таск. мэнэд... Как сделать такое?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    перехватывать в драйвере NtTerminateProcess.
     
  3. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Лучше повесить callback на PsSetCreateProcessNotifyRoutine, и по ProcessId , Create проверять наш ли процесс прибили.
     
  4. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    после расстановки хуков драйвер вообще лучше не выгружать, на 100% безопасным это не будет, к тому же действительно, лучше воспользоваться документированной возможностью - MegaZu прав
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Megazu
    Проблема в том, что драйвер, который зарегистрировал notify routine нельзя выгружать :) (см. в DDK PsSetCreateProcessNotifyRoutine: "Any driver that successfully registers a callback must remain loaded until the system itself is shut down")
     
  6. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    gilg
    То что написано это хорошо, но я например снимал всегда нотифай, и всегда было все гуд. Просто я не понимаю логики, зачем тогда делать параметр на удаления, если нельзя удалять ? Да и еще описывать его. Вот например NTSTATUS
    PsSetLoadImageNotifyRoutine(
    IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
    );
    , она снимаеться если не ошибаюсь с XP и то с помощью PsRemoveLoadImageNotifyRoutine


    NTSTATUS
    PsSetCreateProcessNotifyRoutine(
    IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
    IN BOOLEAN Remove
    );

    Remove
    Indicates whether the routine specified by NotifyRoutine should be added to or removed from the system's list of notification routines. If FALSE, the specified routine is added to the list. If TRUE, the specified routine is removed from the list.
     
  7. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Причина, по которой
    вероятно, та же, что и в случае с хуком NtTerminateProcess. Удалять то нотифай можно, а вот дров выгружать небезопасно потом... Можно придумать и другие способы - например, процесс по таймеру устанавливает именованное событие, которое сигнализирует о работе процесса. Когда процесс умирает, по истечению определенного времени не словится событие, что будет признаком того, что дрову пора как-то выгружаться. Но все же подумай - не делает ли твой драйвер чего-то такого, после чего его нельзя выгружать, аля ставит хуки, нотифай и т.п.
     
  8. valix7

    valix7 New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    143
    2Deyton, я тоже думал над этим вариантом, наверное так и сделаю.. Всем спасибо!
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а как ты из драйвера самозавершишься?
     
  10. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    А в случае перехвата NtTerminateProcess что-то измениться ? Или делать изврат с возвратом STATUS_SUCCESS, а в реальности ничего не делать, далее сигнализировать проге что ей нужно выгрузить дровину снять хуки и ждать пока прога сама завершиться через ExitProcess ?)))

    Я думаю топикстартеру не обьязательно нужно физически выгружать драйвер, а отключить функционал, после выгрузки проги. А на счет выгрузки драйвера из самого драйвера то ничего особо сложного не вижу.
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    MegaZu
    ну примерно так. только до ExitProcess'a можно не ждать.
    когда колбек приходит, прога уже выгружена, а перехватив NtTerminateProcess сможем предотвратить это.
    можно примерчик? Куда ZwUnloadDriver вернёт управление хотя бы.
     
  12. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Блин, как ты хук будешь потом снимать? А если после тебя кто-то похукает NtTerminateProcess? Ты выгрузишь дров, а он потом твой хук вызовет, или и чужие хуки убьешь? Не гоните, не надо ничего хукать, тред в каком-то ситемном процессе (можно ддлку подгрузить), и просигналить ему, что процесс пока жив/уже мертв, он потом пусть и выгружает. Или действительно, может просто функционал отключить требуется, не выгружая драйвер - тогда и CALLBACK устроит.
     
  13. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Дровина это увидила и например на снифает трафф, тоесть не делает никакого функционала, а просто висит себе в памяти.
    А на счет выгрузки, то не обьязательно, чтоб возврат был на нас, можно выделить память, скопировать туда код потока который выгрузит дровину и убьет поток, далее запускаем поток. Минус в том что память в несколько сотен байт не будет выгруженая. Можно через APC. Можно через стандартный инжект.
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Deyton
    а почему бы и не убить чужие хуки? :)
    Если отключить функционал, то тут другое дело, всё очень просто.
    MegaZu
    ну в принципе можно и так.
     
  15. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Deyton
    Если установка/снятие хуков реализованы корректно, то ни свои, ни чужие хуки "убиваться" не будут. Ну а если они сделаны через ж..., то туда в общем-то и дорога.

    valix7
    Единственный корректный и документированный способ - это писать не legacy драйвер, а WDM. Тогда при падении проги хендл к девайсу будет закрыт, и будет автоматически вызвана функция DriverUnload.
     
  16. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Тогда поясни, как снять свой хук и выгрузить драйвер, чтобы это:
    1) не 99,9 а 100% гарантировало стабильную работу системы.
    2) при этом не повлияло на работу других драйверов, как во время работы твоего драйвера, так и после его выгрузки, которые тоже могут ставить хуки; я плохо себе это представляю.
     
  17. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Элементарно: InterlockedExchange(&address_of_hooked_sdt_entry, original_function_sdt_entry);

    Хук функции вообще-то вещь не документированная и если чей-нибудь чужой драйвер грохнется при восстановлении sdt, значит он некорректно написан, потому что нельзя полагаться на то, что недокументированная функциональность будет доступна всегда.

    Еще раз повторюсь, что сам _не_ считаю перехват функций нормальным способом выгрузки драйвера.
     
  18. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    гыгы, а как быть с чужими тредами, которые оказались в теле дрова? Допустим чей-то поток прервется на первой инструкции в теле твоего хука. Прийдется еще контексты потоков парсить, а эта возможность тоже недокументированна, прийдется еще учитывать формат структур для каждого билда Win, что светит дополнительным гемороем и багами.
    если бы все так писали дрова, восстанавливающие SDT и убивающие чужие хуки, то достигалось бы это ценной офигенной несовместимости, все юзеры плевались бы на мелкософт, и возможность патча SDT прикрыли бы гораздо раньше выхода Vista64. Есть целый ряд _полезных_ программ, которых реализовать только на документированных возможностях невозможно. Подход "лишь бы у меня работало" я тоже считаю неправильным, таких советов мне не понять, и не пойму я, к чему это спор.
     
  19. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Deyton
    Все это конечно офигительно. Только рекомендую немного почитать про различие между хукингом SDT и сплайсингом.

    А не надо писать дрова, которые хукают SDT :) Или надо учитывать возможность удаления этих хуков.

    Ага. Из программ, ставящих хуки, в голову приходят только две разновидности: руткиты и антималваре (debugging tools не в счет). Ни то, ни другое ни в коем разе не должно падать при снятии хуков, т.к. иначе первые найдут, а вторые выкинут из-за излишней глюкавости

    А ее прикрыли? ну-ну :)
     
  20. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    нда... прочитай еще раз (вдумчиво) то что я написал, прервется не на инструкции, которую ты перезапиываешь, а в теле твоего хука; получишь вот это:http://www.wasm.ru/forum/viewtopic.php?id=21156
    а насчет сплайсинга, то будет тебе известно, что есть возможность делать это безопасно, путем перезаписи первой инструкции mov edi, edi коротким джампом, рекомендую поменьше читать всякий бред, побольше спать и читать MSDN.