HOOK Openprocess時間程序防查殺

2021-07-05 03:24:34 字數 1867 閱讀 5930



在windows作業系統下,當我們無法結束或者不知道怎樣結束乙個程式的時候,或者是懶得去找「退出」按鈕的時候,通常會按「ctrl+alt+del」呼出任務管理器,找到想結束的程式,點一下「結束任務」就了事了,呵呵,雖然有點粗魯,但大多數情況下都很有效,不是嗎? 

設想一下,如果有這麼一種軟體,它所要做的工作就是對某個使用者在某台電腦上的活動作一定的限制,而又不能被使用者通過「結束任務」這種方式輕易地解除限制,那該怎麼做?無非有這麼三種方法:1.遮蔽「ctrl+alt+del」這個熱鍵的組合;2.讓程式不出現在任務管理器的列表之中;3.讓任務管理器無法殺掉這個任務。對於第一種方法,這樣未免也太殘酷了,用慣了「結束任務」這種方法的人會很不習慣的;對於第二種方法,在windows 9x下可以很輕易地使用註冊服務程序的方法實現,但是對於windows   nt架構的作業系統沒有這個方法了,程序很難藏身,雖然仍然可以實現隱藏,但實現機制較為複雜;對於第三種方法,實現起來比較簡單,我的作品:ipgate**過濾器 就是採用的這種方式防殺的,接下來我就來介紹這種方法。 

任務管理器的「結束任務」實際上就是強制終止程序,它所使用的殺手鐗是乙個叫做terminateprocess()的win32 api函式,我們來看看它的定義: 

bool terminateprocess( 

handle       hprocess; // 將被結束程序的控制代碼 

uint         uexitcode; // 指定程序的退出碼 

); 看到這裡,是不是覺得不必往下看都知道接下來要做什麼:hook 

terminateprocess()函式,每次terminateprocess()被呼叫的時候先判斷企圖結束的程序是否是我的程序,如果是的話就簡單地返回乙個錯誤碼就可以了。真的是這麼簡單嗎?先提出乙個問題,如何根據hprocess判斷它是否是我的程序的控制代碼?答案是:在我的程序當中先獲得我的程序的控制代碼,然後通過程序間通訊機制傳遞給鉤子函式,與hprocess進行比較不就行了?錯!因為控制代碼是乙個程序相關的值,不同程序中得到的我的程序的控制代碼的值在程序間進行比較是無意義的。 

怎麼辦?我們來考察一下我的hprocess它是如何得到的。乙個程序只有它的程序id是獨一無二的,作業系統通過程序id來標識乙個程序,當某個程式要對這個程序進行訪問的話,它首先得用openprocess

這個函式並傳入要訪問的程序id來獲得程序的控制代碼,來看看它的引數: 

handle openprocess

( dword       dwdesiredaccess, // 希望獲得的訪問許可權 

bool        binherithandle, // 指明是否希望所獲得的控制代碼可以繼承 

dword       dwprocessid // 要訪問的程序id 

); 脈絡漸漸顯現:在呼叫terminateprocess()之前,必先呼叫

openprocess

,而openprocess

的參數列中的dwprocessid是在系統範圍內唯一確定的。得出結論:要hook 

的函式不是terminateprocess()而是

openprocess

,在每次呼叫

openprocess

的時候,我們先檢查dwprocessid是否為我的程序的id(利用程序間通訊機制),如果是的話就簡單地返回乙個錯誤碼就可以了,任務管理器拿不到我的程序的控制代碼,它如何結束我的程序呢? 

至此,疑團全部揭開了。由hook 

terminateprocess()到hook 

openprocess

的這個過程,體現了乙個逆向思維的思想。其實我當初鑽進了terminateprocess()的死胡同裡半天出也不來,但最終還是蹦出了靈感的火花,注意力轉移到了

openprocess

上面,實現了程序防殺。喜悅之餘,將這心得體會拿出來與大家分享。

linux程序查埠,埠查程序

ps ef grep 服務name 例如,結果 root 15034 其中,15034就是它的程序pid,如果要刪掉這個程序 kill 9 15034 也可以這樣殺程序 pkill 服務名 根據程序,可以查出它暴露埠 netstat tunlp grep 程序pid 通過程序pid.查服務 ps e...

程序防殺 雙程序守護

程序a為主程序,程序b為守護程序,例如 通過乙個事件event,判斷程序a是否存在,若存在,無動作,若不存在,則啟動程序a b 啟動臨時程序 啟動程序a 臨時程序的作用是防止通過 程序樹把兩個程序同時殺死。雙程序守護的思想 假設我想保護a程序,不想被別人結束掉。比如通過程序管理器等方式。那麼就建立乙...

linux如何查程序 殺程序

1.查程序 ps a 顯示現行終端機下的所有程式,包括其他使用者的程式。ps a 顯示所有程式。ps c 列出程式時,顯示每個程式真正的指令名稱,而不包含路徑,引數或常駐服務的標示。ps e 此引數的效果和指定 a 引數相同。ps e 列出程式時,顯示每個程式所使用的環境變數。ps f 用ascii...