簡體   English   中英

防止 C# 應用程序終止進程

[英]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 服務。 它們是為此而設計的。

我想每個人都沒有抓住重點。 如果我正確閱讀(在您編輯之后),您希望知道自己何時被“殺死”,以便可以優雅地關閉?

“殺”的意義在於你“不能”阻止它。 當然有一些變通方法,比如使用第二個應用程序來恢復被殺死的應用程序,但這與簡單地能夠正常關閉無關。

最好的方法是要么作為服務運行(這樣你就不會被殺死,只是被要求關閉),或者重構你的應用程序的工作方式,這樣它就不需要在退出之前“整理”。 當一個應用程序退出時,它所擁有的大部分資源都會被自動清理,所以你真正需要關閉的只是你自己的數據。 您可以嘗試的方法有:

  • 經常將您的狀態提交到磁盤,這樣如果您意外退出,您就不會丟失太多(或任何東西)。 (記住刷新所有 I/O 流以確保它們已提交到磁盤)
  • 將信息保存到磁盤,以便您在下次程序運行時檢測到意外關閉,因此它能夠檢測和糾正因被殺死而可能導致的任何問題。
  • 告訴你的用戶不要當白痴,然后很好地退出你的應用程序。 如果他們不理你,就戳他們的眼睛。 通常他們聽不超過兩次:-)

為了防止您的應用程序被終止,您以另一個用戶身份(作為服務或另一個用戶帳戶)運行您的應用程序,並將用戶限制為標准用戶

這樣,惡意用戶就無法殺死您的進程,因為只有管理員才能殺死它,而這顯然是您不信任任何人的特權。

它的優點是遵循操作系統的預期設計。

@吉姆

如果 App A 可以接收修改請求

  1. 最好,我會采用一種架構,其中所有 App B 在打開后門時都已注冊,並且需要每隔一段時間 ping App A 進行注冊,以便 App A 可以在 App B 沒有通知它仍然需要訪問時關閉它自己的后門。 這仍然不是完全安全的,但應用程序 A 不應該使用這樣的界面來構建,而沒有對“安全”通信方式進行某種自我調節。

  2. 或者,您可以建議修改 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM