注意:我在超级用户上以类似的格式提出了这个问题,但似乎它可能更适合这里。 它肯定也是关于编程的,因为它涉及Win32 API的一部分,一般的Windows和流程管理。
所以这些进程通常不能用taskkill
- 系统进程终止。但也有,例如我的反病毒程序使自己“无法终结”。
如何在Windows下访问并主要终止系统进程? (Microsoft的kill.exe不起作用)
反病毒程序等进程如何保护自己?那你怎么能把它们关掉呢?
答案 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执行以下操作之一:
void KillApp() { int *p; p = NULL; __try { *b = 0; } __except(EXCEPTION_EXECUTE_HANDLER) { killApp(); } }