返回信息流从对ExpLookupHandleTableEntry的分析来看XP内核句柄表的结构变化
2006.12.31-2007.01.01 by flyingkisser
谨以此文怀念我06年去世的姥姥...
同时也祝福Mm的父亲今年能把病养好...
本文只是根据对ExpLookupHandleTableEntry的分析得出的结论,不能说这个结论是100%正确的
2k下的句柄表结构,可以参看jiurl前辈的文章,小弟就是看它的文章入门的....
下面提到的结构,相对偏移,都是针对XP的。
目录
1.和句柄表相关的几个重要结构
2.ExpLookupHandleTableEntry()的工作流程
3.句柄表的结构,句柄自身的结构
4.句柄====>对象
5.两个实例
****************************
和句柄表相关的几个重要结构
****************************
kd> dt nt!_HANDLE_TABLE
+0x000 TableCode : Uint4B
+0x004 QuotaProcess : Ptr32 _EPROCESS
+0x008 UniqueProcessId : Ptr32 Void
+0x00c HandleTableLock : [4] _EX_PUSH_LOCK
+0x01c HandleTableList : _LIST_ENTRY
+0x024 HandleContentionEvent : _EX_PUSH_LOCK
+0x028 DebugInfo : Ptr32 _HANDLE_TRACE_DEBUG_INFO
+0x02c ExtraInfoPages : Int4B
+0x030 FirstFree : Uint4B
+0x034 LastFree : Uint4B
+0x038 NextHandleNeedingPool : Uint4B
+0x03c HandleCount : Int4B
+0x040 Flags : Uint4B
+0x040 StrictFIFO : Pos 0, 1 Bit
kd> dt nt!_HANDLE_TABLE_ENTRY
+0x000 Object : Ptr32 Void
+0x000 ObAttributes : Uint4B
+0x000 InfoTable : Ptr32 _HANDLE_TABLE_ENTRY_INFO
+0x000 Value : Uint4B
+0x004 GrantedAccess : Uint4B
+0x004 GrantedAccessIndex : Uint2B
+0x006 CreatorBackTraceIndex : Uint2B
+0x004 NextFreeTableEntry : Int4B
_HANDLE_TABLE通过EPROCESS偏移0c4h处找到
HANDLE_TABLE的结构如下面所述
TableCode就是2k系统中此结构的Table成员
HANDLE_TABLE->TableCode才是所谓的“句柄表”的地址
这时,通过KPROCESS->ObjectTable->TableCode找到了句柄表的地址
那么句柄表的结构,句柄自身的结构,相比2k有什么变化呢?
通过句柄如何在句柄表中索引到对象呢?
***************************************
ExpLookupHandleTableEntry()的工作流程
***************************************
一.ExpLookupHandleTableEntry()的参数
参数1 KPROCESS->ObjectTable
参数2 handle
二.工作流程
1.如果handle大于等于HANDLE_TABLE->NextHandleNeedingPool,清空EAX返回
2.第一层句柄表的地址如果4字节对齐的,
根据handle的bit10--bit02定位handle_table_entry
3.如果第一层句柄表地址的最后一位为1,
以bit20--bit11作第二层表中在第一层表中的偏移,
再以handle的bit10--bit02在第二层表中定位handle_table_entry
4.如果第一句柄表的地址最后一位不为0也不为1
以bit30--bit21作为第二层表中在第一层表中的偏移,
以bit20--bit11作为第三层表中在第二层表中的偏移,
再以handle的bit10--bit02在第三层表中定位handle_table_entry
***************************************
句柄表的结构,句柄自身的结构
***************************************
句柄表的结构,可能只有一层表,也可能有两层,也可能有三层
这是由KPROCESS->ObjectTable->TableCode的值的后2位决定的
后2位为0 只有一层表
第一层 偏移08处开始是HANDLE_TABLE_ENTRY结构
句柄 bit0,bit1 标志位
bit10--bit02 9个bit HANDLE_TABLE_ENTRY结构的表内偏移
后2位为1 会有二层表
第一层 第二层表的地址
第二层 偏移08处开始是HANDLE_TABLE_ENTRY结构
bit0,bit1 标志位
bit10--bit02 9个bit HANDLE_TABLE_ENTRY结构的表内偏移
bit20--bit11 10个bit 第二层表在第一层表中的索引
bit30--bit21 10个bit
bit31 标志位,我猜
后2位不为0和1 会有三层表
第一层 第二层表的地址
第二层 第三层表的地址
第三层 偏移08处开始是HANDLE_TABLE_ENTRY结构
bit0,bit1 标志位
bit10--bit02 9个bit HANDLE_TABLE_ENTRY结构的表内偏移
bit20--bit11 10个bit 第三层表在第二层表中的索引
bit30--bit21 10个bit 第二层表在第一层表中的索引
bit31 标志位,我猜
所以,可以看出表的层次如果不同,句柄表自身的结构,句柄的结构,都不太相同
******************
句柄====>对象
******************
esi=第一层表四字节对齐后的值
eax=handle>>2
ecx=handle>>2
一层表
806036ee 8d04c6 lea eax,[esi+eax*8];eax=TableCode+(handle>>2)*8
bit0,bit1 标志位
bit10--bit02 9个bit 表内偏移
双层表
806036e6 c1e909 shr ecx,9 ;ecx=(handle>>2)>>9
806036e9 8b0c8e mov ecx,dword ptr [esi+ecx*4] ;ecx=[TableCode+((handle>>2)>>9)*4]
806036dc 25ff010000 and eax,1FFh ;eax=(handle>>2)&1ffh
806036e1 8d04c1 lea eax,[ecx+eax*8] ;eax=[TableCode+((handle>>2)>>9)*4]+((handle>>2)&1ffh)*8
bit0,bit1 标志位
bit10--bit02 9个bit 表内偏移
bit20--bit11 10个bit 第二层表在第一层表中的索引
bit30--bit21 10个bit
bit31 标志位,我猜
三层表
806036c7 c1e913 shr ecx,13h ;ecx=(handle>>2)>>19
806036ca 8bd1 mov edx,ecx ;edx=(handle>>2)>>19
806036cc 8b0c8e mov ecx,dword ptr [esi+ecx*4] ;ecx=[TableCode+((handle>>2)>>19)*4]
806036cf c1e213 shl edx,13h ;edx=((handle>>2)>>19)<<19
806036d2 2bc2 sub eax,edx ;eax=handle>>2-((handle>>2)>>19)<<19
806036d4 8bd0 mov edx,eax ;edx=handle>>2-((handle>>2)>>19)<<19
806036d6 c1ea09 shr edx,9 ;edx=(handle>>2-((handle>>2)>>19)<<19)>>9
806036d9 8b0c91 mov ecx,dword ptr [ecx+edx*4] ;ecx=[(handle>>2)>>19+((handle>>2-((handle>>2)>>19)<<19)>>9)*4]
806036dc 25ff010000 and eax,1FFh ;eax=(handle>>2-((handle>>2)>>19)<<19)&1ffh
806036e1 8d04c1 lea eax,[ecx+eax*8] ;eax=[(handle>>2)>>19+((handle>>2-((handle>>2)>>19)<<19)>>9)*4]+((handle>>2-((handle>>2)>>19)<<19)&1ffh)*8
bit0,bit1 标志位
bit10--bit02 9个bit 表内偏移
bit20--bit11 10个bit 第三层表在第二层表中的索引
bit30--bit21 10个bit 第二层表在第一层表中的索引
bit31 标志位,我猜
*********
两个实例
*********
一.单层表
kd> !process 0 0
PROCESS ff2ec380 SessionId: 0 Cid: 0820 Peb: 7ffdf000 ParentCid: 04e0
DirBase: 049803a0 ObjectTable: e11a0800 HandleCount: 58.
Image: taskmgr.exe
kd> !handle 0 3 0820
0010: Object: e1d18748 GrantedAccess: 000f003f (Protected) Entry: e167e020
Object: e1d18748 Type: (81ba2800) Key
ObjectHeader: e1d18730
HandleCount: 1 PointerCount: 1
Directory Object: 00000000 Name: \REGISTRY\MACHINE
进程 taskmgr.exe
handle_table地址 e11a0800h
要寻址的句柄 10h
kd> dd e11a0800h l1
e11a0800 e167e000
第一层表地址 e167e000
kd> dd e167e000+(10>>2)*8 l2
e167e020 e1d18731 020f003f
对象头地址 e1d18730
kd> !object e1d18730+18
Object: e1d18748 Type: (81ba2800) Key
ObjectHeader: e1d18730
HandleCount: 1 PointerCount: 1
Directory Object: 00000000 Name: \REGISTRY\MACHINE
二.双层表
kd> !process 0 0
PROCESS 81901548 SessionId: 0 Cid: 0568 Peb: 7ffd7000 ParentCid: 0224
DirBase: 049801c0 ObjectTable: e1cccd60 HandleCount: 60.
Image: Apache.exe
kd> !handle 0 3 0568
0108: Object: ff3a30f0 GrantedAccess: 001f0fff Entry: e1cd5210
Object: ff3a30f0 Type: (81ba9ca0) Process
ObjectHeader: ff3a30d8
HandleCount: 2 PointerCount: 259
进程 Apache.exe
handle_table地址 e1cccd60
要寻址的句柄 108h
kd> dd e1cccd60 l1
e1cccd60 e1cd5000
第一层表地址 e1cd5000
kd> dd e1cd5000+(108>>2)*8 l2
e1cd5210 ff3a30d9 001f0fff
对象头地址 ff3a30d8
kd> !object ff3a30d8+18
Object: ff3a30f0 Type: (81ba9ca0) Process
ObjectHeader: ff3a30d8
HandleCount: 2 PointerCount: 259
三.三层表
我一直没有断在这个相关位置,望后来人补充吧!
这是一条镜像帖。来源:北邮人论坛 / security / #6828同步于 2006/12/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
[原创]从对ExpLookupHandleTableEntry的分析来看XP内核句柄表的
flyingkisser
2006/12/31镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
本来是想在年前放出那篇
NtQuerySystemInformaion大全的
看来注定了这是年后的事了,也好,再仔细把语言组织一下
把没有逆向的函数再逆向一下....
【 在 flyingkisser (齐天大猫) 的大作中提到: 】
: 从对ExpLookupHandleTableEntry的分析来看XP内核句柄表的结构变化
: 2006.12.31-2007.01.01 by flyingkisser
: 谨以此文怀念我06年去世的姥姥...
: ...................
帖一张2000的三层句柄表结构方便大家对比。。。
其实。。。说实话。。。我也不是很懂。。。等我先把那几本《Undocument XXXX》 看完再说。。= =
【 在 flyingkisser 的大作中提到: 】
: 从对ExpLookupHandleTableEntry的分析来看XP内核句柄表的结构变化
: 2006.12.31-2007.01.01 by flyingkisser
: 谨以此文怀念我06年去世的姥姥...
: ...................