Виндоус XP и выше 32, 64 бита
Нужно предотвратить выполнение создаваемого потока.
В идеале завершить его.
С помощью PsSetCreateThreadNotifyRoutine, отлавливаю создание
потоков. Выяснив что поток необходимо завершить, передаю управление в юзер моде, где исполняется код:
HANDLE hThread = OpenThread(THREAD_TERMINATE, FALSE, nThreadId);
if(hThread)
{
TerminateThread(hThread, 0);
CloseHandle(hThread);
}
Проблема в том что в XP данный способ не работает.
Хэндла потока в юзер моде не видно, как я понял он добавляется после отработки PsSetCreateThreadNotifyRoutine.
Функции ZwTerminateThread, ZwSuspendThread — ядром не экспортируются.
Вручную находить точку входа ZwTerminateThread через SSDT этот вариант оставил на крайний случай, и то есть подозрение что она не отработает, т.к. хэндл потока будет не найден
Вписать в точку входа потока инструкцию:
__asm ret 4;
или для 64 битных систем
__asm ret 8;
Этот способ представляется универсальным, вопрос в том как найти точку входа потока из ядра по его хэндлу?
И, может, существуют иные решения?
P.S.
Для нахождения точки входа потока (В XP) не получается использовать ZwQueryInformationThread(ThreadQuerySetWin32StartAddress) т.к. вызов ZwOpenThread стабильно возвращает 0xC000000D — STATUS_INVALID_PARAMETER. По всей видимости потому что хэндл потока ещё не добавлен в таблицу хэндлов. На семёрке вызов ZwOpenThread проходит без ошибки.
Здравствуйте, kr4nt, Вы писали:
K>P.S.
K>Для нахождения точки входа потока (В XP) не получается использовать ZwQueryInformationThread(ThreadQuerySetWin32StartAddress) т.к. вызов ZwOpenThread стабильно возвращает 0xC000000D — STATUS_INVALID_PARAMETER. По всей видимости потому что хэндл потока ещё не добавлен в таблицу хэндлов. На семёрке вызов ZwOpenThread проходит без ошибки.
Все верно, детали тут:
http://kitrap08.blogspot.ru/2012/02/pssetcreatethreadnotifyroutine-winxp.html
K>>Для нахождения точки входа потока (В XP) не получается использовать ZwQueryInformationThread(ThreadQuerySetWin32StartAddress) т.к. вызов ZwOpenThread стабильно возвращает 0xC000000D — STATUS_INVALID_PARAMETER. По всей видимости потому что хэндл потока ещё не добавлен в таблицу хэндлов. На семёрке вызов ZwOpenThread проходит без ошибки.
TSS>Все верно, детали тут: http://kitrap08.blogspot.ru/2012/02/pssetcreatethreadnotifyroutine-winxp.html
не думаю что это баг, данный колбэк изначально не предназначен чтобы чтото делать с самими тредами, тем более их килять (хз что там ТС задумал, но мне это уже не нравицца) а для чего он прдназначен — написано в мсдн-е.