2.找到進程的線程, PostThreadMessage 發送 WM_QUIT 消息結束主線程
3.OpenThread ---> TerminateThread
4.RemoteExitProcess,以 PROCESS_CREATE_THREADVM_OPERATION方式打開進程,然后創建個遠程線程,線程開始地址是 ExitProcess 參數0 ,程序自行了斷.
5.首先確保進程能被打開(8和9介紹),然后創建一個線程去 DebugActiveProcess 他,然后什么也不做退出線程,程序無人接管,于是掛掉~
6.以 VM_OPERATION方式打開進程, 然后調用 NtUnmapViewOfSection 卸載掉他的ntdll.dll 這個時候程序還未崩潰,然后再隨意發送個消息給它,它的程序一經調用直接就會異常,但是ntdll已經掛掉,無法用戶空間異常處理,自行了斷~(我認為這個方法應和往進程空間寫垃圾數據屬于同一方法)
7.發送鍵盤 ESC 單擊的消息(這個和發送窗口消息不能算同一個的).
8.下面是重點要介紹的:-----------------------------
由于CrackMeApp打開了驅動的文件句柄,所以直接不能卸載驅動的.因此需要把這個句柄給關閉.
于是怎么去獲取遠程的文件句柄呢?首先想到的是 DuplicateHandle ,
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle, // handle to source process
HANDLE hSourceHandle, // handle to duplicate
HANDLE hTargetProcessHandle, // handle to target process
LPHANDLE lpTargetHandle, // duplicate handle
DWORD dwDesiredAccess, // requested access
BOOL bInheritHandle, // handle inheritance option
DWORD dwOptions // optional actions
);
先看最后一個參數:
DUPLICATE_CLOSE_SOURCE
Closes the source handle. This occurs regardless of any error status returned.
DUPLICATE_SAME_ACCESS
Ignores the dwDesiredAccess parameter. The duplicate handle has the same access as the source handle.
也就是說當我們選擇DUPLICATE_CLOSE_SOURCE時,遠程的句柄就會自動關閉了
第一個參數,我們可以直接OpenProcess(PROCESS_DUP_HANDLE ,XXX)獲得,
第二個參數比較難找,就是CrackMeApp進程里打開驅動的句柄,要想獲得這個我們得借助個ntdll.dll中的一個 API, ZwQuerySystemInformation 這個可以獲得整個系統中所有的句柄信息,我們可以全部找出來,然后判斷哪些句柄是屬于 CrackMeApp進程的,并且ObjectTypeNumber類型為文件類型的.關于這個的具體實現可以看我的實現代碼.
typedef struct _SYSTEM_HANDLE_INFORMATION { // Information Class 16
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags; // 0x01 = PROTECT_FROM_CLOSE, 0x02 = INHERIT
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
這樣CrackMeApp進程中通過CreateFile打開的句柄就全找到了,一般有三個,我們可以把它全部都關閉,也可以只關閉最后一個(因為最后就是打開驅動的句柄,打開驅動是最后一次調用CreateFile).
這個我就得到了第二個參數,下面的參數都很簡單了~
于是一調用這個 DuplicateHandle ,我們不僅關閉了遠程的句柄,而且還獲得了驅動的句柄,為所欲為了~~
于是我的第8個方法就是發送IO請求到CrackMeApp的驅動里,請求它修改被保護的進程PID為0,這樣我們就可以用常規方法結束它了(Open+Terminate)
9.上面方法的遠程句柄關閉了,我們就自然可以去卸載驅動了~于是這個就是去 ZwUnloadDriver或者停止了它的Service.這樣再用常規方法結束~~
10.所有的win32子系統的進程都會有一個句柄在csrss.exe進程里面,CrackMeApp.exe自然也在,于是我們就可以把 csrss.exe 里面的句柄給 dup 過來自己使用,DUP過來的方法大致和上面相同,不過判斷的進程該為csrss,類型要該為5(進程句柄的類型),然后呢對每個進程句柄做一個ZwQueryInformationProcess() 參數為 BASIC_INFORMATION=0 的查詢,看看這個句柄是不是CrackMeApp的 ,如果是就直接拿來用,TerminateProcess之~
---------------以下是用借助驅動來結束的-----------
11.用驅動patch了它的保護的PID值,然后用戶空間里常規方法~
12.用驅動恢復SSDT中ZwOpenProcess,這里我偷懶直接硬編碼,調用那個驅動自身的恢復SSDT的函數,嘿嘿~~之后用戶空間里常規方法(這個和11不算一種的)
13.直接在驅動里調用 NtOpenProcess繞過它的SSDT HOOK就可以了,不過應該注意的是需要先把 KTHREAD 結構體里的 PreviousMode 值改為KernelMode,否則有可能會失敗的~
獲取句柄后調用ZwTerminateProcess,這個不需要修改PreviousMode,直接用就可以~
14.和13的方法不同的是打開句柄的方法,使用了 PsLookupProcessByProcessId+ObOpenObjectByPointer的方法,然后還是調用 ZwTerminateProcess~(這個也要算不同的,,因為規則上曾經說過ObXXX和NtXX算不同的API的)
15.最后一種了,首先獲取CrackMeApp線程的TID,然后根據 PsLookupThreadByThreadId 獲取 EThread 指針,然后向這個線程插入APC調用,在APC過程函數中,主要是執行的 ZwTerminateProcess( 0xffffffff, 0 );這個東西就是結束自己的意思(嘿嘿,,這個方法是我從IceSword里面摳出來的)~~本來想去調用Nt/ZwTerminateThread,結果那個函數沒導出還得自己找,于是索性就簡單點ZwTerminateProcess了.
16 內存清零大法
http://hi.baidu.com/%C3%F7%ED%F8%B5%C4%D0%C4/blog/item/255cd583fe406698f603a6f2.html
17 作業方式終止
ZwOpenProcess->ZwCreateJobObject->ZwAssignProcessToJobObject->ZwTerminateJobObject
二 枚舉進程
轉自V大http://hi.baidu.com/killvxk這是V大的空間,請自己查找
killvxk的驅動查進程:
1.native api獲得進程表a
2.通過activelist獲得進程表b
3.通過pspCidTable獲得進程表c
4.通過handletablelisthead獲得進程表d
5.通過csrss的handletable用2種方法枚舉獲得進程表e和f
6.通過掃描當前進程的handletable獲得進程表g
7.遍歷表c的每一個進程的SessionProcessLinks獲得進程表h
8.遍歷表c的每一個進程Vm.WorkingSetExpansionLinks獲得進程表i
9.通過Typelist分別取process和thread的表j和表k
10.通過表k得到進程表l
11.搜索內存中的threadobject和processobject得到進程表m
12.通過Wait/Dispatch得到進程表n
13.如果系統是Win2003以上遍歷表c的每一個進程的MmProcessLinks得到表o
14.綜合上面的進程表得到表p
15.對表p每一個進程做HandleTable,Vm.WorkXX,MmProcessXX,SessionProcessList掃描得到表q
16.枚舉HWNDHandle得到進程表r
17.枚舉JobObject得到表s
18.綜合得表t,此時枚舉結束~~
動態部分:
KiReadyThread
和KiSwapContext的鉤子
還有KiService鉤子
還有CreateProcessNotifyRoutine和CreateThreadNotifyRoutine
NtCreateThread鉤子
動態維護一張表,靜態枚舉結束后綜合兩表~
三 進程隱藏
轉自http://hi.baidu.com/sudami/blog/item/96f1f245db0e2c25cffca385.html
1 HOOK SSDT---> ZwQuerySystemInformation
2 在EPROCESS中的ActiveProcessLinks 里摘除自身,也就是操作鏈表,摘除一個結點.
3 從csrss.exe進程的句柄表中摘除自身 參看 futo_enhaced 從http://hi.baidu.com/sudami/搜索下載
4 掛鉤SwapContext,自己實現線程調度
參考地址:http://hi.baidu.com/%C3%F7%ED%F8%B5%C4%D0%C4/blog/item/8852b4c58b5b72a18226ac17.html
5 從PspCidTable表中摘除自身 參看 futo_enhaced 從http://hi.baidu.com/sudami/搜索下載
6 清除標志 防止暴力搜索內存
四 進程防殺
(貌似只有思路,其實代碼網上都有,請自行GOOGLE吧)
HOOK法:
1 HOOK HOOK NtTerminateProcess
2 HOOK ZWOpenProcess/ ObReferenceObjectByHandle
參考:http://hi.baidu.com/%C3%F7%ED%F8%B5%C4%D0%C4/blog/item/6a4486f8a5c82d51242df253.html
3 HOOK hook KiInsertQueueApc/KeInsertQueueApc
其實從上到下可HOOK的地方很多,請發揮想象力。
DKOM法:
5 kernel apc disable
6 抹去PspCidTable
7 thread terminated
8 thread cross thread flags