注意:我在超级用户上以类似的格式问过这个问题,但它似乎更适合这里。它肯定也与编程有关,因为它涉及 Win32 API 的一部分、一般的 Windows 和进程管理。
因此,这些进程通常无法终止taskkill
- 系统进程。但也有,例如我的反病毒程序,它使自己“无法终止”。
windows下如何访问和主要终止系统进程?(Microsoft 的 kill.exe 不起作用)
防病毒程序等进程如何保护自己?那你怎么能再把它们关掉呢?
注意:我在超级用户上以类似的格式问过这个问题,但它似乎更适合这里。它肯定也与编程有关,因为它涉及 Win32 API 的一部分、一般的 Windows 和进程管理。
因此,这些进程通常无法终止taskkill
- 系统进程。但也有,例如我的反病毒程序,它使自己“无法终止”。
windows下如何访问和主要终止系统进程?(Microsoft 的 kill.exe 不起作用)
防病毒程序等进程如何保护自己?那你怎么能再把它们关掉呢?
您将需要 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);
}
如果以“正常”方式终止进程不起作用,则需要采取更极端的措施。您可以尝试提升您的安全级别,但这可能行不通。
这里有两种相当暴力的方法你可以尝试,都要求你能够成功注入到目标应用程序中(NT 4 失败率 2%,XP 失败率 5%,Vista、Windows 7 失败率更高等) )。
您可以尝试使用 CreateRemoteThread() 将 DLL 注入应用程序,并在注入 DLL 的 DLLMain 中执行以下操作之一:
无效的杀戮应用程序() { 诠释* p; p = 空; __尝试 { *b = 0; } __except(EXCEPTION_EXECUTE_HANDLER) { 杀死应用程序(); } }