2

注意:我在超级用户上以类似的格式问过这个问题,但它似乎更适合这里。它肯定也与编程有关,因为它涉及 Win32 API 的一部分、一般的 Windows 和进程管理。

因此,这些进程通常无法终止taskkill- 系统进程。但也有,例如我的反病毒程序,它使自己“无法终止”。

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

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

4

2 回答 2

0

您将需要 API 挂钩来保护您的进程不被终止。API 挂钩并不容易,因为它需要系统范围的 dll 注入和内存编辑或设备驱动程序。阅读这篇文章以获得一个想法。

幸运的是,那里有现有的库,比如这个,不幸的是我认为它现在是共享软件。我也找到了这个,你可能可以在 google 上找到更多免费软件的东西。

要回答您的第一个问题,终止系统进程相当容易。在使用Process.Kill方法的 C# 中,如果从 Windows 系统服务执行此操作,您可以终止系统进程并导致蓝屏,至少在 Windows 7 上是这样(我很难学会这一点......)。仅当您启用某些权限时,使用服务外部的TerminateProcess()函数才有效:http: //www.codase.com/search/call ?name= AdjustTokenPrivileges - 如果我没记错的话,您需要启用 SE_DEBUG_NAME .

要关闭你的杀毒软件,好吧,他们通常有一个菜单:)。要强制终止它们,您必须使用它们不会挂钩的终止方法。这个页面描述了很多。

这是一个可以终止您想要的进程的示例,假设使用的 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);
}
于 2010-03-14T20:21:26.683 回答
0

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

这里有两种相当暴力的方法你可以尝试,都要求你能够成功注入到目标应用程序中(NT 4 失败率 2%,XP 失败率 5%,Vista、Windows 7 失败率更高等) )。

您可以尝试使用 CreateRemoteThread() 将 DLL 注入应用程序,并在注入 DLL 的 DLLMain 中执行以下操作之一:

  • 调用 ExitProcess(exitCode);
  • 注册一个异常处理程序,然后引发一个异常,您将使用异常处理程序捕获该异常。在您的异常处理程序中导致另一个异常(和/或 stackoverflow)。异常处理期间的异常将导致程序即时死亡。
无效的杀戮应用程序()
{
    诠释* p;

    p = 空;

    __尝试
    {
            *b = 0;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        杀死应用程序();
    }
}

大量关于使用 CreateRemoteThread 注入的文章

于 2010-03-29T21:09:36.683 回答