2016-01-28 58 views
-1

我試圖保護的過程在C++中的窗戶, 代碼:如何保護進程不被殺害?

#include <iostream> 
#include <Aclapi.h> 
#include <iostream> 
#include <windows.h> 
#include <sddl.h> 
#include <stdio.h> 

using namespace std; 

BOOL DenyAccess() 
{ 
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); 
    SECURITY_ATTRIBUTES sa; 
    sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
    sa.bInheritHandle = FALSE; 
    SetKernelObjectSecurity(hProcess, DACL_SECURITY_INFORMATION, sa.lpSecurityDescriptor); 
    return TRUE; 
} 

int main() 
{ 
    while(DenyAccess()); 
    return 0; 
} 

但我可以從任務管理器殺進程!怎麼了 ?

+0

http://www.tutorialspoint.com/cplusplus/cpp_signal_handling.htm –

+0

@Holonout我不明白,這個URL是關於信號,它是什麼連接到這個?你能解釋更多嗎? – user3671325

+1

對不起用戶,錯誤的鏈接。這將更好地適合您的要求:http://security.stackexchange.com/questions/30985/create-a-unterminable-process-in-windows –

回答

1

Windows服務器使用一對線程相互監視來執行Windows Server與Windows客戶端的許可。如果一個線程被停止或暫停,另一個線程將恢復受影響的線程或啓動一個新線程。線程在系統進程中運行。您不能在不崩潰窗口的情況下終止系統進程。

因此,一種方法是將代碼注入系統進程,啓動一對線程並讓線程保護每個線程並做任何你想要的不可操作的進程(或者讓第三個線程去做任何工作想)。您可以將線程設置爲非常高的優先級,以確保沒有任何事情能夠同時成功定位到兩個線程。

0

有一個工作。您可以將流程設置爲「關鍵」,而不是使流程變得無法運行,這意味着殺死此流程會導致Windows系統崩潰(BSOD)。

這可以通過在ntdll.dll中調用未記錄的函數RtlSetProcessIsCritical來完成。
查看http://www.codeproject.com/Articles/43405/Protecting-Your-Process-with-RtlSetProcessIsCriti的詳細示例

但請謹記:您必須在註銷和/或系統關閉時實施正確的終止。否則系統會在這種情況下崩潰。

+0

謝謝,我會測試,並分享如果結果工作! – user3671325

+0

它不起作用!我只是簡單地關閉了其他進程的過程!不會有所不同。 – user3671325

+0

您是否以管理員權限開始申請?這是必需的。我在Windows XP,7和8.1中使用它 - 工作正常。當試圖殺死任務管理器中的進程時,您會收到有關係統終止的警告。 – Konrad