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