2011年7月23日星期六

不HOOK任何函數,讓任務管理器、XueTr、360進程管理器無法結束保護進程

作 者: 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點可以把線程棧空間設小點,然後創建成百上千個線程……

没有评论:

发表评论