【C#】保護程序后臺進程不被Windows任務管理器強制結束(源代碼)
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
一直有個編程的問題沒有解決——禁止別人用任務管理器,結束自己的程序進程(.NET程序)。帶著這個問題,我開始Google,開始baidu,又開始編程了。和原來的搜索結果一樣,什么東西都是一籌莫展,得到的答案永遠是:C#沒有辦法自己去禁止別人用任務管理器結束自己進程。不過功夫不負有心人。我還是找到一大堆的替代方法,可以讓別人不結束自己進程的方法。 總結方法有: 1.把任務管理器程序給別人刪除了,不讓別人打開(媽呀,這個我覺得最不可取了,有點殺雞取卵的味道,沒有任務管理器,我是無法忍受的。畢竟人家用戶,購買了你產品,你總不可能把別人任務管理器給洗白了吧?)否決! 2.接下來這個比較溫柔,通過C#內置的Process類,對任務管理器的進程進行掃描,如果檢查到有taskmgr.exe的進程(任務管理器進程),就把這個進程結束了。(雖然沒有第一個來的惡劣,但是,用戶還是不能使用任務管理器)否決! 3.寫兩個程序進行雙保護。這個想法是網上提的最多的思路,如果一個程序被結束了,另一個程序檢測到這個程序不在了,就立即重新啟動該程序,雙雙保護,互助互利(結果我嘗試了一下,不可取,因為1,CPU使用率太高,一直在循環(huán)檢測,計算機速度立即就下了。我媽媽這個機子,P4的配置,1G內存,也來不起了。網頁也卡起了。2,我寫了一個第三方程序,以最快速率去結束這個兩個進程,如果這兩個進程為了節(jié)約CPU的使用率,而把掃描間隔時間隔的太開的話,立刻被我的程序洗白。所以,理論上這種方法,肯定是會被洗白的)否決! 4.技術含量比較高了,通過Windows的驅動機制,把自己給隱藏了(把自己變成驅動),然后隱藏到系統(tǒng)中運行,在任務管理器完全找不到,其實我多喜歡這種方式的,但是,這個程序一弄出來,瑞星,Google,Hotmail,360衛(wèi)士,全部當成病毒查出來了,我當時眼流花都要流出來了。他們都太不給面子,Google,Hotmail直接把我的附件刪除了。隨便我壓縮,分包壓縮,都逃不過他們的法眼。所以,我清楚的意識到,這種程序弄出來,在客戶機器上,肯定是無法長久生存的。畢竟一個堂堂正正的程序,干嘛要去隱藏呢?所以。該條方案否決! 5.用第三方的VC++程序,輔助C#程序達到不讓別人禁止C#進程的方法。哎,弄了半天,這種方法,我認為最行之有效。畢竟不得不承認,要搞Windows系統(tǒng)級的程序設計,C++是當之無愧的龍頭老大,C#只是一個做網站級應用的能手。不過,你發(fā)布一個程序給用戶,用戶看到那個任務管理器里面還有個其他程序在運作或者是看到你的安裝包里面怎么還有其他程序名字,確實感覺太不專業(yè),太不地道了。話又說回來,這種輔助程序一般都要收費。我下載的那個就要收費。所以,最后,這個方案也否決了! 難道,C#真的就不能自己弄個什么名堂的東西出來,不被任務管理器結束嗎?實際,我認為,C#是可以做到這一點的。原因有2個。 1、C#是支持帶*號這種指針的方式的。也就是說,C#可以使用指針。 2、C#可以完全無障礙的調用Windows自己的API函數(shù)(雖然性能沒有VC++開發(fā)的好),調用第三方開發(fā)的COM組件,甚至調用USB插口接口相關信息(曾今做U盤殺毒的時候,用到過,不過主要還是結合API完成的,一個未公開的API函數(shù)R開頭的忘記了)。 所以,為此,我抱著信心開始準備找第三方提供的動態(tài)鏈接庫之類的東西,畢竟要自己寫,C#還是有許多性能和調用方面的麻煩問題要考慮,畢竟不是畢業(yè)設計,所以,能簡單就簡單,只要克服以上提到的5種方法的不足。 最后,功夫不負有心人,找了大半天,找到了一個叫Peter的牛人,寫了一個通過VC++程序調用VC++動態(tài)鏈接庫,實現(xiàn)的VC++程序不被任務管理器結束的源代碼。幸虧源代碼相當詳盡(VC++動態(tài)鏈接庫的源碼,VC++應用程序源碼),要不然,后面的活路,就沒有辦法做了。于是我開始,慢慢,慢慢走上辛苦的VC++代碼分析上。你們可能要問我干什么?我可以很坦然的告訴你,雖然我VC++能力確實不強,但是我要把VC++的代碼,移植到C#上。聽起來,很不可思意,但是,我真的成功了。最后,為了報答我的學?!啥茧娮訖C械高等專科學校和成都信息工程學院。我把VC++應用程序調用代碼,移植到.NET上,并且,為了調用方便,我做成了.NET可以識別的dll運行庫。只要按以下方式調用運行即可。這個dll運行庫可以保護自己進程,也可以通過設置保護其他進程,作為第三方動態(tài)鏈接庫存在。(很幸運,雖然這個第三方動態(tài)鏈接庫我還是很花了些時間,但是絕對不收費,免費放送,提供C#工程源碼下載!如果大家有興趣也可以一起討論一下,我的郵件是Email:k.liuxu@gmail.com),至于那個牛人的設計思路,其實,就是用系統(tǒng)函數(shù)掛鉤,掛接了所有的系統(tǒng)函數(shù)消息。沒有直接分析任務管理器這些東西。不過,在CMD命令控制臺中,無法接受消息,所以,用命令控制臺,是可以結束進程的。不過,命令控制臺,一般用戶不會使用,可以直接把命令控制臺刪除,或者移植到程序內部調用,不準用戶外部調用,就行了。至于其他更麻煩的東西,就有興趣大家在慢慢聊吧。 前面分析VC++代碼是一個艱苦的歷程,簡直是揮淚分析啊,眼睛都看腫了,才把VC++應用程序部分移植出來。其實總結了一下,實際上還是因為自己學習不扎實,所以才看的惱火,對不起電子高專培養(yǎng)我的劉光會和楊勇老師,對不起信息工程學院的安俊秀和陳曉紅老師。不過最后弄出來了,還是一件好事情吧,也充分說明了C#還是可以搞一些基于系統(tǒng)級的調用和編程的。也許在大鳥眼睛中,移植這種工作并不算什么,這種程序也許是小兒科,不過,對于,剛剛畢業(yè)的我來說,還是一種不小的挑戰(zhàn)。 由于時間有限,我只把前半部分的VC++應用程序端移植完成,在以后的時間中,等我把Dll部分抽象出來,我會做成.NET可以識別的dll發(fā)布出來。如果還有時間,我就再來說說,我怎么分析的吧。不過這個可能要說很久很久了,畢竟涵蓋了5年我大學學習的所有基礎知識,大到系統(tǒng),小到函數(shù)指針,代理,枚舉這些結構,內存存儲空間等等。好了廢話不多說了。現(xiàn)在主要看看怎么使用。 首先,我們必須具備兩個DLL文件,一個是我用.NET程序生成的KProtectProcess.dll文件,這個文件可以直接放到VS.NET開發(fā)環(huán)境中進行使用。還有一個是我還沒有編譯出來的NKCore.dll文件(其實我移植了一半,但是里面設計很多系統(tǒng)關鍵字,我在C#中還沒有找到很好的解決方案,所以正在研究),這個文件是C++的運行庫,實際上核心也是這個文件。 1、首先我們新建立一個工程。如下: 2、按照如圖,放置這些控件,以便我們操作: 3、添加引用.NET可以識別的KProtectProcess.dll動態(tài)鏈接庫(VB.NET、J#.NET、VC++.NET都可以調用)右鍵項目,選擇添加引用: 4、找到KProtectProcess.dll這個文件并添加(注意保持KProtectProcess.dll文件和NKCore.dll文件在同一目錄中) 5、點確定以后,你會看到工程中,多了一個程序集KProtectProcess.dll 6、雙擊,按鈕進入代碼的編寫(其中保護自己,停止保護自己,保護其他進程,停止保護其他進程按鈕的名字分別是:button1,button2,button3,button4),具體調用代碼編寫如下(代碼調用,已經簡化的相當簡單了):自身保護調用SelfProtection()、自身釋放調用UnLoadProtection()、其他進程保護,首先調用ProtectProcessID賦值,然后調用ProtectProcess進行保護,如果不賦值,我會拋出一個異常。 7、所有工作都準備完畢就可以調試了。其中以下演示怎么保護其他進程。比如我們現(xiàn)在打開Windows計算器這個程序,計算器這個程序的進程名是calc.exe,所以,我們就找他的進程號PID.1764
現(xiàn)在只需要在程序的進程號中輸入:1764,然后點保護,最后,你看用任務管理器是不是不能結束calc這個程序了?很簡單吧? 結束語: (1).NET程序原代碼下載地址為(大小47KB):TestClose.rar (2)兩個動態(tài)連接庫文件(大小14KB):Dll.rar (3).NET可識別的Dll我移植出來的.cs文件(7KB):KProcess.rar (4)VC++原始代碼文件(大小10KB):vc.rar 以上程序使用的是VisualStudio.NET 2010,(C#),在XP SP2上測試通過。如果有任何問題的話,請各位大俠多多指教。 該文章在 2024/4/17 18:18:57 編輯過 |
關鍵字查詢
相關文章
正在查詢... |