2011.5.29測試有效
【提示】能加驅動進內核,就沒必要弄EXE了,所以我個人覺得沒啥實際用途,僅供觀看
Windows會給每一個進程建立一個EPROCESS結構,給每一個執行緒建立ETHREAD結構,EPROCESS結構第一個成員是KPROCESS結構,ETHREAD結構第一個成員是KTHREAD結構。每個進程的執行緒的ETHREAD結構都會按下圖所示連結起來:
裡面有兩條鏈表。通過遍歷這兩條鏈表,可以得到一個進程所有的執行緒。Windows在執行執行緒調度時,不會去管這兩條鏈表。只有當新建一個執行緒時,會加入到鏈表中,一個執行緒退出時,會從鏈表中移除。
如果在EPROCESS中將這兩條鏈表置空,會發生什麼事呢?
以下是驗證步驟:
【注意】請先關閉防毒軟體,以免載入驅動時提示。驅動代碼中用了一堆的硬編碼,所以請確保作業系統為Windows XP SP3 中文版,否則可能藍屏。
1.編譯以下代碼為haha.exe
/*
* 【作者:KiDebug】
* 【空間:http://hi.baidu.com/KiDebug/】
*/
#include <Windows.h>
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
//這個迴圈是用來證明進程沒有被結束,不是重點,請無視!
while (1)
{
MessageBoxA(NULL,"關不了,氣死你!~","哈哈!~",MB_OK);
}
return 0;
}
按兩下打開haha.exe,它會不斷地調用MessageBox彈出對話方塊,此時工作管理員、XueTr、360進程管理器都可以結束haha.exe
2.確保haha.exe可以彈出對話方塊,然後再編譯以下代碼為ProtectHaha.sys,利用InstDrv.exe載入ProtectHaha.sys,依次點擊安裝、啟動、停止、卸載
/*
* 【作者:KiDebug】
* 【空間:http://hi.baidu.com/KiDebug/】
*/
#include <ntddk.h>
void DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
__asm
{
mov ebx,PsInitialSystemProcess
mov ebx,[ebx]
lea ebx,[ebx+88h] //+0x088 ActiveProcessLinks : _LIST_ENTRY
L1: mov ebx,[ebx] //遍歷ActiveProcessLinks,找haha.exe的EPROCESS
cmp dword ptr [ebx+0ECh],61686168h
jnz L1
cmp dword ptr [ebx+0F0h],6578652eh //68 61 68 61 2e 65 78 65 haha.exe
jnz L1
//88h、50h、190h、194h都是硬編碼,適用於Windows XP SP3
lea ebx,[ebx-88h] //EBX為haha.exe的EPROCESS
lea eax,[ebx+50h] //nt!_KPROCESS
mov [ebx+50h],eax //+0x050 ThreadListHead : _LIST_ENTRY
mov [ebx+54h],eax //置為空鏈
lea eax,[ebx+190h] //nt!_EPROCESS
mov [ebx+190h],eax //+0x190 ThreadListHead : _LIST_ENTRY
mov [ebx+194h],eax //置為空鏈
}
DriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
3.打開工作管理員,選中haha.exe,點擊“結束進程”,haha.exe無法結束,仍然可以不停地彈對話方塊;
4.打開XueTr,在“進程”視窗中選中haha.exe按右鍵,點擊“結束進程”,haha.exe無法結束,仍然可以不停地彈對話方塊;刷新,再次右鍵,點擊“強制結束進程”,haha.exe無法結束,仍然可以不停地彈對話方塊;
5.打開360安全衛士(8.0.0.2001),啟動“功能大全”裡面的“進程管理器”,選中haha.exe,點擊“關閉程式”,haha.exe無法結束,仍然可以不停地彈對話方塊;
【注意】
1.有可能點擊對話方塊右上角的關閉按鈕後,haha.exe會假死。這時先隨便點下桌面或其他什麼地方,再點對話方塊的“確定”按鈕,就又活過來了。
2.如果要應用到其他進程上,請確保驅動啟動後這個進程不會新建執行緒,否則“強制結束進程”可以結束掉新建執行緒,可能會造成進程假死。
3.haha.exe中只有一個執行緒,對於其他進程,在EPROCESS中將兩條鏈表置空後需要將鏈表中第一個執行緒和最後一個執行緒的ThreadListEntry連結起來。
4.對於其他進程,置空鏈表時需要考慮同步問題。
如何結束haha.exe呢?
在XueTr“進程”視窗中選中haha.exe按右鍵,點擊“查看進程執行緒”,把看到的執行緒全部結束即可。
WS點可以把執行緒棧空間設小點,然後創建成百上千個執行緒……
沒有留言:
張貼留言