注意:我已经在 super 用户上以类似的格式问过这个问题,但它似乎更适合这里。 它当然也与编程有关,因为它涉及 Win32 API 的一部分、一般的 Windows 和进程管理。
所以有些进程不能用 taskkill
终止 - 一般是系统进程。但也有,例如我的反病毒程序,它使自己“无法终止”。
如何在windows下访问和主要终止系统进程? (Microsoft 的 kill.exe 不起作用)
防病毒程序等进程如何保护自己?那你怎么能把它们关掉呢?
最佳答案
您将需要 API Hook 来防止您的进程终止。 API Hook 并不容易,因为它需要系统范围的 dll 注入(inject)和内存编辑或设备驱动程序。阅读this得到一个想法。
幸运的是,那里有现有的库,比如 this一个,不幸的是,我认为它现在是共享软件。我还找到了this ,您可能可以在 Google 上找到更多免费软件。
要回答您的第一个问题,终止系统进程相当容易。在 C# 中使用 Process.Kill您可以终止系统进程并导致蓝屏的方法如果从 Windows 系统服务执行此操作,至少在 Windows 7 上是这样(我很难学到这一点...)。使用 TerminateProcess() 进行操作来自服务外部的功能仅在您启用某些权限时才有效:http://www.codase.com/search/call?name=AdjustTokenPrivileges - 如果我没记错的话,您需要启用 SE_DEBUG_NAME。
要关闭防病毒软件,他们通常有一个菜单:)。要强制终止它们,您必须使用它们不 Hook 的终止方法。 This page描述了很多。
这是一个可以终止您想要的进程的示例,假设使用的 API 函数没有被 Hook 。 除非您知道自己在做什么,否则不要运行它,因为它可能会导致蓝屏!
#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);
}
关于Windows和系统进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443509/