Первый поток исполняет такой код: Код (Text): xor esp,esp dec esp push esp Как второму потоку того же процесса отследить это ?
Clerk А чем не подходит поставить VEH, в котором сделать синхронизацию, например, через Mutex со вторым потоком?
Немного криво вопрос задал. Спрошу иначе. Как предотвратить завершение процесса и как следствие всех потоков, если один из потоков выполнит приведённый код ? Partner Эти апи могут применяться из другого процесса, а нужно чтобы из текущего.
Обязательно "второму потоку того же процесса"? Создать другой процесс, который будет отладчиком-наблюдателем?
SetUnhandledExceptionFilter? предварительно записать в ss исчо можт чото неприятное и анализировать место падения?
Не совсем понял о ем ты? Я такое делал через VEH, в Ring3 всё прекрасно ловится. Также можно захукать KiUserExceptionDispatcher и увести его на NtContinue с коррекцией Eip конечно. Или всё это происходит в ring0?
Freeman PE_Kill Ядро не вызывает KiUserExceptionDispatcher(), просто снося процесс. Юзермод. Нет, вобще идей у меня нет.
Clerk http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/11500.mspx?mfr=true
KeSqueer Отладчик не вызывается, хотя должен.. При обращении к стеку возникает #PF, оно обрабатываетсо в KiTrap0E: KiTrap0E -> KiDispatchException() -> Исключение при копировании аргументов в стек(ProbeForWrite) для вызова KiUserExceptionDispatcher() -> Код (Text): if (DbgkForwardException(ExceptionRecord, TRUE, TRUE)) { goto Handled2; } else if (DbgkForwardException(ExceptionRecord, FALSE, TRUE)) { goto Handled2; } else { ZwTerminateProcess(NtCurrentProcess(), ExceptionRecord->ExceptionCode); Без отладчика никак не словить.
А как чекать состояние потока кроме как ZwQuerySystemInformation->SYSTEM_PROCESSES->SYSTEM_THREADS.State ? Походу ZwQueryInformationThread безполезен в этом плане да ? Через него моно токо чекать жив или мертв поток THREAD_BASIC_INFORMATION.ExitStatus. А надо узнать - заморожен или нет поток. Из TEB'a потока никак не узнать ?
Flasher THREAD_BASIC_INFORMATION.ExitStatus содержит код завершения потока, то значение которое было передано в NtTerminateThread, это не состояние потока, если поток завершён с кодом STATUS_SUCCESS и не завершён это поле будет одинаковым. Для этого подходит SYSTEM_THREADS.State, либо NtSuspendThread, последний сервис возвратит число остановок потока, но не возвратит более подробную информацию о потоке, типо находится ли он в ожидании на обьекте и тп., но если этот сервис вызвать для завершённого потока он возвратит STATUS_THREAD_IS_TERMINATING, что может использоватьсо для определения завершен ли поток.
Clerk, а для чекания - заморожен ли поток придумал один глупый но действенный метод.. Открыть поток, и в цикле разморозить.. Код (Text): invoke ZwResumeThread,ThreadHandle,addr ThreadStatus Если поток был заморожен - ThreadStatus вернет 1