Сейчас на форуме: bartolomeo, -Sanchez-, morgot, sashalogout (+4 невидимых)

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

Ранг: 8.2 (гость), 1thx
Активность: 0.040.03
Статус: Участник

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

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

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


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




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

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

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

-----
2 оттенка серого




Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

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

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



Ранг: 2.3 (гость)
Активность: 0.03=0.03
Статус: Участник

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

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



Ранг: 8.2 (гость), 1thx
Активность: 0.040.03
Статус: Участник

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

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




Ранг: 90.1 (постоянный), 90thx
Активность: 0.290.56
Статус: Участник

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

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

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

-----
В облачке многоточия


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

Ранг: 8.2 (гость), 1thx
Активность: 0.040.03
Статус: Участник

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

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




Ранг: 90.1 (постоянный), 90thx
Активность: 0.290.56
Статус: Участник

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

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

-----
В облачке многоточия




Ранг: 8.2 (гость), 1thx
Активность: 0.040.03
Статус: Участник

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

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

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

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




Ранг: 104.9 (ветеран), 46thx
Активность: 0.040.02
Статус: Участник

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

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


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

b5bc_18.03.2020_EXELAB.rU.tgz - APT.4.2.zip

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

Ранг: 8.2 (гость), 1thx
Активность: 0.040.03
Статус: Участник

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

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

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



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

Создано: 18 марта 2020 19:35
· Личное сообщение · #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.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

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

f13nd

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

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

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

-----
vx




Ранг: 19.5 (новичок), 8thx
Активность: 0.050.08
Статус: Участник

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

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

dezmand07

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

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

-----
vx




Ранг: 8.2 (гость), 1thx
Активность: 0.040.03
Статус: Участник

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

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

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 19 марта 2020 19:31
· Личное сообщение · #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.         }


-----
vx




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

Создано: 20 марта 2020 03:49 · Поправил: hiddy
· Личное сообщение · #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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

hiddy

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

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

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


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

-----
vx




Ранг: 4.6 (гость), 9thx
Активность: 0.010.02
Статус: Участник

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

stronglogic

Если ядро повисло то никакие танцы с бубном не помогут

-----
vx



 eXeL@B —› Софт, инструменты —› Убийство процессов-призраков
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати