[英]Prevent C# app from process kill
如何保護我的 C# 應用程序免遭他人通過 taskman 或以編程方式殺死其進程的影響?
這是我的場景:
App A 是另一個團隊開發的 MFC 應用程序。 它有一個未發布的基於文本的遠程界面,通過后門啟用。
我正在開發應用程序 B,這是一個與 A 交互的 C# WinForms 應用程序。B 在需要遠程訪問時啟用 A 的后門,並在完成(或失敗時)關閉它。
我正在探索用戶可以濫用 B 以訪問 A 隱藏功能的方式,例如在啟用 A 的遠程接口后殺死 B 的進程。 當這種情況發生時,我希望有最后一次機會讓 B 關閉 A 的后門。
B 使用 localhost 與 A 交互,所以我不擔心掉電的情況。
我正在尋找不涉及更改 A 的解決方案。
我不希望能夠阻止 Dark Tangent(盡管這將是一個獎勵),但現在腳本小子可以用這種設計來做他的方式:)
這些應用程序在 Windows XP 上運行,但很快也將支持 Vista 和 7。
提前致謝,吉姆
當他們嘗試但需要先做一些事情時,我願意關閉應用程序。
在程序關閉時采取必要的步驟會導致脆弱的程序很容易被破壞。 即使您可以通過任務管理器阻止某人殺死您的程序,您也無法阻止他們關閉計算機,甚至將電纜從牆上拉出。 任何需要完成的至關重要的任務都將丟失。 如果停電怎么辦? 同樣,您的任務不會完成,您的重要清理代碼也不會運行。
相反,您應該使您的程序在任何時候都對失敗保持健壯。 使用事務,並始終以原子方式將狀態保存到文件中 - 確保您始終至少擁有一份有效的數據副本。 不要以暫時無效的方式覆蓋重要文件。
最后,您可以向您的程序添加一個對話框,當他們嘗試關閉它時,警告他們該程序需要正確關閉。 如果你讓你的關機速度很快,用戶就不會想殺死它,而是讓它正常終止。 如果您的關機需要很長時間,那么人們會試圖殺死它。 如果你對你的用戶好,他們也會對你好。
如果快速關閉意味着用戶將丟失一些未完成的工作,則警告他們這一點並讓他們有機會等待任務完成,但如果他們真的想退出您的程序,那就讓他們退出。
你真的,真的,真的不想這樣做。 讓用戶非常生氣!! 但是,如果它應該是一項服務,請將其作為服務帳戶運行,並且不要向用戶授予管理員權限。
你不能 - 只要用戶有權在你的程序上調用 TerminateProcess,你就不能阻止 End Process 在任務管理器中立即殺死你。 Raymond Chen 前段時間在此發帖:程序和用戶之間的軍備競賽
簡短的回答:你不能也不應該。
長答案:您可以嘗試啟動第二個“幫助程序”進程,該進程每 x 秒檢查一次您的應用程序是否仍在運行。 如果不是,它會重新啟動它。
如果你想讓一個進程運行很長時間只是不相信用戶讓它運行,考慮 Windows 服務。 它們是為此而設計的。
我想每個人都沒有抓住重點。 如果我正確閱讀(在您編輯之后),您希望知道自己何時被“殺死”,以便可以優雅地關閉?
“殺”的意義在於你“不能”阻止它。 當然有一些變通方法,比如使用第二個應用程序來恢復被殺死的應用程序,但這與簡單地能夠正常關閉無關。
最好的方法是要么作為服務運行(這樣你就不會被殺死,只是被要求關閉),或者重構你的應用程序的工作方式,這樣它就不需要在退出之前“整理”。 當一個應用程序退出時,它所擁有的大部分資源都會被自動清理,所以你真正需要關閉的只是你自己的數據。 您可以嘗試的方法有:
為了防止您的應用程序被終止,您以另一個用戶身份(即作為服務或另一個用戶帳戶)運行您的應用程序,並將用戶限制為標准用戶。
這樣,惡意用戶就無法殺死您的進程,因為只有管理員才能殺死它,而這顯然是您不信任任何人的特權。
它的優點是遵循操作系統的預期設計。
@吉姆
如果 App A 可以接收修改請求
最好,我會采用一種架構,其中所有 App B 在打開后門時都已注冊,並且需要每隔一段時間 ping App A 進行注冊,以便 App A 可以在 App B 沒有通知它仍然需要訪問時關閉它自己的后門。 這仍然不是完全安全的,但應用程序 A 不應該使用這樣的界面來構建,而沒有對“安全”通信方式進行某種自我調節。
或者,您可以建議修改 App A 以檢查有效進程,如果在其后門打開時未找到任何進程,則將其關閉(這是可欺騙的,因為它使用已處理的名稱)。
否則,聽起來 App B 應該在不需要立即訪問時盡可能多地關閉后門。
要求應用程序 B 提供對應用程序 A 訪問的安全性確實是一個糟糕的模型。
據我所知你不能,即使你可以,你也不應該。 想象一下,如果您不能強制終止應用程序,那該有多煩人。
如果您的應用程序保持運行很重要,您可以始終創建一個 Windows 服務來“ping”應用程序以確保它正在運行(您可以使用命名管道、套接字、pid 文件……等等)。 如果服務檢測到進程已經死亡,那么它可以重新啟動它。 這可能是你最好的選擇。
當應用程序第一次啟動時,您是否可以不執行在后台運行的第三個 ap/進程並嘗試每隔一段時間回調到應用程序 B,因此當應用程序 B 關閉時.. 應用程序 C 可以看到並執行關閉App A后門的程序。
因此,當 App B 通過預期的關閉按鈕成功關閉時,它將禁止 App C 檢查 App B 是否仍然正常工作......
我目前並不是最擅長 C#,但看着你的問題,這可能是我嘗試做的方法之一。
此外,如果 App B 也檢查 App C,那么如果 App C 已經關閉,App B 會盡可能關閉后門。
正如其他人所說,這可能不是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.