驅動 強制結束程序 整理

2021-07-03 10:19:41 字數 2332 閱讀 3487

有一陣子沒 寫部落格,正好這幾天 寫了個 核心級強制結束程序 的小例子。寫這個例子之前都沒去查什麼資料,主要是想試試自己能不能寫出來吧。寫完後才發現 看雪論壇 曾經發表過一篇很相似的文章,實現的細節可能有點不一樣,不過原理基本是相同的了。

都是通過 這個  pspterminatethreadbypointer 函式,我是通過查 reactos 來理解的  ntteriminateprocess 的內部實現過程,

然後 通過 在 si 裡面查詢引用,找到的乙個 匯出函式中呼叫了 pspterminatethreadbypointer . 這個函式就是  psterminatesystemthread,然後通過 windbg 確認,發現 在win7 和xp 下 這個函式 均呼叫了 pspterminatethreadbypointer,之後 查到呼叫的地方,具體的可以去windbg裡面看一下,這個函式裡面很短,具體我沒看,因為這裡我只需要用到這個 pspterminatethreadbypointer 函式。 

pspterminatethreadbypointer() 這個函式的內部我只簡單的看了一下,通過向執行緒插入apc讓執行緒自己結束的辦法。

在win7 和 xp 的32位下這個函式的 引數又一點點 區別,可以看到 在 win7 下 他有 3個 引數 ,乙個是指向執行緒物件的指標,乙個是退出碼,還有乙個 始終為 1 的引數,xp 下沒有 第三個, (當然 由於我並沒有完成 win7 下的**,這裡的分析可能有問題),需要說明的一點是以下**僅僅相容 xp 32位版本。

typedef

ntstatus

(*pspterminatethreadbypointer)(

in pethread thread,

in ntstatus exitstatus

);ntstatus pslookupprocessbyprocessid(

_in_ handle processid,

_out_ peprocess *process

);/*

特徵碼winxp e8 28fcffff

win7 e8 d9570400

*/boolean pspterminateprocessbyid(ulong upid)

uconditioncode = 0xfffffc28;

uerror = 0;

kdprint(("addr is :0x%x", untterminateprocessaddr));

//搜尋特徵碼,不知道我這種寫法是不是有點笨

dobfind = true;

untterminateprocessaddr++;

uerror++;

} while (uconditioncode != *((ulong*)untterminateprocessaddr));

if (bfind)

pspterminatethreadbypointer = (pspterminatethreadbypointer)(*((ulong*)untterminateprocessaddr) + (ulong)(untterminateprocessaddr + 4));

ntstatus status = pslookupprocessbyprocessid((handle)upid, &killprocess);

if (!nt_success(status))

//kdprint(("eprocess is :0x%x", ));

// ==> 取出 threadlisthead 找出乙個執行緒的頭

//-0x22c 就是 pethread 的位址

//kdbreakpoint();

list_entry* plist;

plist = (list_entry*)(ulong)*(ulong*)((ulong)killprocess + 0x190);

list_entry* plistnext;

plistnext = plist->flink;

if (plistnext->flink != plist)//如果只有一條執行緒就直接結束 否則 bsod

while (plistcurnext != plist);

}pspterminatethreadbypointer((pethread)((ulong)(plist)-0x22c), 0);//到這裡就清理成功了

//obdereferenceobject(killprocess);//解引用,不過貌似這個物件都沒有了,不確定需不需要解除引用

return bfind;

}

2018/5/10 修改

注,這裡的**太凌亂,風格太差,整體來說並沒有什麼意義,留下來也僅僅是做個紀念。

強制結束系統程序

一般我們通過任務管理器程序標籤來結束程序,但對於有些系統程序或系統異常時就有可能出現一些殺不死的程序。其實對於此類程序我們也是可以殺掉的。首先,我們啟動任務管理器,選擇檢視 選擇列,在彈出對話方塊中勾選pid選項,確定退出。這時,程序列表就多了pid列。pid為程序編號的縮寫 如下圖 然後,我們進入...

強制結束乙個程序

實際不是原創,是別人研究出來的,我不過把delphi 翻譯成c的。下面的 可以解除安裝乙個程序的模組。pid是程序id,modulename是模組名。bool unloadmodule dword pid,char modulename return false 如果解除安裝的是乙個關鍵模組,程序就...

VC MFC 強制結束當前程序

最近接手乙個mfc老專案,bug太多,主線程退出的時候,也不管子執行緒死活,直接退出,導致子執行緒又去訪問那些被釋放的資源,結果程式無法關閉,或者導致程序在後台駐留了。這裡提供一種簡單粗暴的方法 強行結束自己 執行緒終止滿足如下條件之一 1 執行緒函式返回 2 執行緒執行中呼叫exitthread ...