2010-03-14 2 views
2

Примечание. Я задал этот вопрос в аналогичном формате на суперпользователе, но похоже, что он может быть лучше здесь. Это определенно также касается программирования, поскольку это касается частей Win32 API, Windows в целом и управления процессами.Windows и системные процессы

Таким образом, существуют такие процессы, которые не могут быть завершены с помощью taskkill - системных процессов в целом. Но есть, например, моя программа Anti Virus, которая делает себя «unterminateable».

  • Как я могу получить доступ и в основном завершить системные процессы под окнами? (kill.exe от Microsoft не работает)

  • Как защищаются сами процессы, такие как антивирусные программы? Как вы можете снова отключить их?

+0

Я думаю, что никто не собирается отвечать на этот вопрос. :) Может быть, хакер будет ... О, я имею в виду антивирусную часть ... –

+0

Для меня это кажется очень важной вещью, которую нужно знать каждому программисту, связанному с Windows API, - почему только хакеры могут) ответьте на это? – jemper

+0

Leniel: Ах, я вижу :) – jemper

ответ

0

Вам понадобится подключение API для защиты вашего процесса от прекращения. Захват API нелегкий, поскольку для него требуется либо встраивание инсталляции DLL, либо редактирование памяти, либо драйвер устройства. Прочитайте this, чтобы получить представление об этом.

К счастью, существуют существующие библиотеки, такие как this, к сожалению, я считаю это shareware. Я также нашел this, и вы, вероятно, можете найти более бесплатные материалы в Google.

Чтобы ответить на ваш первый вопрос, завершение системных процессов довольно просто. В C#, используя метод Process.Kill, вы можете завершить системные процессы и вызвать синий экран , если сделать это с помощью системной службы Windows, по крайней мере, на Windows 7 (я узнал это нелегко ...). Выполнение этой функции с помощью функции TerminateProcess() извне службы будет работать только при включении определенных разрешений: http://www.codase.com/search/call?name=AdjustTokenPrivileges - если я не ошибаюсь, вам нужно включить SE_DEBUG_NAME.

Чтобы отключить антивирус, у них обычно есть меню для этого :). Чтобы принудительно их закончить, вам придется использовать метод завершения, который они не подключают. This page описывает много.

Вот пример, который может привести к прекращению процессов, которые вы хотите, предполагая, что используемые функции API не подключены. НЕ ИСПОЛЬЗУЙТЕ ЭТО, ЕСЛИ ВЫ НЕ ЗНАЕТЕ, ЧТО ВЫ ДЕЛАЕТЕ, ЧТО ВЫ МОЖЕТЕ ПРИВЕСТИ К СИНИЙ ЭКРАН!

#include <stdio.h> 
#include <windows.h> 
#include <process.h> 
#include <iostream> 

using namespace std; 

int EnablePrivilege(const char * lpPrivilegeName, BOOL bEnable) 
{ 
    TOKEN_PRIVILEGES Privileges; 
    ZeroMemory(&Privileges, sizeof(Privileges)); 

    HANDLE hToken; 
    BOOL bResult; 

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
     return 1; 
    Privileges.PrivilegeCount = 1; 
    Privileges.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0; 
    if (!LookupPrivilegeValue(NULL, lpPrivilegeName, 
           &Privileges.Privileges[0].Luid)) 
    { 


     CloseHandle(hToken); 
     return 2; 
    } 
    bResult = AdjustTokenPrivileges(hToken, FALSE, &Privileges, sizeof(Privileges), NULL, NULL); 
    CloseHandle(hToken); 
    return bResult; 
} 

int main() 
{ 
    cout << EnablePrivilege(SE_DEBUG_NAME, TRUE); 

    HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 500); // replace 500 with the PID of the process you want to terminate - can be taken from taskmanager. 

    TerminateProcess(procHandle, 0); 

    CloseHandle(procHandle); 
} 
+0

Существует проблема с упомянутой выше функцией TerminateProcess: вам снова нужны права убить ее (это то, что она говорит по msdn). – jemper

+0

Спасибо, мне было бы трудно понять это без вашей помощи. Кто-то повысит это, я пока не могу. – jemper

0

Если завершение процесса, «нормальный» способ не работает, то более крайние меры необходимы. Вы можете попробовать повысить уровень безопасности, но это может не сработать.

Вот два метода грубой силы, которые вы можете попробовать, чтобы вы могли успешно вводить в целевое приложение (2% отказов на NT 4, 5% отказов на XP, более высокий уровень сбоев в Vista, Windows 7 и т. Д.).

Вы можете попробовать нагнетание DLL в приложение с помощью CreateRemoteThread() и в DLLMain для инъекции DLL выполните одно из следующих действий:

  • Вызов ExitProcess (ExitCode);
  • Зарегистрируйте обработчик исключений, затем создайте исключение, которое вы поймаете с помощью обработчика исключений. В обработчике исключений возникает другое исключение (и/или stackoverflow).Исключение во время обработки исключений приведет к мгновенной смерти программы.
 
void KillApp() 
{ 
    int *p; 

    p = NULL; 

    __try 
    { 
      *b = 0; 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) 
    { 
     killApp(); 
    } 
} 

Plenty of articles on injecting using CreateRemoteThread

Смежные вопросы