Русский / Russian English / Английский

Сейчас на форуме: Medsft (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Софт, инструменты —› Убийство процессов-призраков
Посл.ответ Сообщение

Ранг: 6.6 (гость)
Статус: Участник

Создано: 18 марта 2020 00:35 · Поправил: IOCTL_ New!
Цитата · Личное сообщение · #1

Бывают случаи, когда в памяти остаётся процесс, который штатными средствами винды убить невозможно. Попытка убийства через диспетчер задач выдаёт ошибку доступа, а taskkill пишет:

Ошибка: Не удается завершить процесс с идентификатором 1234.
Причина: Ни один из экземпляров этого задания не запущен.


Если глянуть потоки через procexp, то там либо непонятный пустой поток без опознавательных признаков с TID 0, либо ntdll.dll!RtlUserThreadStart и какой-то вменяемый TID. Кто-нибудь знает, что это за фигня и чем её грохнуть?


Ранг: 258.5 (наставник)
Статус: Участник

Создано: 18 марта 2020 01:13 New!
Цитата · Личное сообщение · #2

Такие процессы появляются если запустить любой процесс с флагом CREATE_SUSPENDED и после этого не стартануть основной тред. Возможное решение - запустить его, хотя хз надо ли. Лучше разобраться кто их плодит.

Ранг: 4.0 (гость)
Статус: Участник

Создано: 18 марта 2020 01:22 New!
Цитата · Личное сообщение · #3

Бывало такое иногда из-за каких-то сбоев асинхронного доступа к файлам, с тем же uTorrent, например
Может тут CancelIoEx надо использовать, но придется вызывать из того же процесса и знать нужный Handle.

Ранг: 1.4 (гость)
Статус: Участник

Создано: 18 марта 2020 13:32 New!
Цитата · Личное сообщение · #4

через натив их всех в SUSPENDED, потом через NtQuerySystemInformation - отследить, тут были вроде сорцы Process Explorer+ от HiEndSoft

Ранг: 6.6 (гость)
Статус: Участник

Создано: 18 марта 2020 14:34 New!
Цитата · Личное сообщение · #5

А тулза какая-то есть, чтобы грохать процессы нестандартными способами? Ну там через Nt, Zw и т.п. Помню, была какая-то тулза и там были разные кнопки с названиями функций: NtTerminateProcess, ZwTerminateProcess и ещё штук 6 вроде. Ещё помню тулзу, которая через свой драйвер процессы грохала. Есть у кого-то такие тулзы?


Ранг: 86.8 (постоянный)
Статус: Участник

Создано: 18 марта 2020 14:42 · Поправил: Boostyq New!
Цитата · Личное сообщение · #6

IOCTL_ пишет:
А тулза какая-то есть,

Раньше в Process Hacker 2 было куча методов терминации процесса, но большая методов работала только на 32-битных системах, и это убрали в v2.39
Сейчас методы переписали и перенести в отдельный плагин https://github.com/processhacker/plugins-extra/tree/master/TerminatorPlugin
Наверное собранной версии нет, и это нужно компилировать, либо можно просто взять сами методы

| Сообщение посчитали полезным: IOCTL_


Ранг: 6.6 (гость)
Статус: Участник

Создано: 18 марта 2020 14:43 New!
Цитата · Личное сообщение · #7

Нашёл статейко шикарное по этому поводу: 12 ways to terminate a process. Кто-то уже кодил подобное? Как сейчас помню, что где-то такое видел.


Ранг: 86.8 (постоянный)
Статус: Участник

Создано: 18 марта 2020 14:45 New!
Цитата · Личное сообщение · #8

wj32 это и есть Process Hacker -.-"

Ранг: 6.6 (гость)
Статус: Участник

Создано: 18 марта 2020 14:46 New!
Цитата · Личное сообщение · #9

Boostyq
Спасибо! Если ничего не найдётся, то придётся компилить или что-то придумывать. Но я помню, что это уже где-то было.

Добавлено спустя 2 минуты
Boostyq пишет:
wj32 это и есть Process Hacker -.-"

Ага, точно! Семён Семёныч...


Ранг: 103.1 (ветеран)
Статус: Участник

Создано: 18 марта 2020 17:22 New!
Цитата · Личное сообщение · #10

IOCTL_ пишет:
Помню, была какая-то тулза и там были разные кнопки с названиями функций: NtTerminateProcess, ZwTerminateProcess и ещё штук 6 вроде.


Advanced Process Termination (APT), последняя версия 4.2

{ Атач доступен только для участников форума } - APT.4.2.zip

| Сообщение посчитали полезным: IOCTL_


Ранг: 6.6 (гость)
Статус: Участник

Создано: 18 марта 2020 18:14 New!
Цитата · Личное сообщение · #11

ManHunter пишет:
Advanced Process Termination (APT), последняя версия 4.2

Ух ты! Кнопочки! Благодарствую!

Ранг: 4.2 (гость)
Статус: Участник

Создано: 18 марта 2020 19:35 New!
Цитата · Личное сообщение · #12

https://randomascii.wordpress.com/2018/02/11/zombie-processes-are-eating-your-memory/

Можно попробовать вот эту технику: https://scorpiosoftware.net/2020/03/15/how-can-i-close-a-handle-in-another-process/, но если я не ошибаюсь, вызов NtDuplicateObject вернет ошибку STATUS_PROCESS_IS_TERMINATING.


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 18 марта 2020 19:50 · Поправил: difexacaw New!
Цитата · Личное сообщение · #13

Процессы так висли из за каких то глобальных синхронизаций в ядре на младших версиях. Прибить такие процессы можно только ресетив ядро. Антируткиты киляют процессы и что толку если висяк в ядре.

f13nd

> Такие процессы появляются если запустить любой процесс с флагом CREATE_SUSPENDED и после этого не стартануть основной тред.

Может пример будет, а то у меня завершается. Впрочем оно и не может не завершаться, так как все блокировки свободны. Помню глючило на NtSuspendProcess/NtResumeThread.. хотя это можно потестить.

Теоретически если послать останов поточный и тормознуть такой поток(race), то может что и подвиснет

Ранг: 19.1 (новичок)
Статус: Участник

Создано: 18 марта 2020 21:52 New!
Цитата · Личное сообщение · #14

difexacaw пишет:
Может пример будет

Наверное имелось ввиду NtCreateProcess с флагом PROCESS_CREATE_FLAGS_SUSPENDED (0x00000200)
Если вызвать этот сервис, и дальше ничего не делать с созданным хендлом (не создавать маин поток, не уведомлять csrss и т.д.), а просто закрыть приложение, то хендл так и останется в ядре.
Такой хендл Диспетчер задач не увидит, но он будет виден например в x64dbg, при этом, насколько помню, отладчик не сможет его закрыть.


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 18 марта 2020 23:33 · Поправил: difexacaw New!
Цитата · Личное сообщение · #15

dezmand07

> просто закрыть приложение, то хендл так и останется в ядре.

Вся таблица описателей уничтожается при завершении процесса. Интерналс чтоле почитай для начала.

Ранг: 6.6 (гость)
Статус: Участник

Создано: 19 марта 2020 01:59 · Поправил: IOCTL_ New!
Цитата · Личное сообщение · #16

В общем, поигрался я с вышеуказанными тулзами, перепробовал всё, что можно, включая "опасный" режим TT4 из Process Hacker 2.38, но процесс продолжает висеть. Модулей нет, хэндлов нет, трэдов нет, PID - есть

Cancel I/O не помог.

Добавлено спустя 18 минут
Под занавес попытался убить процесс стандартным способом через PH, т.к. APT его больше не видит. Написало ошибку: Попытка доступа к процессу, выполняющему процедуру завершения. Возникает философский вопрос: можно ли завершить завершающийся процесс?


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 19 марта 2020 19:31 New!
Цитата · Личное сообщение · #17

IOCTL_

> Попытка доступа к процессу, выполняющему процедуру завершения.

Необходимы подробности, откуда эта инфа. Тоесть это либо сервисный статус STATUS_PROCESS_IS_TERMINATING, либо значение из PS_BASIC_INFO.ExitStatus != STATUS_PENDING(статус последнего треда, а если у него STATUS_PENDING что тогда..), либо косвенная инфа по маркерам(PS_PROCESS_FLAGS_PROCESS_DELETE).

Code:
  1.     PspLockProcessExclusive (Process, Thread);
  2.  
  3.     //
  4.     // Say one less active thread. If we are the last then block creates and wait for the other threads to exit.
  5.     //
  6.     Process->ActiveThreads--;
  7.     if (Process->ActiveThreads == 0) {
  8.         PS_SET_BITS (&Process->Flags, PS_PROCESS_FLAGS_PROCESS_DELETE);
  9.  
  10.         LastThread = TRUE;
  11.         if (ExitStatus == STATUS_THREAD_IS_TERMINATING) {
  12.             if (Process->ExitStatus == STATUS_PENDING) {
  13.                 Process->ExitStatus = Process->LastThreadExitStatus;
  14.             }
  15.         } else {
  16.             Process->ExitStatus = ExitStatus;
  17.         }

Ранг: 4.2 (гость)
Статус: Участник

Создано: 20 марта 2020 03:49 · Поправил: hiddy New!
Цитата · Личное сообщение · #18

difexacaw, тестил на userinit.exe, потому что он всегда висит на 10 винде. Можно получить доступ 0x1fffff (Full control) к процессу, если есть права, вызовы NtDuplicateObject, NtTerminateProcess итд возвращают STATUS_PROCESS_IS_TERMINATING, но при этом счетчик ссылок уменьшается на 1, если счетчик меньше 21, то ядро устанавливает значение 32771. Интересный факт, можно создать дочерний процесс через NtCreateUserProcess, передав хэндл с правами PROCESS_CREATE_PROCESS. Вот здесь еще пару слов на эту тему: https://youtu.be/dB3seu4o24A?t=2089


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 20 марта 2020 19:15 New!
Цитата · Личное сообщение · #19

hiddy

Используется блокировка на 10 ExfAcquireRundownProtection(), на 5 ExAcquireRundownProtection().

В 10-ке ссылок на неё ~100. Обычно там конструкия:

Code:
  1.     if (ExAcquireRundownProtection (&ProcessToLock->RundownProtect) == FALSE) {
  2.         return STATUS_PROCESS_IS_TERMINATING;
  3.     }


Если бегло глянуть, то эта синхронизация крутит цикл. До этого не поднимается IRQL для запрета ядерной APC. Тоесть можно тормознуть поток и любой иной будет крутится до разморозки первого, конечно нужно подробно посмотреть на реализацию блокировки. Почему блокировка не освободилась - можно лишь гадать. Баг какой то в ядре. Если он повторяется стабильно, то можно попытаться разобраться без отладки.

Ранг: 4.6 (гость)
Статус: Участник

Создано: 21 марта 2020 14:09 New!
Цитата · Личное сообщение · #20

Как вариант можно, перезапустить Проводник (explorer.exe) через Диспетчер задач, еще можно попробовать Выйти из системы потом снова зайти и проверить, поискать в гугле утилиты и попробовать их в работе может какая-то из них справится с задачей, перезагрузка ПК крайний случай.


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 21 марта 2020 14:12 New!
Цитата · Личное сообщение · #21

stronglogic

Если ядро повисло то никакие танцы с бубном не помогут
 eXeL@B —› Софт, инструменты —› Убийство процессов-призраков

Видеокурс ВЗЛОМ