2016-02-13 48 views
-2

我建立採用Delphi,RAD Studio的10Windows服務應用程序自衛德爾福(RAD工作室)

在我的調查中,我有一個ESET的Windows服務,這奇妙的是爲了保護自己不被對面來了一個Windows服務應用程序停止或終止。

使用(Windows服務管理器)或(結束進程按鈕) 或以下錯誤消息(結束任務按鈕)停止服務時發生:

操作無法完成。

訪問被拒絕。

其註冊表項也是如此。該錯誤信息是:

無法刪除信息:錯誤而刪除

我測試管理員訪問權限和系統快捷鍵。在這兩種情況下,我都沒有成功。

我想爲我自己的應用程序構建這樣的自我防禦機制,以保護我的服務和註冊表項。

任何想法都會有所幫助。

謝謝你的時間。

更新:

我想知道我可以在Delphi中做到這一點...這就是爲什麼它被標記德爾福

,如果有人想要停止服務或卸載它....

他或她可以使用我自己的應用程序UI來執行此操作。

編輯2:

正如提到的Remko我thnk DACL和ACL是更好的方式來處理它,我找不到它的任何很好的參考。德爾福語言有沒有很好的參考?

+0

兩個竅門:1)您必須監視相關注冊表項的更改,以及2)您需要兩個互相監視的服務。但是沒有系統是不可破的,例如您需要觸發器才能夠定期關閉服務。一旦有人知道觸發器,它們就會「進入」。 –

+0

兩個服務互相保護,當service1停止服務時,service2啓動它,反之亦然,沒有任何錯誤消息,但是在這種情況下,顯示了windows服務管理器創建的訪問被拒絕消息。即使對服務的屬性進行編輯也沒有任何訪問權限,你要做的服務將被windows服務管理器本身拒絕。你如何解釋這個? – user3492977

+0

這與'[delphi]'有關嗎?請不要隨意標記。 –

回答

2

防止SCM停止很容易。假設您使用的是TService,則可以處理TService.OnStop事件並將其參數Stopped設置爲False。並將錯誤代碼分配給TService.ErrCodeTService.Win32ErrCode屬性。

除非您正在編寫安全軟件,否則您確實不應該保護TaskManager終止。應該允許管理員殺死不當行爲。也就是說,您可以使用SetSecurityInfo()爲您的服務進程分配DACL,以根據需要授予/拒絕特定用戶和/或組的訪問權限。

您還可以使用ChangeServiceConfig2()配置您的服務的「失敗操作」,以便在意外終止時重新啓動服務。

爲了保護您的註冊表項,您可以使用RegCreateKeyEx()lpSecurityAttributes參數,或者使用RegSetKeySecurity()功能,分配一個SECURITY_DESCRIPTOR將密鑰包含DACL,由於需要授權/拒絕訪問特定的用戶和/或組。

+1

我認爲Remko提到的DACL和ACL是更好的處理方法。 – user3492977