能力值:
( LV2,RANK:10 )
在线值:
2 楼
此帖必火 ,赶紧坐个沙发
能力值:
( LV2,RANK:10 )
在线值:
3 楼
冒个泡,占个座
能力值:
( LV2,RANK:10 )
在线值:
4 楼
强帖必顶!!
能力值:
( LV2,RANK:10 )
在线值:
5 楼
所有的系统结构尽管去ReactOS源代码里找好了。
能力值:
( LV2,RANK:10 )
在线值:
6 楼
学习了,站个位.
能力值:
( LV5,RANK:60 )
7 楼
补充一点句柄表项结构:
kd> dt _HANDLE_TABLE_ENTRY
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
typedef struct _HANDLE_TABLE_ENTRY {
//
// The pointer to the object overloaded with three ob attributes bits in
// the lower order and the high bit to denote locked or unlocked entries
//
union {
PVOID Object;
ULONG ObAttributes;
PHANDLE_TABLE_ENTRY_INFO InfoTable;
ULONG_PTR Value;
};
//
// This field either contains the granted access mask for the handle or an
// ob variation that also stores the same information. Or in the case of
// a free entry the field stores the index for the next free entry in the
// free list. This is like a FAT chain, and is used instead of pointers
// to make table duplication easier, because the entries can just be
// copied without needing to modify pointers.
//
union {
union {
ACCESS_MASK GrantedAccess;
struct {
USHORT GrantedAccessIndex;
USHORT CreatorBackTraceIndex;
};
};
LONG NextFreeTableEntry;
};
} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;
能力值:
( LV2,RANK:10 )
在线值:
8 楼
感谢您的分享。
一开始看不太懂,现在懂了,补充一下自己的理解笔记于下
==
今天如果我们有一个 HANDLE hd1 = 0x074C;
想要解读他,去读出他真正的内容,最终都是要找到 hd1 所对应的 Handle Table,然后查表。这个 Handle Table 假设叫 arrHTE,则其资料型态为 HANDLE_TABLE_ENTRY arrHTE[511];
对任一个 Process 来说,这种 Handle Table 至少有一个,最多可以有 1023 * 1023 个。
[已知] 某个 Process 的 EPROCESS.ObjectTable 内记录的位址,只是用来找出 TableCode。
[已知] 如果告诉你 Handle Table 只有一层,那代表 Handle Table 的数目只有一个;有两层时,其数目有 1023 个;当然有三层时,其数目就是之前说的 1023*1023 个。
[已知] 最多有三层 Handle Table,从 TableCode 的 bit31~bit2 可取出一个位址,姑且叫他为 HADDR,其资料型态要视情况而定。
==
如果只有一个 Handle Table,我们说:
只有一层句柄表、只有一个第零层句柄表、只有最底层句柄表。
此时 HADDR 必然等于 arrHTE。
从 hd1 的 bit2~bit10 这 9 个位元去读出索引值 0x1D3 = 467; 则由 arrHTE[467] 取出的 HANDLE_TABLE_ENTRY 结构,就能找到 hd1 的真正内容。
==
如果有两层句柄表,那其实是说 Handle Tables 的数量,总共有 1023 个,也就是可以找到 1023 个 arrHTE 这种表。
此时 HADDR 的资料型态为:L1HT [1023];
其中 L1HT 的资料型态又为:
typedef HANDLE_TABLE_ENTRY (*)[511] L1HT;
换言之,假设 hd1 的 bit11~bit20 这 10 个位元去读出索引值,假设是3,则 *(HADDR+3) 得到的位址就是 1023 个 Handle Table 中,真正记载 hd1 资料的那个 arrHTE 所在处。
同理,当有第三层索引时,HADDR 的资料型态为:
L2HT [1023];
其中 L2HT 的资料型态为:
typedef L1HT (*)[1023]; 参考:
http://www.phate.tw/viewthread.php?tid=8584
能力值:
( LV2,RANK:10 )
9 楼
学习了,过来看看又有新的收获,谢谢楼主!
能力值:
( LV8,RANK:150 )
10 楼
我的问题 还是删了吧,太白了
能力值:
( LV8,RANK:150 )
11 楼
。。。。。。
能力值:
( LV2,RANK:10 )
在线值:
12 楼
这个现在还看不懂
用到了再回来找吧
能力值:
( LV2,RANK:10 )
13 楼
好安逸的资料!!!谢谢楼主啊!
能力值:
( LV4,RANK:50 )
在线值:
14 楼
新年第一贴,新年快乐!!!!
能力值:
( LV2,RANK:10 )
15 楼
mark
能力值:
( LV4,RANK:50 )
16 楼
句柄貌似很重要
能力值:
( LV4,RANK:50 )
17 楼
学习句柄~~~必看