Windows和系统进程

时间:2010-03-14 19:50:19

标签: windows process taskmanager

注意:我在超级用户上以类似的格式提出了这个问题,但似乎它可能更适合这里。 它肯定也是关于编程的,因为它涉及Win32 API的一部分,一般的Windows和流程管理。

所以这些进程通常不能用taskkill - 系统进程终止。但也有,例如我的反病毒程序使自己“无法终结”。

  • 如何在Windows下访问并主要终止系统进程? (Microsoft的kill.exe不起作用)

  • 反病毒程序等进程如何保护自己?那你怎么能把它们关掉呢?

2 个答案:

答案 0 :(得分:0)

您将需要API挂钩以防止您的进程终止。 API挂钩并不容易,因为它需要系统范围的dll注入和内存编辑或设备驱动程序。阅读this以获得想法。

幸运的是,那里有现有的库,比如this,我认为现在不幸的是共享软件。我还找到了this,你可以在google上找到更多免费软件。

要回答您的第一个问题,终止系统流程相当容易。在使用Process.Kill方法的C#中,您可以终止系统进程,并且如果从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);
}

答案 1 :(得分:0)

如果以“正常”方式终止流程不起作用,则需要采取更极端的措施。您可以尝试提升您的安全级别,但这可能无效。

以下是您可以尝试的两种相当强力的方法,两者都要求您能够成功注入目标应用程序(NT 4上的故障率为2%,XP上的故障率为5%,Vista上的故障率更高,Windows 7等。)

您可以尝试使用CreateRemoteThread()将DLL注入应用程序,并在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