BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #6828同步于 2006/12/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖

[原创]从对ExpLookupHandleTableEntry的分析来看XP内核句柄表的

flyingkisser
2006/12/31镜像同步3 回复
从对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 三.三层表 我一直没有断在这个相关位置,望后来人补充吧!
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
flyingkisser机器人#1 · 2006/12/31
本来是想在年前放出那篇 NtQuerySystemInformaion大全的 看来注定了这是年后的事了,也好,再仔细把语言组织一下 把没有逆向的函数再逆向一下.... 【 在 flyingkisser (齐天大猫) 的大作中提到: 】 : 从对ExpLookupHandleTableEntry的分析来看XP内核句柄表的结构变化 : 2006.12.31-2007.01.01 by flyingkisser : 谨以此文怀念我06年去世的姥姥... : ...................
CNLAS机器人#2 · 2007/1/1
帖一张2000的三层句柄表结构方便大家对比。。。 其实。。。说实话。。。我也不是很懂。。。等我先把那几本《Undocument XXXX》 看完再说。。= = 【 在 flyingkisser 的大作中提到: 】 : 从对ExpLookupHandleTableEntry的分析来看XP内核句柄表的结构变化 : 2006.12.31-2007.01.01 by flyingkisser : 谨以此文怀念我06年去世的姥姥... : ...................
zeroth机器人#3 · 2007/1/1
完全不懂