2012-03-17 146 views
3

嗨,大家好我正在編寫一個小程序,以提高生產力。它應該斷開用戶與Internet的連接,或者在預設的分鐘數後關閉計算機。該程序不應該與任務管理器關閉。我可以編譯程序並運行,但我可以用任務管理器關閉它。我得到了我的靈感來自於這個頁面 Prevent user process from being killed with "End Process" from Process Explorer阻止進程在任務管理器中關閉

#include <iostream> 
#include <Windows.h> 

#include <AccCtrl.h> 
#include <AclAPI.h> 
#include <tchar.h> 

#include "shutdown.cpp" 
#include "disconnect.cpp" 



static const bool ProtectProcess() 
{ 

    HANDLE hProcess = GetCurrentProcess(); 
    EXPLICIT_ACCESS denyAccess = {0}; 
    DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL; 
    BuildExplicitAccessWithName(&denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE); 
    PACL pTempDacl = NULL; 
    DWORD dwErr = 0; 
    dwErr = SetEntriesInAcl(1, &denyAccess, NULL, &pTempDacl); 
    // check dwErr... 
    dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL); 
    // check dwErr... 
    LocalFree(pTempDacl); 
    CloseHandle(hProcess); 
    return dwErr == ERROR_SUCCESS; 

} 


int main() 
{ 
    using namespace std; 
    int abfrage; 

    ProtectProcess(); 

    for (;;) 
    { 
     cout << "10.Cut your Internet connection" << endl 
      << "11.Cut your Internet connection after 'x' minutes of surfing" << endl 
      << "20.Shutdown"     << endl; 
     cin >> abfrage; 

     switch(abfrage) 
     { 
      case 10: disconnectnow(); break; 
      case 11: disconnectlater(); break; 
      case 20: shutdown(); break; 

      default: cout << "nothing to see here" << endl; 
     } 
    } 
    return EXIT_SUCCESS; 
} 
+0

管理員將*總是*能夠殺死你的程序,不是嗎?並不會停止互聯網連接,使您*少*生產力? – 2012-03-17 22:38:29

+5

從任務管理器隱藏程序或防止它們被關閉是Windows出於顯而易見的原因難以預防的原因。 – ChrisF 2012-03-17 22:39:01

+0

@Carl Norum我經常需要閱讀pdf才能學習,但互聯網讓我無法讀書。它既不能與管理員也不能使用用戶權限。 – AaronP 2012-03-17 22:50:52

回答

6

此功能is, deliberately, unsupported and actively made intractable:

你爲什麼不能捕獲了TerminateProcess?

如果用戶觸發了任務管理器,單擊應用程序選項卡上結束任務按鈕,Windows首先嚐試很好地關閉你的程序,通過發送WM_CLOSE消息GUI程序和CTRL_CLOSE_EVENT事件控制檯程序。但是你沒有機會攔截TerminateProcess。爲什麼不?

TerminateProcess是低級進程查殺功能。它繞過DLL_PROCESS_DETACH和其他任何過程。當你用TerminateProcess殺死時,在該進程中不會再運行用戶模式代碼。它消失了。不要過關。不要收200美元。

如果你可以攔截TerminateProcess,那麼你將會升級程序和用戶之間的軍備競賽。假設你可以攔截它。那麼,如果你想讓你的程序無法運行,你只需交出你的TerminateProcess處理程序!然後人們會要求「一種方法來殺死一個拒絕被TerminateProcess殺死的進程」,我們會回到我們開始的地方。

實際上,試圖逃避檢測和任務kill的程序嘗試將其自身重命名爲Windows系統進程的近似形式。不要這樣做。它保證你的程序將被提交爲惡意軟件,並會殺死你的信譽。

相關問題