關(guān)于進(jìn)程枚舉2009-10-18 14:30使用QuerySystemInformation的效果是下面的調(diào)用ProcessInformation->ExpGetProcessInformation-> PEB中的ActiveProcess雙向鏈表
昨天的PspCidTable在不同版本的HANDLE_TABLE結(jié)構(gòu)體相差非常大,不過在內(nèi)核模式中使用ExEnumHandleTable也許能避免這一差異,還沒有式
也就是說如果進(jìn)程斷鏈,NtQuerySystemInformation就失敗了,并且斷鏈很不好收拾。
所以還是恢復(fù)正常的函數(shù)調(diào)用后,for(){openProcess(i)}稍微好一點(diǎn)
附上某彪悍解決方案:
進(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的每一個進(jìn)程的SessionProcessLinks獲得進(jìn)程表h
8.遍歷表c的每一個進(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的每一個進(jìn)程的MmProcessLinks得到表o
14.綜合上面的進(jìn)程表得到表p
15.對表p每一個進(jìn)程做HandleTable,Vm.WorkXX,MmProcessXX,SessionProcessList掃描得到表q
16.枚舉HWNDHandle得到進(jìn)程表r
17.枚舉JobObject得到表s
18.綜合得表t,此時枚舉結(jié)束~~
動態(tài)部分:
KiReadyThread
和KiSwapContext的鉤子
還有KiService鉤子
還有CreateProcessNotifyRoutine和CreateThreadNotifyRoutine
NtCreateThread鉤子
動態(tài)維護(hù)一張表,靜態(tài)枚舉結(jié)束后綜合兩表~
?