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