А смыслу? Специфика приложения такова, что оно всегда будет чем-нибудь палиться, и эта же специфика освобождает это приложение от тех, кто любит снимать антивирусы и прочую лабуду. Да кому такое надо?
Почему, если поток инициировал IRP, который никогда не завершится (deadlock или бесконечный цикл в обработчике), то такой поток прибить нельзя ) Пробовал уже
Провел я небольшое исследование по поводу того, что процесс имеющий окно наиболее уязвим: Как я уже говорил, любая функция, работающая с окнами вызывает неэкспортируемую ValidateHwnd, которая получает pWnd по hWnd. Перехватывать ее геморойно, пришлось бы патчить все процессы. Но есть другой выход - ValidateHwnd вызывает NtUserValidateHandleSecure, которую можно перехватить в shadow таблице. NtUserValidateHandleSecure принимает на стеке два параметра, последний из которых hWnd. Она возвращает 1 в случае успеха и 0 в случае неудачи. Если возвращать 0, то ValidateHwnd возвращает 0 и устанавливает LastError в INVALIDE_WINDOW_HANDLE. Следовательно ни одна функция, работающая с окном работать не будет и дыра в безопасности процесса, связанная с наличием окна, прикроется раз и навсегда. Воть...
Вообщем, дело обстоит вот как: При подобном перехвате окно, если оно главное, перестает появляться на таскбаре. Так же наблюдаются непонятки с перечислением окон в системе (их становится гораздо меньше). Но желаемый эффект достигается - окна не видно и его нельзя закрыть. Так что если проявляющиеся баги не важны, метод можно смело юзать. Вот код обработчика NtUserValidateHandleSecure: Код (Text): NewNtUserValidateHandleSecure PROC mov eax, dword ptr[esp + 4] mov ebx, dword ptr[protected_hwnd] .if eax == ebx invoke PsGetCurrentProcessId mov ebx, dword ptr[protected_pid] .if eax != ebx xor eax, eax mov dword ptr[esp + 4], eax .endif .endif jmp dword ptr[_NtUserValidateHandleSecure] ret NewNtUserValidateHandleSecure ENDP
Однако это не отменяет возможность брутфорса по кэшу окон. Вообще от этого метода защиты больше глюков, чем пользы и в реальности он слабо применим, но разумеется все желающие могут попробовать. И окно по-прежнему видно в Alt+Tab.