注意:我已經以超類用戶的相似格式提出了這個問題,但似乎它可能適合SO更好。 它肯定也是關於編程,因爲它涉及到Win32 API的一部分,一般的Windows和流程管理。Windows和系統進程
所以有這些過程不能用taskkill
終止 - 一般來說系統進程。但也有,例如我的反病毒程序,使自己「無法終止」。
如何在Windows下訪問並主要終止系統進程? (微軟的kill.exe不起作用)
防病毒程序如何保護自己?那麼你怎麼能再把它們關掉呢?
注意:我已經以超類用戶的相似格式提出了這個問題,但似乎它可能適合SO更好。 它肯定也是關於編程,因爲它涉及到Win32 API的一部分,一般的Windows和流程管理。Windows和系統進程
所以有這些過程不能用taskkill
終止 - 一般來說系統進程。但也有,例如我的反病毒程序,使自己「無法終止」。
如何在Windows下訪問並主要終止系統進程? (微軟的kill.exe不起作用)
防病毒程序如何保護自己?那麼你怎麼能再把它們關掉呢?
您將需要API掛鉤來防止您的進程終止。 API掛鉤並不容易,因爲它需要系統級dll注入和內存編輯或設備驅動程序。閱讀this以獲得想法。
幸運的是,現有的庫存在,如this之一,我認爲這是共享軟件現在不幸。我也發現了this,你也許可以在谷歌上找到更多的免費軟件。
要回答你的第一個問題,終止系統進程相當容易。在C#中使用Process.Kill方法,您可以終止系統進程並導致藍屏如果從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);
}
如果終止進程「正常」的方式行不通,則需要更多的極端措施。您可以嘗試提升安全級別,但這可能無效。
這裏有兩種比較暴力的方法可以嘗試,都要求您能夠成功注入到目標應用程序中(NT 4上的失敗率爲2%,XP上的失敗率爲5%,Vista上的失敗率更高, Windows 7等)。
你可以嘗試注入DLL到使用遠程線程(應用程序),並在對的DLLMain注入DLL請執行下列操作之一:
void KillApp() { int *p; p = NULL; __try { *b = 0; } __except(EXCEPTION_EXECUTE_HANDLER) { killApp(); } }
我認爲沒有人會回答這個問題。 :)也許黑客會...噢,我的意思是防病毒部分... – 2010-03-14 20:01:20
對我來說,這對於每個需要使用Windows API的程序員來說都是非常重要的 - 爲什麼只有黑客(能夠)回答這個? – jemper 2010-03-14 20:03:47
Leniel:啊,我看到了:) – jemper 2010-03-14 20:10:12