作 者: KiDebug
時 間: 2011-05-29,11:17:38
鏈接: http://bbs.pediy.com/showthread.php?t=134645
【提示】能加驅動進內核,就沒必要弄EXE了,所以我個人覺得沒啥實際用途,僅供觀看
Windows會給每一個進程建立一個EPROCESS結構,給每一個線程建立ETHREAD結構,EPROCESS結構第一個成員是KPROCESS結構,ETHREAD結構第一個成員是KTHREAD結構。每個進程的線程的ETHREAD結構都會按下圖所示鏈接起來:
無標題.png下載此附件需要消耗2Kx,下載中會自動扣除。
裡面有兩條鍊錶。通過遍歷這兩條鍊錶,可以得到一個進程所有的線程。 Windows在執行線程調度時,不會去管這兩條鍊錶。只有當新建一個線程時,會加入到鍊錶中,一個線程退出時,會從鍊錶中移除。
如果在EPROCESS中將這兩條鍊錶置空,會發生什麼事呢?
以下是驗證步驟:
【注意】請先關閉360安全衛士,以免加載驅動時提示。驅動代碼中用了一堆的硬編碼,所以請確保操作系統為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點可以把線程棧空間設小點,然後創建成百上千個線程……
没有评论:
发表评论