首页
社区
课程
招聘
[原创]windbg查看E.KTHREAD,E.KPROCESS
发表于: 2012-5-6 14:57 9989

[原创]windbg查看E.KTHREAD,E.KPROCESS

2012-5-6 14:57
9989

一个进程创建了5个线程。。。
DWORD threadID;
        for (int i=0;i<5;i++)
        {
                CreateThread(0,0,(LPTHREAD_START_ROUTINE)thread,0,0,&threadID);
       
                char strBuffer[100];
                sprintf(strBuffer,"%d",threadID);
                                        OutputDebugString(strBuffer);
        //        OutputDebugString("%d",threadID);
                printf("%d\n",threadID);
        }
        return 0;

PROCESS 89c70da0  SessionId: 0  Cid: 0648    Peb: 7ffdb000  ParentCid: 05cc
    DirBase: 0c800300  ObjectTable: e10905c8  HandleCount:  48.
    Image: multhread.exe

kd> dt !_KPROCESS 89c70da0  
ntdll!_KPROCESS
   +0x000 Header           : _DISPATCHER_HEADER
   +0x010 ProfileListHead  : _LIST_ENTRY [ 0x89c70db0 - 0x89c70db0 ]
   +0x018 DirectoryTableBase : [2] 0xc800300
   +0x020 LdtDescriptor    : _KGDTENTRY
   +0x028 Int21Descriptor  : _KIDTENTRY
   +0x030 IopmOffset       : 0x20ac
   +0x032 Iopl             : 0 ''
   +0x033 Unused           : 0 ''
   +0x034 ActiveProcessors : 0
   +0x038 KernelTime       : 0xd
   +0x03c UserTime         : 5
   +0x040 ReadyListHead    : _LIST_ENTRY [ 0x89c70de0 - 0x89c70de0 ]
   +0x048 SwapListEntry    : _SINGLE_LIST_ENTRY
   +0x04c VdmTrapcHandler  : (null)
   +0x050 ThreadListHead   : _LIST_ENTRY [ 0x89e6c798 - 0x89de7700 ]

ThreadListHead进程中线程链表头

每一个结构都是_LIST_ENTRY

kd> dd 0x89e6c798
89e6c798  89de0550 89c70df0 00000000 00000000

kd> dd 89de0550
89de0550  89c71a60 89e6c798 00000000 00000000

kd> dd 89c71a60
89c71a60  89e5fe00 89de0550 00000000 00000000

kd> dd 89e5fe00
89e5fe00  89e6c4c0 89c71a60 00000000 00000000

kd> dd 89e6c4c0
89e6c4c0  89de7700 89e5fe00 00000000 00000000

kd> dd 89de7700
89de7700  89c70df0 89e6c4c0 00000000 00000000

kd> dd 89c70df0
89c70df0  89e6c798 89de7700 00000000 00000001

主线程加5个线程正好6个线程对应6个线程循环

这里是KTHREAD里面的ThreadListHead   

ETHREAD里面也有一个,同样的方式就能看到其实都是一一对应的

EPROCESS的0x190对应了ETHREAD链
+0x190 ThreadListHead   : _LIST_ENTRY [ 0x89e6c814 - 0x89de777c ]

kd> dd 0x89e6c814
89e6c814  89de05cc 89c70f30 00000000 00000000
89e6c824  00000000 00000007 001f03ff 00000000
89e6c834  00000000 00000000 00000000 0a08004f
89e6c844  7266744e 89e8a060 89dea0b8 00000000
89e6c854  00000000 00000000 00000000 00000000
89e6c864  00000000 00000000 00000000 00000000
89e6c874  00000000 00000000 00000000 0a080008
89e6c884  7266744e 89e6edf8 89e89100 00000000
kd> dd 89de05cc
89de05cc  89c71adc 89e6c814 00000000 00000000
89de05dc  00000000 00000007 001f03ff 00000000
89de05ec  00000000 00000000 00000000 0a07004f
89de05fc  64536d4d 89e65968 00000060 00000100
89de060c  00000100 e25a6000 00000100 00000100
89de061c  00000000 00000000 8a1d0df8 00000002
89de062c  00000003 00010007 63426343 0a0d0001
89de063c  61436d4d e259eb88 00000000 00000000
kd> dd 89c71adc
89c71adc  89e5fe7c 89de05cc 00000000 00000000
89c71aec  00000000 00000007 001f03ff 00000000
89c71afc  00000000 00000000 00000000 0a27004f
89c71b0c  63536343 013002ff 00000001 00006c00
89c71b1c  00000000 89c71b20 89c71b20 00100000
89c71b2c  00000000 00006c00 00000000 00006c00
89c71b3c  00000000 8a270948 00000000 00000000
89c71b4c  00000000 89c71b40 89e60630 00000000
kd> dd 89e5fe7c
89e5fe7c  89e6c53c 89c71adc 00000000 00000000
89e5fe8c  00000000 00000007 001f03ff 00000000
89e5fe9c  00000000 00000000 00000000 0001004f
89e5feac  74696157 0a050001 6e66744e 001c0707
89e5febc  00000000 00000000 89de6500 89de1ed0
89e5fecc  00000000 89d86420 89e2a330 00250005
89e5fedc  70627375 89dc7e48 89e65ee0 0000011c
89e5feec  00000100 00000001 00000000 02210004
kd> dd 89e6c53c
89e6c53c  89de777c 89e5fe7c 00000000 00000000
89e6c54c  00000000 00000007 001f03ff 00000000
89e6c55c  00000000 00000000 00000000 0a05004f
89e6c56c  7346744e 00000001 b12435b8 00000000
89e6c57c  ba047001 00000000 89e6c584 89e6c584
89e6c58c  81f03400 0a060005 20646156 00003b20
89e6c59c  00003b9f 89e88c48 00000000 00000000
89e6c5ac  04000000 89e83a20 e2580c00 e2580ff8
kd> dd 89de777c
89de777c  89c70f30 89e6c53c 00000000 00000000
89de778c  00000000 00000007 001f03ff 00000000
89de779c  00000000 00000000 00000000 0a05004f
89de77ac  6d665346 00000001 b124325c 00000000
89de77bc  00040001 00000000 89de77c4 89de77c4
89de77cc  0000003d 0a040005 70566343 8a2703a8
89de77dc  8a270420 8a270438 8a2703f0 8a2703d8
89de77ec  8a2703c0 0a270004 63536343 013002ff
kd> dd 89c70f30
89c70f30  89e6c814 89de777c 00000000 bac8b300
89c70f40  00000006 001f0fff 00008000 00000000
89c70f50  7ffdb000 00000000 00000006 00000000
89c70f60  00000006 00000000 00000088 00000000
89c70f70  00000198 00000000 000001b0 00000000
89c70f80  00000998 00000000 00000000 00000137
89c70f90  00000000 89e38b30 d4d9d8b4 01cd2b29
89c70fa0  00010000 00000394 0000036f 0000036f

而且两者对应的差都是7C,符合EPROCESS中的偏移差
0x89e6c814  - 0x89e6c798   =  7C
89de05cc   -  89de0550  7C

完全符合,学习了wrk中可是知道具体这些东西是怎么操作,对应的进程也是这样的。所以普通的隐藏进程EPROCESS中的链去除掉就可以了。。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (1)
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
dd !PsActiveProcessHead

ETHREAD,EPROCESS ,KTHREAD,KPROCESS

一个进程创建了5个线程。。。
DWORD threadID;
  for (int i=0;i<5;i++)
  {
    CreateThread(0,0,(LPTHREAD_START_ROUTINE)thread,0,0,&threadID);
  
    char strBuffer[100];
    sprintf(strBuffer,"%d",threadID);
          OutputDebugString(strBuffer);
  //  OutputDebugString("%d",threadID);
    printf("%d\n",threadID);
  }
  return 0;

PROCESS 89c70da0  SessionId: 0  Cid: 0648    Peb: 7ffdb000  ParentCid: 05cc
    DirBase: 0c800300  ObjectTable: e10905c8  HandleCount:  48.
    Image: multhread.exe

kd> dt !_KPROCESS 89c70da0  
ntdll!_KPROCESS
   +0x000 Header           : _DISPATCHER_HEADER
   +0x010 ProfileListHead  : _LIST_ENTRY [ 0x89c70db0 - 0x89c70db0 ]
   +0x018 DirectoryTableBase : [2] 0xc800300
   +0x020 LdtDescriptor    : _KGDTENTRY
   +0x028 Int21Descriptor  : _KIDTENTRY
   +0x030 IopmOffset       : 0x20ac
   +0x032 Iopl             : 0 ''
   +0x033 Unused           : 0 ''
   +0x034 ActiveProcessors : 0
   +0x038 KernelTime       : 0xd
   +0x03c UserTime         : 5
   +0x040 ReadyListHead    : _LIST_ENTRY [ 0x89c70de0 - 0x89c70de0 ]
   +0x048 SwapListEntry    : _SINGLE_LIST_ENTRY
   +0x04c VdmTrapcHandler  : (null)
   +0x050 ThreadListHead   : _LIST_ENTRY [ 0x89e6c798 - 0x89de7700 ]

ThreadListHead进程中线程链表头

每一个结构都是_LIST_ENTRY

kd> dd 0x89e6c798                 对应   +0x050 ThreadListHead   : _LIST_ENTRY [ 0x89e6c798 - 0x89de7700 ]
89e6c798  89de0550 89c70df0 00000000 00000000

kd> dd 89de0550
89de0550  89c71a60 89e6c798 00000000 00000000

kd> dd 89c71a60
89c71a60  89e5fe00 89de0550 00000000 00000000

kd> dd 89e5fe00
89e5fe00  89e6c4c0 89c71a60 00000000 00000000

kd> dd 89e6c4c0
89e6c4c0  89de7700 89e5fe00 00000000 00000000

kd> dd 89de7700
89de7700  89c70df0 89e6c4c0 00000000 00000000

kd> dd 89c70df0         对应   +0x050 ThreadListHead   : _LIST_ENTRY [ 0x89e6c798 - 0x89de7700 ]
89c70df0  89e6c798 89de7700 00000000 00000001
上面这一个是头!!!,他89c70df0 是EPROCESS中的地址,并不代表一个KTHREAD               
89c70df0 – 50 = 89c70da0  符合KPROCESS的地址

主线程加5个线程正好6个线程对应6个线程循环

这里是KTHREAD里面的ThreadListHead   

ETHREAD里面也有一个,同样的方式就能看到其实都是一一对应的

EPROCESS的0x190对应了ETHREAD链
+0x190 ThreadListHead   : _LIST_ENTRY [ 0x89e6c814 - 0x89de777c ]

kd> dd 0x89e6c814 _LIST_ENTRY [ 0x89e6c814 - 0x89de777c ]               
89e6c814  89de05cc 89c70f30 00000000 00000000

kd> dd 89de05cc
89de05cc  89c71adc 89e6c814 00000000 00000000

kd> dd 89c71adc
89c71adc  89e5fe7c 89de05cc 00000000 00000000

kd> dd 89e5fe7c
89e5fe7c  89e6c53c 89c71adc 00000000 00000000

kd> dd 89e6c53c
89e6c53c  89de777c 89e5fe7c 00000000 00000000

kd> dd 89de777c
89de777c  89c70f30 89e6c53c 00000000 00000000

kd> dd 89c70f30 _LIST_ENTRY [ 0x89e6c814 - 0x89de777c ]       
89c70f30  89e6c814 89de777c 00000000 bac8b300                               
这个同样是一个头,对应ETHREAD    89c70f30  - 190 = 89C70DA0完全符合啊
而且两者对应的差都是7C,符合EPROCESS中的偏移差
0x89e6c814  - 0x89e6c798   =  7C
89de05cc   -  89de0550  7C

ETHREAD的22C处放了LIST_ENTRY,通过某一个LIST_ENTRY的地址 减去22c 可以得到ETHREAD
kd> dd 0x89e6c814  - 22c = 89E6C5E8
kd> dt !_ethread 89E6C5E8 中的1EC出存放了进程ID和线程ID
kd> dd 89E6C5E8 +1ec = 89e6c7d4  
89e6c7d4  00000648 0000033c 00050005 00000000
                        进程ID1608线程ID        828  ,                                符合!!!!!!!!!
换一个测试下
89e6c53c -22c = 89E6C310
89E6C310 +1ec = 89E6C4FC
kd> dd 89E6C4FC
89e6c4fc  00000648                         000000d4 00050005 00000000
             同样的进程ID         212也是一个线程的ID

前面通过减去22C,利用KTHREAD的 减去 1b0 获取
0x89e6c798  - 1b0 = 89E6C5E8,不用计算就知道是一致了
2012-5-6 15:49
0
游客
登录 | 注册 方可回帖
返回
//