終止程序的內幕

2021-03-31 17:45:15 字數 1768 閱讀 4612

原文: http://.blog**.***/user17/pjf/blog/4213145.html

pjf(jfpan20000@sina.***)

有來信詢問程序結束的有關問題,下面就這個問題簡單討論一下(下面的討論基於2000,其他nt系統也類似)。

首先看看乙個應用程式想要強制結束另乙個程序所要做的事:首先獲得目標的程序id,接著利用openprocess獲取程序控制代碼(確保足夠許可權),最後將控制代碼傳給terminateprocess了結那個程序。

1、openprocess通過本機系統服務介面進入核心態,隨後呼叫ntoskrnl的ntopenprocess。在服務函式裡,系統使用sesingleprivilegecheck檢查呼叫者是否有debug許可權(sedebugprivilege),若有,則修改accessstate使得在後面的操作中獲取允許任意程序訪問操作的控制代碼。最後通過obopenobjectbyname或pslookupprocess*** + obopenobjectbypointer來開啟程序(建立並返回程序控制代碼)。

2、terminateprocess通過本機系統服務介面進入核心態,隨後呼叫ntoskrnl的ntterminateprocess。系統首先呼叫obreferenceobjectbyhandle獲取程序執行體塊,執行體塊的debugport指出程序是否處於除錯狀態,若處於除錯狀態且傳入的exitstatus為dbg_terminate_process則返回失敗禁止結束程序。隨後服務函式轉入正題:

系統利用threadlisthead列舉程序的每乙個執行緒,使用pspterminatethreadbypointer來結束它們。注意並不是對每個執行緒系統都會忠實地執行你的命令:若列舉到的執行緒是系統執行緒則不會繼續執行而是返回status_invalid_parameter。判斷的方法是執行緒的teb為零或者teb的值在核心位址空間。有人問2000下為何csrss.exe程序殺不死,很簡單,開啟icesword,在程序欄利用右鍵選單的「執行緒資訊」看一下,看到那幾個teb為零的執行緒沒有?(注意是針對windows2000,xp下不同。另外一點就是csrss中其它非系統執行緒的執行緒是很容易被殺死的,試圖結束csrss時也可以看到在teb為零的執行緒前面的執行緒已被殺掉,只是操作停在了teb為零的執行緒這裡) 再看看system程序,呵呵。icesword也並未提供殺除這種程序的功能,因為覺得沒有需求。在最後乙個執行緒結束時,程序的生命也結束了,隨著pspexitprocess/obkillprocess灰飛煙滅。

另一方面,執行緒是怎樣結束的呢。pspterminatethreadbypointer並不是直接「殺掉」指定執行緒,實質上線程是「自殺」的,呵呵。系統簡單的使用keinitializeapc/keinsertqueueapc插入了乙個核心態的apc呼叫,若是使用者執行緒,會再插入使用者態的apc呼叫,最終執行緒在自己的執行環境中使用pspexitthread(...=>keterminatethread=>kiswapthread)悲壯的自行了斷。

有人問起為什麼icesword有時殺不死除那三個有系統執行緒的程序(兩個是csrss、system,而idle是個非常奇特的存在,與眾不同,這裡不多廢話了)外的其它程序。從上面的討論可以找到答案。這種情況往往是目標程序的某使用者態執行緒進入核心態後,系統出了某些問題掛死在核心態,無法返回執行apc例程的緣故。icesword未強制除去它們是考慮此刻系統可能已經有某些問題,強制刪除操作更有可能使系統崩潰,不過有了不少使用者要求有這項功能,所以以後有空可能會加上(已經有一大堆雜七雜八的要求了,很難有時間公升級一下版本,~_~)。

一般來說,要乾掉乙個程序,有了debug許可權就可以了,若別人有了保護,那就要發揮你的能力了。

我想上面的討論對於想要殺除程序、保護程序的人有一些啟發了吧。

終止程序的內幕

pjf jfpan20000 sina.com 有來信詢問程序結束的有關問題,下面就這個問題簡單討論一下 下面的討論基於2000,其他nt系統也類似 首先看看乙個應用程式想要強制結束另乙個程序所要做的事 首先獲得目標的程序id,接著利用openprocess獲取程序控制代碼 確保足夠許可權 最後將控...

程序的終止

系統呼叫exit 實現程序的終止。exit 在linux系統函式庫stdlib.h中的函式宣告如下 void exit int status exit 只有乙個引數status,稱作程序的退出狀態,父程序可以使用它的低8位。exit 的返回值通常用於指出程序所完成任務的成敗。如果成功,則返回0 如果...

程序的終止

通常採用exit來結束乙個程序 相應的函式呼叫為 include void exit int status int atexit void function void int on exit void function int void void arg void abort void includ...