2011年5月28日 星期六

超強驅動防行程終止

2011.5.29測試有效


【提示】能加驅動進內核,就沒必要弄EXE了,所以我個人覺得沒啥實際用途,僅供觀看



Windows
會給每一個進程建立一個EPROCESS結構,給每一個執行緒建立ETHREAD結構,EPROCESS結構第一個成員是KPROCESS結構,ETHREAD結構第一個成員是KTHREAD結構。每個進程的執行緒的ETHREAD結構都會按下圖所示連結起來: 


 Rootkit  


 


裡面有兩條鏈表。通過遍歷這兩條鏈表,可以得到一個進程所有的執行緒。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彈出對話方塊,此時工作管理員、XueTr360進程管理器都可以結束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.exeEPROCESS

    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
50h190h194h都是硬編碼,適用於Windows XP SP3

    lea ebx,[ebx-88h]        //EBX
haha.exeEPROCESS

    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
點可以把執行緒棧空間設小點,然後創建成百上千個執行緒……


沒有留言:

張貼留言