2010-03-14 110 views
2

注意:我已經以超類用戶的相似格式提出了這個問題,但似乎它可能適合SO更好。 它肯定也是關於編程,因爲它涉及到Win32 API的一部分,一般的Windows和流程管理。Windows和系統進程

所以有這些過程不能用taskkill終止 - 一般來說系統進程。但也有,例如我的反病毒程序,使自己「無法終止」。

  • 如何在Windows下訪問並主要終止系統進程? (微軟的kill.exe不起作用)

  • 防病毒程序如何保護自己?那麼你怎麼能再把它們關掉呢?

+0

我認爲沒有人會回答這個問題。 :)也許黑客會...噢,我的意思是防病毒部分... – 2010-03-14 20:01:20

+0

對我來說,這對於每個需要使用Windows API的程序員來說都是非常重要的 - 爲什麼只有黑客(能夠)回答這個? – jemper 2010-03-14 20:03:47

+0

Leniel:啊,我看到了:) – jemper 2010-03-14 20:10:12

回答

0

您將需要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); 
} 
+0

你提到的TerminateProcess函數有一個問題:你再次需要殺死它的權利(這就是它在msdn上所說的)。 – jemper 2010-03-14 20:42:59

+0

謝謝,如果沒有你的幫助,我會很難找出答案。有人喜歡這個,我還不能。 – jemper 2010-03-14 21:57:17

0

如果終止進程「正常」的方式行不通,則需要更多的極端措施。您可以嘗試提升安全級別,但這可能無效。

這裏有兩種比較暴力的方法可以嘗試,都要求您能夠成功注入到目標應用程序中(NT 4上的失敗率爲2%,XP上的失敗率爲5%,Vista上的失敗率更高, Windows 7等)。

你可以嘗試注入DLL到使用遠程線程(應用程序),並在對的DLLMain注入DLL請執行下列操作之一:

  • 調用了ExitProcess(退出碼);
  • 註冊一個異常處理程序,然後導致一個異常,您將捕獲異常處理程序。在你的異常處理程序中導致另一個異常(和/或stackoverflow)。異常處理期間的異常將導致程序即時死機。
 
void KillApp() 
{ 
    int *p; 

    p = NULL; 

    __try 
    { 
      *b = 0; 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) 
    { 
     killApp(); 
    } 
} 

Plenty of articles on injecting using CreateRemoteThread