首页
社区
课程
招聘
[求助]通过EPROCESS下的ObjectTable下的TableCode获取进程全部句柄名字问题
2016-1-6 23:48 5045

[求助]通过EPROCESS下的ObjectTable下的TableCode获取进程全部句柄名字问题

2016-1-6 23:48
5045
前面写的太乱了
问题1:使用windbg “!object” 不是会显示一个name吗,那么name怎么得到?

问题2:比如说那个句柄是个文件对象,那么_OBJECT_HEADER结构后面跟着的就是_FILE_OBJECT结构
那我得到的句柄是个Key对象,那么_OBJECT_HEADER结构后面跟着的是什么结构? _KEY_OBJECT?貌似没有这个定义。
还有的比如Mutan Event对象 也没有_MUTAN_OBJECT,_EVENT_OBJECT这些结构.
问这些结构名称是什么....在哪可以得到..

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 256
活跃值: (48)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
kz丶cn 2016-1-7 00:03
2
0
<div class="quote"><i><i>最初由 <strong>kz丶cn<strong>发布<i>:<br >
比如我获取到的是file对象那么object_header后面跟着就是_FILE_OBJECT 里面有文件名 那么问题来了  比如我得到了一个mutant对象<br />
那么后面跟着的对象结构是在windbg里面查看是怎么写?就是那个互斥体对象的结构是什么样...<i><div> <br \/>问题可以转化为如何获取句柄名称
雪    币: 256
活跃值: (48)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
kz丶cn 2016-1-7 00:31
3
0
额 好像偏移算错了 应该还有createinfo的偏移…起床试试…
雪    币: 1088
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Tebox 2016-1-7 10:20
4
0
楼主凌乱的表达看得我一头雾水...
雪    币: 256
活跃值: (48)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
kz丶cn 2016-1-7 12:42
5
0
help!!!
雪    币: 129
活跃值: (323)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xed 2016-1-7 21:53
6
0
问题1:并不是所有句柄都有名字的!
名字得到方法: _OBJECT_HEADER_NAME_INFO结构里。_OBJECT_HEADER-0x10就是 _OBJECT_HEADER_NAME_INFO
问题2:没明白你的意思。

以下环境为XP  sp3。Win7的_OBJECT_TYPE有所不同.通过ObGetObjectType函数获得(好像是这个)。
查询本机进程列表。从中随便选取一个进程查看。比如QQProtect.exe.我这里eprocess是822e48f8 .
!process 0 0
............................
PROCESS 822e48f8  SessionId: 0  Cid: 07ec    Peb: 7ffd3000  ParentCid: 02b0
    DirBase: 1682d000  ObjectTable: e17f3378  HandleCount: 337.
    Image: QQProtect.exe
...........................

==============================
通过eprocess查询该进程的句柄表。
lkd> !handle 0 7 822E48F8

PROCESS 822e48f8  SessionId: 0  Cid: 07ec    Peb: 7ffd3000  ParentCid: 02b0
    DirBase: 1682d000  ObjectTable: e17f3378  HandleCount: 345.
    Image: QQProtect.exe

Handle table at e12a0000 with 345 entries in use

0004: Object: e10094c0  GrantedAccess: 000f0003 Entry: e12a0008
Object: e10094c0  Type: (823b5900) KeyedEvent
    ObjectHeader: e10094a8 (old version)
        HandleCount: 29  PointerCount: 30
        Directory Object: e1004748  Name: CritSecOutOfMemoryEvent

0008: Object: e152a100  GrantedAccess: 00000003 Entry: e12a0010
Object: e152a100  Type: (823b9040) Directory
    ObjectHeader: e152a0e8 (old version)
        HandleCount: 29  PointerCount: 65
        Directory Object: e1001100  Name: KnownDlls

000c: Object: 822e4c80  GrantedAccess: 00100020 (Inherit) Entry: e12a0018
Object: 822e4c80  Type: (823ebca0) File
    ObjectHeader: 822e4c68 (old version)
        HandleCount: 1  PointerCount: 1
        Directory Object: 00000000  Name: \WINDOWS\system32 {HarddiskVolume1}

0010: Object: 8213e740  GrantedAccess: 001f0003 (Protected) Entry: e12a0020
Object: 8213e740  Type: (823b6708) Event
    ObjectHeader: 8213e728 (old version)
        HandleCount: 1  PointerCount: 2

0014: Object: e1398640  GrantedAccess: 000f000f Entry: e12a0028
Object: e1398640  Type: (823b9040) Directory
    ObjectHeader: e1398628 (old version)
        HandleCount: 28  PointerCount: 32
        Directory Object: e1001100  Name: Windows
.....................................
==================================

查看eprocess结构获取到ObjectTable地址.(通过0x88链表获取所有进程eprocess结构)
dt _eprocess 822E48F8
   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER 0x1d147e7`cc083544
   +0x078 ExitTime         : _LARGE_INTEGER 0x0
   +0x080 RundownProtect   : _EX_RUNDOWN_REF
   +0x084 UniqueProcessId  : 0x000007ec Void
   +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x81ff58a0 - 0x81faa818 ]
   +0x090 QuotaUsage       : [3] 0x2848
   +0x09c QuotaPeak        : [3] 0x3650
   +0x0a8 CommitCharge     : 0x12c6
   +0x0ac PeakVirtualSize  : 0x52df000
   +0x0b0 VirtualSize      : 0x4edf000
   +0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x81ff58cc - 0x81faa844 ]
   +0x0bc DebugPort        : (null)
   +0x0c0 ExceptionPort    : 0xe167f798 Void
   +0x0c4 ObjectTable      : 0xe17f3378 _HANDLE_TABLE
............................

查看 _HANDLE_TABLE  获取到TableCode地址(是否遍历0x1c链表可以取句柄表数A???
lkd> dt _HANDLE_TABLE 0xe17f3378
ntdll!_HANDLE_TABLE
   +0x000 TableCode        : 0xe12a0000
   +0x004 QuotaProcess     : 0x822e48f8 _EPROCESS
   +0x008 UniqueProcessId  : 0x000007ec Void
   +0x00c HandleTableLock  : [4] _EX_PUSH_LOCK
   +0x01c HandleTableList  : _LIST_ENTRY [ 0xe10a01a4 - 0xe15f6614 ]

e12a0000      最后的0表示句柄表只有L0层,句柄表最大L2层(L0也算一层)。
L0可以存放511个句柄项
TableCode也有可能如下
e12a0000       L0句柄表
e12a0001       L1句柄表
e12a0002       L2句柄表

这里获取序号 为4的句柄名.(序号从4开始,为4的倍数。如4.8.C.10)
从1开始,到A结束???.地址总是8的倍数、
lkd> dd 0xe12a0000+1*8
e12a0008  e10094a9 000f0003 e152a0e9 00000003
e12a0018  822e4c6b 00100020 8213e729 021f0003
e12a0028  e1398629 000f000f e11db771 021f0001
e12a0038  82038551 000f016e 81fc15d1 000f00cf
e12a0048  82038551 000f016e 81fb73f9 00100003
e12a0058  81f43831 00100003 e12a7cb1 020f003f
e12a0068  e15e8b39 0002000f 82301f69 001f0003
e12a0078  81fa6b69 00100001 82140959 00100020

查询对象头地址要用TableCode(e12a0008)指针地址减 1.
lkd> dt _object_header e10094a9 - 1
nt!_OBJECT_HEADER
   +0x000 PointerCount     : 0n30
   +0x004 HandleCount      : 0n29

   +0x004 NextToFree       : 0x0000001d Void
   +0x008 Type             : 0x823b5900 _OBJECT_TYPE
   +0x00c NameInfoOffset   : 0x10 ''
   +0x00d HandleInfoOffset : 0 ''
   +0x00e QuotaInfoOffset  : 0 ''
   +0x00f Flags            : 0x32 '2'
   +0x010 ObjectCreateInfo : 0x00000001 _OBJECT_CREATE_INFORMATION
   +0x010 QuotaBlockCharged : 0x00000001 Void
   +0x014 SecurityDescriptor : 0xe100a716 Void
   +0x018 Body             : _QUAD

查看对象名。如果有的话.
lkd> dt _object_header_name_info e10094a8-10
nt!_OBJECT_HEADER_NAME_INFO
   +0x000 Directory        : 0xe1004748 _OBJECT_DIRECTORY
   +0x004 Name             : _UNICODE_STRING "CritSecOutOfMemoryEvent"
   +0x00c QueryReferences  : 1

用!object查看对象体加上Body   0x18偏移
e10094a9-1=e10094a8
lkd> !object e10094a8+0x18
Object: e10094c0  Type: (823b5900) KeyedEvent
    ObjectHeader: e10094a8 (old version)
    HandleCount: 29  PointerCount: 30
    Directory Object: e1004748  Name: CritSecOutOfMemoryEvent

查看对象类型
lkd> dt _OBJECT_TYPE 0x823b5900
ntdll!_OBJECT_TYPE
   +0x000 Mutex            : _ERESOURCE
   +0x038 TypeList         : _LIST_ENTRY [ 0x823b5938 - 0x823b5938 ]
   +0x040 Name             : _UNICODE_STRING "KeyedEvent"
   +0x048 DefaultObject    : 0x80561960 Void
   +0x04c Index            : 0x10
   +0x050 TotalNumberOfObjects : 1
   +0x054 TotalNumberOfHandles : 0x1d
   +0x058 HighWaterNumberOfObjects : 1
   +0x05c HighWaterNumberOfHandles : 0x20
   +0x060 TypeInfo         : _OBJECT_TYPE_INITIALIZER
   +0x0ac Key              : 0x6579654b
   +0x0b0 ObjectLocks      : [4] _ERESOURCE
游客
登录 | 注册 方可回帖
返回