(转)[note]枚举进程之一(基础科普篇)

http://www.cnblogs.com/Tbit/archive/2010/09/16/1828442.html

关于进程的枚举,以及查看进程信息,和查杀进程...等等..都是很古老的东西了,但是基础是改变不了的.

首先看看关于进程的枚举吧,当前ark的驱动枚举进程,离不开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钩子
动态维护一张表,静态枚举结束后综合两表~

 

虽然是思路,但还是具体看看实现机制吧.偶能写多少算多少,尽量写全~

1.关于native api 获取表a
这个是通过 ZwQuerySystemInformation()函数来实现的,传入 PROCESS_SYSTEM_INFORMATION,即可获得进程信息.

或者使用ZwQueryProcessInformation()函数..自己可以参考网上的很多代码~

 

ps下:关于这个native api 的进程隐藏,因为任务管理器,就是调用ZwQuerySystemInformation()来显示进程的,所以

只要在SSDT中,HOOK掉ZwQuerySystemInformation(),把自己需要隐藏的进程过滤掉就可以了...

具体代码可以参考Rootkit.com上的fuzen_op的HideProcessHookMdl.zip 这个程序

https://www.rootkit.com/download.php?browse=1&user=fuzen_op

 

代码

 

 

代码

 

 

2.关于使用ActiveList获取表b

通过使用PsGetCurrentProcess()获得当前进程的PEPROCESS指针,即pCurrentEprocess,然后定位到ActiveList域,

也就是ActiveList=pCurrentEprocess+0x88;

(我这里是 winxp sp3),2k下和NT下略有不同,至于vista和win7没弄过..嘿嘿)

lkd> dt _eprocess 893d2020  
nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER 0x1cb55a9`3c885916
   +0x078 ExitTime         : _LARGE_INTEGER 0x0
   +0x080 RundownProtect   : _EX_RUNDOWN_REF
   +0x084 UniqueProcessId  : 0x00000bc0 
   +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x8987a848 - 0x8945fca0 ]

 

ActiveProcessLinks域是个List_Entry结构.它的FLINK和BLINK成员指向前一个EPROCESS,和后一个EPROCESS

因此可以通过Activelist,遍历所有的EPROCESS结构,从而实现对进程枚举.

(贴个教主的code)

 

代码
posted @ 2013-01-25 13:13  himessage  阅读(723)  评论(0编辑  收藏  举报