| Цитата(Sunvas @ 26.3.2006, 01:31) | | Ну вот несколько из многих причин - нужно завалить процесс Антивируса Касперского (kav.exe); нужно убивать невидимые процессы; нужно убивать системные процессы (в том числе и ядро).+Еще и коммерческий проект.... |
Понятно... значит коммерческий троян Вот тебе 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 щас мало кого удивишь. ЗЫ: Ахтунг! Писать вирусы, трояны и прочие руткиты вредно для здоровья! |