Принудительное завершение процесса
Рано или поздно в программистской практике возникает задача по управлению процессами, в частности их принудительного завершения. Для дочерних процессов, порожденных собственным приложением, обычно хватает вызова TerminateProcess, но в некоторых случаях требуется принудительно завершить чужой процесс. Зная идентификатор процесса сделать это не составит большого труда. Открываем процесс функцией OpenProcess с правами PROCESS_TERMINATE, а затем, в случае успеха, отдаем полученный хэндл функции TerminateProcess. Вроде бы все просто, но не тут-то было. При попытке открыть некоторые процессы, как правило системные, возвращается ошибка ERROR_ACCESS_DENIED. Это связано с тем, что дескрипторы безопасности системных процессов блокируют такой доступ для всех пользователей, включая Администраторов. Чтобы обойти запрет, требуется поднять привилегии нашего процесса, а именно получить привилегию отладчика SE_DEBUG_NAME. Как повышать привилегии процесса в системе я уже писал. Напомню только, что необходимые структуры и константы в FASM отсутствуют и их придется определить самостоятельно.Code (Assembler) : Убрать нумерацию
- ; Константы для работы привилегиями
- TOKEN_ADJUST_PRIVILEGES = 20h
- TOKEN_QUERY = 8h
- SE_PRIVILEGE_ENABLED = 2h
- ; Структуры для работы привилегиями
- struct LUID
- lowPart dd ?
- HighPart dd ?
- ends
- struct LUID_AND_ATTRIBUTES
- pLuid LUID
- Attributes dd ?
- ends
- struct _TOKEN_PRIVILEGES
- PrivilegeCount dd ?
- Privileges LUID_AND_ATTRIBUTES
- ends
Code (Assembler) : Убрать нумерацию
- invoke GetCurrentProcess
- invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,TTokenHd
- ; Получить привилегии процесса
- invoke LookupPrivilegeValue,NULL,SE_DEBUG_NAME,udtLUID
- ; Повысить привилегии процесса
- mov [tkp.PrivilegeCount],1
- mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED
- mov eax,[udtLUID.lowPart]
- mov [tkp.Privileges.pLuid.lowPart],eax
- mov eax,[udtLUID.HighPart]
- mov [tkp.Privileges.pLuid.HighPart],eax
- invoke AdjustTokenPrivileges,[TTokenHd],0,tkp,0,0,0
Усложним задачу. Предположим, что нам надо завершать не только произвольный процесс, но также и все процессы, порожденные им и его дочерними процессами. То есть нам надо обработать дерево процессов. Воспользуемся функцией CreateToolhelp32Snapshot для получения списка процессов, а затем переберем их по очереди и завершим все процессы, идентификатор родительского процесса которых равняется идентификатору убиваемого процесса. Но это только первый уровень, значит придется вызывать функцию завершения рекурсивно, указывая в качестве параметра идентификаторы дочерних процессов. Вот что у меня получилось:
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------
- ; Рекурсивная функция завершения дерева процессов
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;------------------------------------------------------
- ; Параметры:
- ; pID - идентификатор процесса
- ; recursive - завершать дочерние процессы (TRUE/FALSE)
- ;------------------------------------------------------
- proc KillProcess pID:DWORD, recursive:DWORD
- ; Сохранить регистры
- pusha
- ; Требуется рекурсивный поиск?
- cmp [recursive],TRUE
- jne .kill_process
- ; Снимок процессов системы
- invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
- mov ebx,eax
- ; Перебрать в цикле все процессы
- mov [ProcEntry.dwSize],sizeof.PROCESSENTRY32
- invoke Process32First,ebx,ProcEntry
- .check_process:
- ; Ничего не найдено?
- cmp eax,FALSE
- je .stop_scan
- ; Это дочерний процесс от убиваемого?
- mov eax,[ProcEntry.th32ParentProcessID]
- cmp eax,[pID]
- jne .next_process
- ; Рекурсивно убить дочерний процесс
- stdcall KillProcess,[ProcEntry.th32ProcessID],[recursive]
- .next_process:
- ; Следующий процесс
- invoke Process32Next,ebx,ProcEntry
- jmp .check_process
- .stop_scan:
- ; Закрыть хэндл
- invoke CloseHandle,ebx
- .kill_process:
- ; Самоубийством не занимаемся
- invoke GetCurrentProcessId
- cmp eax,[pID]
- je @f
- ; Убить заказанный процесс
- invoke OpenProcess,PROCESS_TERMINATE,FALSE,[pID]
- or eax,eax
- jz @f
- invoke TerminateProcess,eax,0
- @@:
- ; Востановить регистры
- popa
- ret
- endp
В приложении несколько программ, запускающих друг друга для создания дерева процессов, а также программа, принудительно завершающая выбранный процесс вместе с его дочерними процессами.
Просмотров: 8418 | Комментариев: 18
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(24.03.2014 в 17:57):
А взять и подумать? Программа НЕ МОЖЕТ ПОЛУЧАТЬ ПРАВА АДМИНА по своему желанию. И никто никогда этого не разрешит сделать.
Андрей
(24.03.2014 в 17:55):
Уважаемый ManHunter, хочу спросить вашего совета по поводу прав на изменение (коррекцию) времени на системе Windows 7. Пытаясь самостоятельно освоить ассемблер, в качестве цели выбрал задачу по контролю времени работы компьютера моего сына. В качестве усложнения поставленной задачи разрешил ему всячески её "обходить". На сегодняшний день ситуация следующая - моя программа умеет выключать компьютер по таймеру. Он практически сразу догадался сдвигать часы. Я это могу фиксировать запросом времени из интернета, однако для коррекции системных часов у меня не хватает прав. Вернее если своей программе в свойствах файла я задаю права администратора, то коррекция происходит. Программно это сделать не получается. За основу брал Ваш код повышения прав доступа с привилегиями
;SE_SHUTDOWN_NAME db 'SeShutdownPrivilege',0
;SE_SYSTEMTIME_NAME db 'SeSystemtimePrivilege',0
;SE_DEBUG_NAME db 'SeDebugPrivilege',0
подставляя их поочерёдно. Но ничего путного из этого не получилось. Если у вас найдётся минута свободного времени не сочтите за труд подскажите в каком направлении мне думать. Спасибо.
;SE_SHUTDOWN_NAME db 'SeShutdownPrivilege',0
;SE_SYSTEMTIME_NAME db 'SeSystemtimePrivilege',0
;SE_DEBUG_NAME db 'SeDebugPrivilege',0
подставляя их поочерёдно. Но ничего путного из этого не получилось. Если у вас найдётся минута свободного времени не сочтите за труд подскажите в каком направлении мне думать. Спасибо.
Андрей
(24.03.2014 в 17:22):
Огромное спасибо за Ваш энтузиазм. Без сайтов подобных Вашему вряд ли смог бы продвинуться в изучении ассемблера намного дальше нежели "Привет мир"
Semiono
(26.10.2011 в 19:40):
Здравствуйте. А можно ли выгружать зависшие DLL ?
Я видел Unlocker, но от графических утилит практической пользы мало.
Я видел Unlocker, но от графических утилит практической пользы мало.
Евлампий
(26.09.2011 в 19:22):
приветствую
запустил прогу под обычным юзером
процессы админа ей не по зубам - ну это правильно
если бы привелегии(свои) с обычного юзера до админа поднимала вот
было бы круто
удачи
запустил прогу под обычным юзером
процессы админа ей не по зубам - ну это правильно
если бы привелегии(свои) с обычного юзера до админа поднимала вот
было бы круто
удачи
bigcatwar
(29.08.2011 в 22:58):
ManHunter и если можно допиши о таких процессах которые не могут быть удалены даже из сафе мода serija cvhost
morgot
(23.08.2011 в 00:39):
Спасибо, вещь актуальная.
Nutscracker
(22.08.2011 в 19:25):
ManHunter, спасибо!
ManHunter
(22.08.2011 в 10:44):
Про антируткиты я лучше что-нибудь отдельное напишу, тут тема совсем не про это.
Vito
(22.08.2011 в 10:41):
А что вы можете сказать про XueTr?
ManHunter
(22.08.2011 в 08:40):
Nutscracker, вот тут самый свежий: http://rghost.ru/18826521
Nutscracker
(22.08.2011 в 01:40):
> RkUnhooker
Что-то я только http://forum.sysinternals.com/...37300509.rar нашел. Под семеркой, увы, не стартует: "Error loading driver, NTSTATUS code: C0000001".
И закрытую тему: http://www.kernelmode.info/for...rt=150#p6016
В теме значится более новая версия, но ссылок не видать.
Что-то я только http://forum.sysinternals.com/...37300509.rar нашел. Под семеркой, увы, не стартует: "Error loading driver, NTSTATUS code: C0000001".
И закрытую тему: http://www.kernelmode.info/for...rt=150#p6016
В теме значится более новая версия, но ссылок не видать.
ManHunter
(21.08.2011 в 22:11):
RkUnhooker хорошо справляется с такими задачами. Но там вроде это делается через дров.
Isaev
(21.08.2011 в 18:19):
Nutscracker, Unlocker то помогает, потому и понятно, что это возможно
Только программно как того же эффекта достичь, вот в чём вопрос!
Только программно как того же эффекта достичь, вот в чём вопрос!
Nutscracker
(21.08.2011 в 01:08):
Isaev, а Unlocker http://www.emptyloop.com/unlocker/ или копирование в карантин в AVZ http://www.z-oleg.com/secur/avz/ не помогают?
Isaev
(20.08.2011 в 16:02):
А как на счёт копирования файла занятого неубиваемым процессом? На васме читал статью про 3 способа, но как-то ничего не прокатило... Нет наработок в этом направлении?
Юзер
(20.08.2011 в 04:08):
Спасибо. Добавить бы одну фичу: принудительное завершение всех зависших процессов по нажатию одной кнопки и утиль стала бы на редкость полезной. А если бы такую команду можно было подавать через ком.строку, или/и по нажатию настраиваемых горячих клавиш... дайте мне губозакаталку :)
Добавить комментарий
Заполните форму для добавления комментария
"Все, теперь у нас есть доступ ко всем процессам, включая сервисы и системные приложения." с последующей возможностью их убиения. А скорректировать время я не могу.