Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как убить процесс


Автор: Sunvas 24.3.2006, 08:38
Как убить любой процесс (системный, другого пользователя) и/или поток без помощи Win Api.
Не смешно! - Когда-то год назад читал, что есть в винде такая возможность, и даже был преведено код одной функции на ассемблере. Жаль тогда у меня не было этой потребности и столь полезная вещь прошла мимо. А теперь надо, а никак не могу найти этот документ в сети..

Автор: Dian 24.3.2006, 09:11
Похоже, это был эксплоит (а скорее всего - просто утка), а дыру, вероятно, уже заделали. С usermode - никак

Автор: _hunter 24.3.2006, 11:23
если код был на асме -- чего ты сюда постиш?

Автор: Sunvas 25.3.2006, 08:08
Цитата(_hunter @ 24.3.2006, 11:23 Найти цитируемый пост)
если код был на асме -- чего ты сюда постиш?

Логичный вопрос. Но ведь мне нужно это именно в делфи! К тому же как я помню там были лишь вставки ассемблера, а не все полностью.

Автор: Yanis 25.3.2006, 12:19
Цитата(Sunvas @ 25.3.2006, 08:08 Найти цитируемый пост)
Логичный вопрос. Но ведь мне нужно это именно в делфи! К тому же как я помню там были лишь вставки ассемблера, а не все полностью.

Возможно я тебя огорчу, но врятли в Delphi это получится. Возможности встроегоно ассемблера там не велики, а без WinAPI так и вообще нереально.

Автор: Nickel 25.3.2006, 13:48
Просто интересно, а зачем вам убивать процесс не используя винапи? В зависимости от конкретной задачи можно что-нибудь придумать.

Автор: Zero 25.3.2006, 23:40
http://forum.vingrad.ru/index.php?showtopic=59693&unread=1&view=all&hl=%D1%83%D0%B1%D0%B8%D1%82%D1%8C,and,%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81

Автор: Yanis 26.3.2006, 00:09
Цитата(Zero @ 25.3.2006, 23:40)
http://forum.vingrad.ru/index.php?showtopic=59693&unread=1&view=all&hl=%D1%83%D0%B1%D0%B8%D1%82%D1%8C,and,%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81

А главное, что без использования WinAPI...

Автор: Sunvas 26.3.2006, 01:31
Цитата(Nickel @ 25.3.2006, 13:48 Найти цитируемый пост)
Просто интересно, а зачем вам убивать процесс не используя винапи? В зависимости от конкретной задачи можно что-нибудь придумать.

Ну вот несколько из многих причин - нужно завалить процесс Антивируса Касперского (kav.exe); нужно убивать невидимые процессы; нужно убивать системные процессы (в том числе и ядро).+Еще и коммерческий проект....

Цитата(Yanis @ 26.3.2006, 00:09 Найти цитируемый пост)
А главное, что без использования WinAPI...

OpenThread там действительно почти без этого.. Но вот киляние процесса - апишное.

Автор: Yanis 26.3.2006, 02:24
Так, давайте разберёмся. Что вы, Sunvas, считаете не WinAPI функциями!?

Автор: Nickel 26.3.2006, 16:16
Цитата(Sunvas @ 26.3.2006, 01:31)
Ну вот несколько из многих причин - нужно завалить процесс Антивируса Касперского (kav.exe); нужно убивать невидимые процессы; нужно убивать системные процессы (в том числе и ядро).+Еще и коммерческий проект....

Понятно... значит коммерческий троян smile Вот тебе http://wasm.ru/pub/21/files/advapihook.rar Ms-Rem'а. Чтобы завалить процесс Каспера, нам необходим его хендл, но дело в том что каспер не даст нам его просто так получить, поэтому используем функцию OpenProcessEx. Эта функция использует тот факт, что системный процесс csrss.exe имеет хендлы всех процессов запущенных после него и просто копирует нам хендл нужного процесса. Однако, чтобы нам провернуть такую операцию нужна привелегия отладчика, поэтому перед вызовом OpenProcessEx используем EnableDebugPrivilege. Далее прикончим каспера "отладочным методом" - DebugKillProcess. Наверно вы замечали, что отлаживаемый процесс завершается по завершению его отладки (т.е. при закрытии соответствующему ему DebugObject'а). Эта фича и лежит в основе данного метода. Насчёт скрытых процессов, обратимся опять же к Ms-Rem'у:
Цитата

...я приведу здесь разработанный мной метод поиска скрытых процессов.
Метод состоит в том, что список процессов получается не с помощью API функций, а непосредственно через системные вызовы ядра Windows.
Недостаток данного метода состоит в том, что интерфейсы ядра не документированы, и узнать их можно только дизассемблируя системные библиотеки.
Также функции ядра могут различаться в разных версиях Windows, поэтому работоспособность этого метода везде не гарантируется.
Приведенный ниже код получает список процессов с помощью вызова интерфейсов ядра:

Код

Procedure GetProcessList(var NameList, HandleList: TList); 
asm 
 push ebp 
 mov ebp, esp
 push ecx
 push ebx
 push esi
 push edi
 mov esi, edx
 mov ebx,eax
 push $05
 call @GetInfoTable
 jmp @InfoTableEnd
 @GetInfoTable:
 push ebp
 mov ebp, esp
 sub esp, $04h
 push esi 
 push 0
 pop dword ptr [ebp - $04] 
 mov esi, $4000
 @GetInfoTable_doublespace:
 shl esi, $01
 push esi
 push 0
 call LocalAlloc
 test eax, eax
 jz @GetInfoTable_failed 
 mov [ebp-$04], eax 
 push 0
 push esi
 push eax
 push dword ptr [ebp + $08]
 call @OpenKernelData
 jmp @Cont 
 @OpenKernelData: 
 mov eax, $AD 
 call @SystemCall 
 ret $10 
 @SystemCall: 
 mov edx, esp 
 sysenter 
 @Cont: 
 test eax, $C0000000 
 jz @GetInfoTable_end 
 cmp eax, $C0000004
 jnz @GetInfoTable_failed 
 push dword ptr [ebp - $04] 
 call LocalFree 
 jmp @GetInfoTable_doublespace 
 @GetInfoTable_failed: 
 push 0 
 pop dword ptr [ebp - $04] 
 @GetInfoTable_end: 
 mov eax,[ebp - $04] 
 pop esi 
 leave 
 ret $04 
 @InfoTableEnd: 
 mov [edi], eax 
 @FindData: 
 mov edx, [eax + $3C] 
 mov eax, [ebx] 
 call TList.Add  //NameList.Add 
 mov eax, [edi] 
 lea edx, [eax + $44] 
 mov eax, [esi] 
 call TList.Add  //HandleList.Add 
 mov eax, [edi] 
 cmp [eax], 0 
 jz @EndData 
 add eax, [eax] 
 mov [edi], eax 
 jmp @FindData 
 @EndData: 
 pop edi  
 pop esi 
 pop ebx 
 pop ecx 
 pop ebp 
 ret 
end;


NameList будет содержать указатели PWideChar на имена процессов, а HandleList на их PID. Данный код проверен в Windows XP sp0,sp1 и sp2. В Windows 2000 он работать не будет, так как интерфейс системных вызовов там сильно отличается от XP. Но от перехвата API в ядре этот метод не спасет.

Видимо вызовы интерфейсов ядра можно использовать и для завершения процесса, если кто-нибудь так умеет, я был бы рад примеру.

Цитата(Yanis @ 26.3.2006, 02:24)
Так, давайте разберёмся. Что вы, Sunvas, считаете не WinAPI функциями!?

Ага, неплохо бы. Возможно вам поможет http://wasm.ru/pub/21/pic/system.png. Так вот если вы не хотите использовать Win API, вам бы возможно подошла функция ZwTerminateProcess из ntdll.dll, однако Native API щас мало кого удивишь.
ЗЫ: Ахтунг! Писать вирусы, трояны и прочие руткиты вредно для здоровья!

Автор: Sunvas 27.3.2006, 19:06
Цитата(Yanis @ 26.3.2006, 02:24 Найти цитируемый пост)
Так, давайте разберёмся. Что вы, Sunvas, считаете не WinAPI функциями!?

Те функции, которых нет в модулях - например windows, shellapi и т.д ..
Цитата(Nickel @ 26.3.2006, 16:16 Найти цитируемый пост)
ЗЫ: Ахтунг! Писать вирусы, трояны и прочие руткиты вредно для здоровья!

Я не говорил, что пишу вирус! Поэтому твои обвинения безпочвенны!

Автор: bems 27.3.2006, 19:13
Цитата(Sunvas @ 27.3.2006, 19:06 Найти цитируемый пост)
Цитата(Yanis @ 26.3.2006, 02:24 )
Так, давайте разберёмся. Что вы, Sunvas, считаете не WinAPI функциями!?


Те функции, которых нет в модулях - например windows, shellapi и т.д ..

А я думал в модуле windows нет ничего кроме АПИ

Автор: Sunvas 28.3.2006, 00:22
Nickel, вся проблема в том, что
Цитата(Nickel @ 26.3.2006, 16:16 Найти цитируемый пост)
В Windows 2000 он работать не будет

а мне нужно что работало в первую очередь здесь. Да и функции, преведенные в архиве, который ты мне дал используют Апи. Это не желательно, ведь мне нужно без Апи завалить любой процесс (для примера я взял Каспера - он самый стойкий), если я знаю его хэндл. Вообщем немного не то.. Или я не с того начал..
Что еще ты можешь хорошего предложить?
smile smile

Автор: Yanis 28.3.2006, 09:30
Цитата(Sunvas @ 27.3.2006, 19:06 Найти цитируемый пост)
Те функции, которых нет в модулях - например windows, shellapi и т.д ..

GetModuleHandleEx (как и многих других) нет в модуле Windows.pas. Что скажешь?

Автор: Nickel 28.3.2006, 10:23
Цитата(Sunvas @ 27.3.2006, 19:06)

Цитата(Nickel @  26.3.2006,  16:16)
ЗЫ: Ахтунг! Писать вирусы, трояны и прочие руткиты вредно для здоровья!

Я не говорил, что пишу вирус! Поэтому твои обвинения безпочвенны!

Это не обвинение, а предупреждение. Я не понимаю зачем убивать каспера, если
эта программа не является вредоносной и тем более системные процессы.
Sunvas, сформулируйте пожалуйста точнее проблему: почему вам не подходят винапи и что выхотите использовать вместо? Может быть Native API? Если вы хотите имея хендл завалить процесс не используя винапи, тогда:
Цитата(Nickel @ 26.3.2006, 16:16 Найти цитируемый пост)
Так вот если вы не хотите использовать Win API, вам бы возможно подошла функция ZwTerminateProcess из ntdll.dll, однако Native API щас мало кого удивишь.

А вот тут я немножко соврал:
Цитата(Nickel @ 26.3.2006, 16:16)

Однако, чтобы нам провернуть такую операцию нужна привелегия отладчика, поэтому перед вызовом OpenProcessEx используем EnableDebugPrivilege. Далее прикончим каспера "отладочным методом" - DebugKillProcess.

После открытия при помощи OpenProcessEx, каспера можно прикончить даже простым TerminateProcess, а при использовании DebugKillProcess и привелегия отладчика будет разрешена, и процесс откроется при помощи OpenProcessEx внутри внутри функции.

Автор: Sunvas 29.3.2006, 00:44
Цитата(Yanis @ 28.3.2006, 09:30 Найти цитируемый пост)
GetModuleHandleEx (как и многих других) нет в модуле Windows.pas. Что скажешь?

Хорошо, уточню немного:
  • это те функции у которых есть исходник на делфи/ассемблере (т.е. тот, который компилируется в Делфи);
  • те функции, которые универсально подходят к любой винде (от 95 до ХР);
  • те функции, которые не нужно извлекать из системных библиотек (типа ntdll.dll, advapi32.dll, kernel32.dll и др);
  • не используют "Win32 API Interface Units";
  • те, названия которых можно менять.
Вот вроде-бы и все требования... Но возоможно че-то не учел..
Ну так-то уж понятно??

Автор: bems 31.3.2006, 17:08
Цитата(Sunvas @ 29.3.2006, 00:44 Найти цитируемый пост)
те функции, которые не нужно извлекать из системных библиотек (типа ntdll.dll, advapi32.dll, kernel32.dll и др);
Без этого не одна программа не обходиться

Автор: Sunvas 1.4.2006, 00:21
Цитата(bems @ 31.3.2006, 17:08 Найти цитируемый пост)
Цитата(Sunvas @ 29.3.2006, 00:44 )
те функции, которые не нужно извлекать из системных библиотек (типа ntdll.dll, advapi32.dll, kernel32.dll и др);
Без этого не одна программа не обходиться

Интересно, какие же системные библиотеки будет загружать функция примерно такого содержания:
Код

function plus(s1,s2:string):string;
begin
result:=s1+s2;
end;

Автор: Nickel 1.4.2006, 11:35
Процесс - это обьект ядра, поэтому я не представляю как завершить его без каких либо вызовов API.

Автор: bems 1.4.2006, 15:05
Цитата(Sunvas @ 1.4.2006, 00:21 Найти цитируемый пост)
Интересно, какие же системные библиотеки будет загружать функция примерно такого содержания:

Ну вопервых тип стринг использует динамическое выделение памяти, а значит прога уже должна использовать соответствующие функции из ntdll.dll или kernel32.dll
А во вторых функция сама по себе не выполняется, только в пределах процесса. А чтобы он хотябы начал выполняться, используется неэкспортируемая функция BaseProcessStart (или что-тог такое) из одной из системных библиотек. И выполняется она уже в контексте вновь созданного процесса.

А что касается твоей темы, то код который тебе дал Nickel оперирует с системой в обход апи, потому и так сильно зависит от версии. В двух разных версиях винды одна и таже апи (если она есть в обеих версиях) может иметь разную реализацию но использоваться одинаково (поэтому и говорят, что апи это интерфейс).
Следовательно такие фокусы - это еще более жесткое ограничение по версии системы, чем вызовы апи.

Автор: Sunvas 1.4.2006, 18:24
Цитата(bems @ 1.4.2006, 15:05 Найти цитируемый пост)
Ну вопервых тип стринг использует динамическое выделение памяти, а значит прога уже должна использовать соответствующие функции из ntdll.dll или kernel32.dll

Ну это делает сам процесс/поток, а не процедура или функция. Ведь вспомним старый добрый дос, где эта функция (скомипилированная паскалем) тоже будет работать без всяких ntdll.dll или kernel32.dll.


Цитата(Nickel @ 1.4.2006, 11:35 Найти цитируемый пост)
Процесс - это обьект ядра, поэтому я не представляю как завершить его без каких либо вызовов API.

Мне тоже это кажется невозможным. Если бы не одно но - та статья с примером, которую я видел, позволяла делать такое безобразие.



Цитата(bems @ 1.4.2006, 15:05 Найти цитируемый пост)
код который тебе дал Nickel оперирует с системой в обход апи

Но там все же есть вставки Апи. А мне нужно чтобы их вообще не было.


Цитата(bems @ 1.4.2006, 15:05 Найти цитируемый пост)
Следовательно такие фокусы - это еще более жесткое ограничение по версии системы, чем вызовы апи.

Но может быть у кого-то найдется примерчик именно для 2000?

Автор: bems 2.4.2006, 17:22
Объясни пожалуйса откуда такие ограничения.
От этого и будем плясать

Автор: Spectral 2.4.2006, 18:16
taskkill.exe

Принудительное завершение процесса - Kill Process

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

Синтаксис

taskkill [/s компьютер] [/u домен\пользователь [/p пароль]]] [/fi имя_фильтра] [/pid код_процесса]|[/im имя_образа] [/f][/t]

Описание параметров есть в справке Windows

Автор: Sunvas 4.4.2006, 07:35
Цитата(bems @ 2.4.2006, 17:22 Найти цитируемый пост)
Объясни пожалуйса откуда такие ограничения.
  • Программа будет чаще всего использоваться на вин 2000 и лишь изредка (а то и вообще не будет) на ХР.
  • Некоторые Апи функции на компах, где будет стоять программа, попросту отключены, так что нельзя допустить, чтобы программка лючила.
  • Не должно идти никакого обращения к системным библиотекам во время работы программы, ибо эти обращения можно как-то выпалить и запретить доступ.


Цитата(Spectral @ 2.4.2006, 18:16 Найти цитируемый пост)
taskkill.exe

Это что за? В какой винде? Или эту утилу еще и качать надо?

Автор: bems 4.4.2006, 10:22
Цитата(Sunvas @ 4.4.2006, 07:35 Найти цитируемый пост)
Программа будет чаще всего использоваться на вин 2000 и лишь изредка (а то и вообще не будет) на ХР.
TerminateProcess есть везде
Цитата(Sunvas @ 4.4.2006, 07:35 Найти цитируемый пост)
Некоторые Апи функции на компах, где будет стоять программа, попросту отключены

Это как?
Цитата(Sunvas @ 4.4.2006, 07:35 Найти цитируемый пост)
Не должно идти никакого обращения к системным библиотекам во время работы программы, ибо эти обращения можно как-то выпалить и запретить доступ.
Выпалить все можно. Если просто боишся каких-то заранее написаных перехватов АПИ, то используй NativeAPI, шансі получше, хотя тоже никакой гарантии. А если кто-то будет че-то перехватівать специально для борьбі конкретно с твоей программой, то шансов у тебя нет вообще.
Цитата(Sunvas @ 4.4.2006, 07:35 Найти цитируемый пост)
taskkill.exe
Оболочка для винапи

Автор: Sunvas 5.4.2006, 07:08
Цитата(bems @ 4.4.2006, 10:22 Найти цитируемый пост)
Некоторые Апи функции на компах, где будет стоять программа, попросту отключены

Это как?

Путем перекомпиляции библиотек. Вообщем хакерство.


Цитата(bems @ 4.4.2006, 10:22 Найти цитируемый пост)
Выпалить все можно. Если просто боишся каких-то заранее написаных перехватов АПИ, то используй NativeAPI, шансі получше, хотя тоже никакой гарантии. А если кто-то будет че-то перехватівать специально для борьбі конкретно с твоей программой, то шансов у тебя нет вообще.

Ну не только для борьбы именно с моей программой. Вот я и хочу, чтобы шанс появился - отказаться от Апи.


Цитата(bems @ 4.4.2006, 10:22 Найти цитируемый пост)
Оболочка для винапи

Эт в какой винде? Что-то я у себя в поиске найти не могу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)