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