PsSetCreateThreadNotifyRoutine. Завершить поток.
От: kr4nt  
Дата: 29.03.13 13:27
Оценка:
Виндоус 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;


Этот способ представляется универсальным, вопрос в том как найти точку входа потока из ядра по его хэндлу?

И, может, существуют иные решения?
Re: PsSetCreateThreadNotifyRoutine. Завершить поток.
От: kr4nt  
Дата: 29.03.13 14:11
Оценка:
P.S.
Для нахождения точки входа потока (В XP) не получается использовать ZwQueryInformationThread(ThreadQuerySetWin32StartAddress) т.к. вызов ZwOpenThread стабильно возвращает 0xC000000D — STATUS_INVALID_PARAMETER. По всей видимости потому что хэндл потока ещё не добавлен в таблицу хэндлов. На семёрке вызов ZwOpenThread проходит без ошибки.
Re[2]: PsSetCreateThreadNotifyRoutine. Завершить поток.
От: TSS_TSS http://kitrap08.blogspot.com/
Дата: 30.03.13 07:19
Оценка:
Здравствуйте, kr4nt, Вы писали:


K>P.S.

K>Для нахождения точки входа потока (В XP) не получается использовать ZwQueryInformationThread(ThreadQuerySetWin32StartAddress) т.к. вызов ZwOpenThread стабильно возвращает 0xC000000D — STATUS_INVALID_PARAMETER. По всей видимости потому что хэндл потока ещё не добавлен в таблицу хэндлов. На семёрке вызов ZwOpenThread проходит без ошибки.
Все верно, детали тут: http://kitrap08.blogspot.ru/2012/02/pssetcreatethreadnotifyroutine-winxp.html
http://kitrap08.blogspot.com/
Re[3]: PsSetCreateThreadNotifyRoutine. Завершить поток.
От: ononim  
Дата: 30.03.13 10:28
Оценка:
K>>Для нахождения точки входа потока (В XP) не получается использовать ZwQueryInformationThread(ThreadQuerySetWin32StartAddress) т.к. вызов ZwOpenThread стабильно возвращает 0xC000000D — STATUS_INVALID_PARAMETER. По всей видимости потому что хэндл потока ещё не добавлен в таблицу хэндлов. На семёрке вызов ZwOpenThread проходит без ошибки.
TSS>Все верно, детали тут: http://kitrap08.blogspot.ru/2012/02/pssetcreatethreadnotifyroutine-winxp.html
не думаю что это баг, данный колбэк изначально не предназначен чтобы чтото делать с самими тредами, тем более их килять (хз что там ТС задумал, но мне это уже не нравицца) а для чего он прдназначен — написано в мсдн-е.
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.