Совершенно случайно несколько рас удовалось сделать такой процесс который не убивается не диспетчером задач не через rku, сам процесс не нагружает cpu на 100% но давольно интенсивно хавает память. Программа лоадер, проэцирует в память основной модуль игры mu online. Не моя прога, не сама игра драйверы неюзают. При загрузке в игре что-то идет не так, и получается вот такая штука. Фигово что специально эмулировать такую ошибку не удается. Помниться Clerk писал про gdi сервис при юзании которого блокировалась память потока, возможно есть и что-то подобное при юзании которого в цикле не дает завершить процесс. Никому про это ничего не известно?
Наверно это может быть изза блокировки(Process->RundownProtect). Тут описано про отладчик http://j00ru.vexillium.org/?p=118.
В теории следующий код должен захватить блокировку и попытка завершения процесса подвесила бы вызывающий поток: Код (Text): %APIERR macro .if !Eax Int 3 .endif endm %NTERR macro .if Eax Int 3 .endif endm ProcessWow64Information equ 26 .data SynchLock BOOLEAN FALSE RaiseLock BOOLEAN FALSE .code LockRoutine proc UserData:PVOID Local ProcessInformation:ULONG @@: cmp SynchLock,FALSE je @b ; %YIELD invoke ZwQueryInformationProcess, NtCurrentProcess, ProcessWow64Information, addr ProcessInformation, sizeof(ULONG), NULL %NTERR mov SynchLock,FALSE jmp @b ret LockRoutine endp WaitRoutine proc UserData:PVOID Local ProcessInformation:ULONG @@: cmp RaiseLock,FALSE je @b ; %YIELD invoke ZwQueryInformationProcess, NtCurrentProcess, ProcessWow64Information, addr ProcessInformation, sizeof(ULONG), NULL %NTERR mov RaiseLock,FALSE jmp @b ret WaitRoutine endp Entry proc Local WaitThreadId:HANDLE Local LockThreadId:HANDLE Local LockThreadHandle:HANDLE Local WaitThreadHandle:HANDLE Local FreezeCount:ULONG invoke CreateThread, NULL, 0, addr WaitRoutine, 123, 0, addr WaitThreadId mov WaitThreadHandle,eax %APIERR invoke CreateThread, NULL, 0, addr LockRoutine, 123, 0, addr LockThreadId mov LockThreadHandle,eax %APIERR Freeze: mov SynchLock,TRUE invoke ZwSuspendThread, LockThreadHandle, addr FreezeCount %NTERR .if FreezeCount Int 3 .endif ; invoke ZwSuspendThread, WaitThreadHandle, addr FreezeCount ; %NTERR ; .if FreezeCount ; Int 3 ; .endif ; invoke ZwResumeThread, WaitThreadHandle, NULL ; %NTERR mov RaiseLock,TRUE invoke Sleep, 100 ; ms cmp RaiseLock,FALSE je UnFreeze @@: int 3 UnFreeze: invoke ZwResumeThread, LockThreadHandle, NULL %NTERR @@: cmp SynchLock,FALSE jne @b jmp Freeze ret Entry endp Этого не происходит, не понятно почему.
Clerk скинь пожалуйста бинарик, нет возможности собрать, потещу на разных системах. сам пробуеш наверно на 7 с последними апдейтами, а там мож фиксанули
wsd У меня XP. Многие действия выполняются ядром с захваченными блокировками EPROCESS.RundownProtect и ETHREAD.RundownProtect. Это перечисление потоков и пр. Тотже NtResumeProcess(в семпле я использовал ProcessWow64Information) захватывает блокировку и исполняется на нулевом IRQL, при этом можно доставить суспенд-апк, тоесть это атака типо race condition. Тогда после захвата блокировки поток будет остановлен, другой поток попытавшийся захватить блокировку будет ждать её освобождения. Это и происходит при завершении процесса. Позже посмотрю почему не работает, хотя должно.
wsd Спасибо, но пока не нужно. Когда будет рабочий семпл, тогда проверите. Видимо прогноз не верный, так как мне не известен какойто нюанс, тоесть я механизм блокировки знаю не достаточно хорошо.
Тоже как то у меня был случай не "убиваемых " процессов. Вообще программа работала с кучей СОМ портов, и потом в конце работы программы когда она закрывала дексрипторы СОМ порта то на каждые 200-300 закрытий обязательно программа подвисала на CloseHandle(hCOM) . Ее через диспетчер нельзя было снять и через ProcessExplorer(от Русиновича). Если программа была под отладкой то и отладчик вис. Помогала только перезагрузка, или отключение всех устройств от СОМ порта. Я тогда всю вину свел на драйвера... Да и где то тут показывал минимальный код который так себя ведет, но помощи так и не было( . Ага вот он:http://wasm.ru/forum/viewtopic.php?id=32428 Смысл сводится к тому что если открывать/закрывать один СОМ порт то все ок. Когда открываем/закрываем несколько СОМ портов начинаются подвисания ...
wsd Разобрался. Как оказалось вызов для синхронизации ExAcquireRundownProtection (&Process->RundownProtect) абсолютно бесполезен, изза не верной реализации блокировки.
wsd Не нашёл есчо пока способа. Flasher Можите больше инфы дать. Или есчо лучше потрейсить NtTerminateProcess ?