📄 jiurl玩玩win2k 对象.htm
字号:
"WmiGuid"<BR><BR>#define OB_TYPE_TAG_TYPE 'TjbO' // [ObjT]
"Type"<BR>#define OB_TYPE_TAG_DIRECTORY 'eriD' // [Dire]
"Directory"<BR>#define OB_TYPE_TAG_SYMBOLIC_LINK 'bmyS' // [Symb]
"SymbolicLink"<BR>#define OB_TYPE_TAG_TOKEN 'ekoT' // [Toke]
"Token"<BR>#define OB_TYPE_TAG_PROCESS 'corP' // [Proc]
"Process"<BR>#define OB_TYPE_TAG_THREAD 'erhT' // [Thre]
"Thread"<BR>#define OB_TYPE_TAG_JOB ' boJ' // [Job ] "Job"<BR>#define
OB_TYPE_TAG_EVENT 'nevE' // [Even] "Event"<BR>#define
OB_TYPE_TAG_EVENT_PAIR 'nevE' // [Even] "EventPair"<BR>#define
OB_TYPE_TAG_MUTANT 'atuM' // [Muta] "Mutant"<BR>#define
OB_TYPE_TAG_CALLBACK 'llaC' // [Call] "Callback"<BR>#define
OB_TYPE_TAG_SEMAPHORE 'ameS' // [Sema] "Semaphore"<BR>#define
OB_TYPE_TAG_TIMER 'emiT' // [Time] "Timer"<BR>#define OB_TYPE_TAG_PROFILE
'forP' // [Prof] "Profile"<BR>#define OB_TYPE_TAG_WINDOW_STATION 'dniW' //
[Wind] "WindowStation"<BR>#define OB_TYPE_TAG_DESKTOP 'kseD' // [Desk]
"Desktop"<BR>#define OB_TYPE_TAG_SECTION 'tceS' // [Sect]
"Section"<BR>#define OB_TYPE_TAG_KEY ' yeK' // [Key ] "Key"<BR>#define
OB_TYPE_TAG_PORT 'troP' // [Port] "Port"<BR>#define
OB_TYPE_TAG_WAITABLE_PORT 'tiaW' // [Wait] "WaitablePort"<BR>#define
OB_TYPE_TAG_ADAPTER 'padA' // [Adap] "Adapter"<BR>#define
OB_TYPE_TAG_CONTROLLER 'tnoC' // [Cont] "Controller"<BR>#define
OB_TYPE_TAG_DEVICE 'iveD' // [Devi] "Device"<BR>#define OB_TYPE_TAG_DRIVER
'virD' // [Driv] "Driver"<BR>#define OB_TYPE_TAG_IO_COMPLETION 'oCoI' //
[IoCo] "IoCompletion"<BR>#define OB_TYPE_TAG_FILE 'eliF' // [File]
"File"<BR>#define OB_TYPE_TAG_WMI_GUID 'GimW' // [WmiG] "WmiGuid"<BR><BR>对
Type 类型的对象就介绍到这里。<BR><BR><BR><B>其他</B><BR><BR>可选结构之一的
OBJECT_HANDLE_DB <BR><BR>OBJECT_HANDLE_DB 结构定义如下<BR><BR>typedef
struct _OBJECT_HANDLE_DB<BR>{<BR>/*000*/ union<BR>{<BR>/*000*/ struct
_EPROCESS *Process;<BR>/*000*/ struct _OBJECT_HANDLE_DB_LIST
*HandleDBList;<BR>/*004*/ };<BR>/*004*/ DWORD HandleCount;<BR>/*008*/
}<BR>OBJECT_HANDLE_DB;<BR><BR>typedef struct
_OBJECT_HANDLE_DB_LIST<BR>{<BR>/*000*/ DWORD Count;<BR>/*004*/
OBJECT_HANDLE_DB Entries [];<BR>/*???*/ };<BR><BR>如果头中的
OB_FLAG_SINGLE_PROCESS 标志位被设立,则 union 中的 .Process
有效,指向一个EPROCESS。如果有多个进程都拥有本对象的句柄(handle),那么OB_FLAG_SINGLE_PROCESS
标志位不会被设立,则 union 中的 .HandleDBList 有效。<BR><BR>kd> !object
\Windows\WindowStations\WinSta0<BR>!object
\Windows\WindowStations\WinSta0<BR>Object: 810c9398 Type: (8141c5a0)
WindowStation<BR>ObjectHeader: 810c9380<BR>HandleCount: 29 PointerCount:
46<BR>Directory Object: 810e5930 Name: WinSta0<BR>\\ 对象头地址为 810c9380 ,对象头中
+c 开始的4个字节分别是 NameOffset HandleDBOffset \\ QuotaChargesOffset
ObjectFlags<BR><BR>kd> db 810c9380+c l 4<BR>db 810c9380+c l
4<BR>810c938c 10 18 00 20<BR>\\ HandleDBOffset 不为0,表明存在 OBJECT_HANDLE_DB
,并且偏移为 18,即810c9380-18=810c9368,大小为8个字节。NameOffset 不为0,偏移为10。ObjectFlags为
20(hex)=00100000(bin) 即 OB_FLAG_SECURITY, 标志位 OB_FLAG_SINGLE_PROCESS
没有被设立,表明 OBJECT_HANDLE_DB 的union 中的 .HandleDBList 有效。<BR><BR>kd> dd
810c9380-18 l 2<BR>dd 810c9380-18 l 2<BR>810c9368 e308ac48
00000002<BR><BR>/*000*/ struct _OBJECT_HANDLE_DB_LIST
*HandleDBList;<BR>e308ac48<BR>/*004*/ DWORD
HandleCount;<BR>00000002<BR><BR>\\ OBJECT_HANDLE_DB_LIST 的 Count<BR>kd>
dd e308ac48 l 1<BR>dd e308ac48 l 1<BR>e308ac48 00000016<BR>\\ 有0x16
项<BR><BR>kd> dd e308ac48+4 l 16*2<BR>dd e308ac48+4 l 16*2<BR>e308ac4c
810cc740 00000002 00000000 00000000<BR>e308ac5c 81054020 00000002 833eb1c0
00000002<BR>e308ac6c 81f9f020 00000002 824c65e0 00000002<BR>e308ac7c
80e68100 00000002 00000000 00000000<BR>e308ac8c 84f7a7e0 00000002 810e8020
00000002<BR>e308ac9c 00000000 00000000 00000000 00000000<BR>e308acac
00000000 00000000 00000000 00000000<BR>e308acbc 8352a620 00000002 00000000
00000000<BR>e308accc 8475f020 00000002 830f0a00 00000002<BR>e308acdc
83084b00 00000002 817cb3c0 00000001<BR>e308acec 83589020 00000002 8345a440
00000002<BR><BR>\\ 试一下第一项中的指向EPROCESS的指针。<BR>kd> !process 810cc740
0<BR>!process 810cc740 0<BR>PROCESS 810cc740 SessionId: 0 Cid: 00bc Peb:
7ffdf000 ParentCid: 008c<BR>DirBase: 075a7000 ObjectTable: 810cc6a8
TableSize: 357.<BR>Image: winlogon.exe<BR>\\
确实是指向一个EPROCESS结构<BR><BR><BR><BR>可选结构之一的
OBJECT_QUOTA_CHARGES<BR><BR>OBJECT_QUOTA_CHARGES 结构定义如下<BR><BR>#define
OB_SECURITY_CHARGE 0x00000800<BR><BR>typedef struct
_OBJECT_QUOTA_CHARGES<BR>{<BR>/*000*/ DWORD PagedPoolCharge;<BR>/*004*/
DWORD NonPagedPoolCharge;<BR>/*008*/ DWORD SecurityCharge;<BR>/*00C*/
DWORD Reserved;<BR>/*010*/ }<BR>OBJECT_QUOTA_CHARGES;<BR><BR>当对象头中的标志位
OB_FLAG_CREATE_INFO 为0时,头中的 PQUOTA_BLOCK QuotaBlock 有效。<BR><BR>struct
_EPROCESS_QUOTA_BLOCK (sizeof=44)<BR>+00 uint32 QuotaLock<BR>+04 uint32
ReferenceCount<BR>+08 uint32 QuotaPeakPoolUsage[2]<BR>+10 uint32
QuotaPoolUsage[2]<BR>+18 uint32 QuotaPoolLimit[2]<BR>+20 uint32
PeakPagefileUsage<BR>+24 uint32 PagefileUsage<BR>+28 uint32
PagefileLimit<BR><BR>kd> !object \KnownDlls\user32.dll<BR>!object
\KnownDlls\user32.dll<BR>Object: e17c29e0 Type: (8141b760)
Section<BR>ObjectHeader: e17c29c8<BR>HandleCount: 0 PointerCount:
1<BR>Directory Object: 810f63d0 Name: user32.dll<BR>\\ 对象头地址为 e17c29c8
,对象头中 +c 开始的4个字节分别是 NameOffset HandleDBOffset <BR>\\
QuotaChargesOffset ObjectFlags <BR><BR>kd> db e17c29c8+c l 4<BR>db
e17c29c8+c l 4<BR>e17c29d4 10 00 20 10<BR>\\ QuotaChargesOffset 不为0,表明存在
OBJECT_QUOTA_CHARGES ,并且偏移为 20,即e17c29c8-20=e17c29a8,大小为8个字节。NameOffset
不为0,偏移为10。ObjectFlags为 10(hex)=00010000(bin) 即
OB_FLAG_PERMANENT,OB_FLAG_CREATE_INFO 位为0。<BR><BR>\\
OBJECT_QUOTA_CHARGES<BR>kd> dd e17c29c8-20 l 4<BR>dd e17c29c8-20 l
4<BR>e17c29a8 000001b8 000000d8 00000800 00000000<BR><BR>/*000*/ DWORD
PagedPoolCharge;<BR>000001b8<BR>/*004*/ DWORD
NonPagedPoolCharge;<BR>000000d8<BR>/*008*/ DWORD
SecurityCharge;<BR>00000800<BR>/*00C*/ DWORD
Reserved;<BR>00000000<BR><BR>\\ 头地址在 e17c29c8,头中 QuotaBlock 值为
804699c0<BR>kd> dd e17c29c8 l 6<BR>dd e17c29c8 l 6<BR>e17c29c8 00000001
00000000 8141b760 10200010<BR>e17c29d8 804699c0
e17bb8d8<BR><BR>\\EPROCESS_QUOTA_BLOCK<BR>kd> dd 804699c0 l 2c/4<BR>dd
804699c0 l 2c/4<BR>804699c0 00000000 000006b9 0008395c
001499e0<BR>804699d0 0007eebc 00139f6c ffffffff ffffffff<BR>804699e0
0000106e 00000f16 ffffffff<BR><BR>+00 uint32 QuotaLock<BR>00000000<BR>+04
uint32 ReferenceCount<BR>000006b9<BR>+08 uint32
QuotaPeakPoolUsage[2]<BR>0008395c 001499e0<BR>+10 uint32
QuotaPoolUsage[2]<BR>0007eebc 00139f6c<BR>+18 uint32
QuotaPoolLimit[2]<BR>ffffffff ffffffff<BR>+20 uint32
PeakPagefileUsage<BR>0000106e<BR>+24 uint32
PagefileUsage<BR>00000f16<BR>+28 uint32
PagefileLimit<BR>ffffffff<BR><BR><BR>OBJECT_HEADER中的 /*014*/
PSECURITY_DESCRIPTOR ObjectCreateInfo<BR><BR>如果OBJECT_HEADER中的
OB_FLAG_SECURITY 标志被设立则 SecurityDescriptor 为指向 SECURITY_DESCRIPTOR 的指针。如果
OB_FLAG_SECURITY 标志没有被设立,则 SecurityDescriptor
为空。<BR><BR>SECURITY_DESCRIPTOR 结构定义如下<BR><BR>// kd 中使用 !strct
得到。<BR>struct _SECURITY_DESCRIPTOR (sizeof=20)<BR>+00 byte Revision<BR>+01
byte Sbz1<BR>+02 uint16 Control<BR>+04 void *Owner<BR>+08 void
*Group<BR>+0c struct _ACL *Sacl<BR>+10 struct _ACL *Dacl<BR><BR>struct
_SID (sizeof=12)<BR>+0 byte Revision<BR>+1 byte SubAuthorityCount<BR>+2
struct _SID_IDENTIFIER_AUTHORITY IdentifierAuthority<BR>+2 byte
Value[6]<BR>+8 uint32 SubAuthority[1]<BR><BR>struct _ACL (sizeof=8)<BR>+0
byte AclRevision<BR>+1 byte Sbz1<BR>+2 uint16 AclSize<BR>+4 uint16
AceCount<BR>+6 uint16 Sbz2<BR><BR>\\ 以"\"为例<BR>kd> !object \<BR>!object
\<BR>Object: 8141ecd0 Type: (81452820) Directory<BR>ObjectHeader:
8141ecb8<BR><BR>kd> dd 8141ecb8 l 6<BR>dd 8141ecb8 l 6<BR>8141ecb8
00000023 00000000 81452820 32000010<BR>8141ecc8 00000001 e10010f8<BR>\\
32(hex)=00110010(bin) ,即
OB_FLAG_KERNEL_MODE,OB_FLAG_PERMANENT,OB_FLAG_SECURITY 这3位被设立。所以 e10010f8
为 SecurityDescriptor 指向 SECURITY_DESCRIPTOR。SECURITY_DESCRIPTOR
结构大小为20(dec)个字节。<BR><BR>kd> dd e10010f8 l 5<BR>dd e10010f8 l
5<BR>e10010f8 80040001 00000070 00000080 00000000<BR>e1001108
00000014<BR>+00 byte Revision<BR>01<BR>+01 byte Sbz1<BR>00<BR>+02 uint16
Control<BR>8004<BR>+04 void *Owner<BR>00000070<BR>+08 void
*Group<BR>00000080<BR>+0c struct _ACL *Sacl<BR>00000000<BR>// 为空,表示不存在
Sacl<BR>+10 struct _ACL *Dacl<BR>00000014<BR>// 不为空,表示存在 Dacl ,并且在从
SECURITY_DESCRIPTOR 开始处偏移为 14 的地方,<BR>即 e10010f8+14<BR><BR>kd> db
e10010f8+14 l 8<BR>db e10010f8+14 l 8<BR>e100110c 02 00 5c 00 04 00 00
00<BR>+0 byte AclRevision<BR>02<BR>+1 byte Sbz1<BR>00<BR>+2 uint16
AclSize<BR>005c<BR>+4 uint16 AceCount<BR>0004<BR>+6 uint16
Sbz2<BR>0000<BR><BR>// 使用 kd 的 !sd 命令来显示安全描述符<BR>kd> !sd
e10010f8<BR>!sd e10010f8<BR>->Revision: 0x1<BR>->Sbz1 :
0x0<BR>->Control :
0x8004<BR>SE_DACL_PRESENT<BR>SE_SELF_RELATIVE<BR>->Owner :
S-1-5-32-544<BR>->Group : S-1-5-18<BR>->Dacl :<BR>->Dacl :
->AclRevision: 0x2<BR>->Dacl : ->Sbz1 : 0x0<BR>->Dacl :
->AclSize : 0x5c<BR>->Dacl : ->AceCount : 0x4<BR>->Dacl :
->Sbz2 : 0x0<BR>->Dacl : ->Ace[0]: ->AceType:
ACCESS_ALLOWED_ACE_TYPE<BR>->Dacl : ->Ace[0]: ->AceFlags:
0x0<BR>->Dacl : ->Ace[0]: ->AceSize: 0x14<BR>->Dacl :
->Ace[0]: ->Mask : 0x00020003<BR>->Dacl : ->Ace[0]: ->SID:
S-1-1-0<BR><BR>->Dacl : ->Ace[1]: ->AceType:
ACCESS_ALLOWED_ACE_TYPE<BR>->Dacl : ->Ace[1]: ->AceFlags:
0x0<BR>->Dacl : ->Ace[1]: ->AceSize: 0x14<BR>->Dacl :
->Ace[1]: ->Mask : 0x000f000f<BR>->Dacl : ->Ace[1]: ->SID:
S-1-5-18<BR><BR>->Dacl : ->Ace[2]: ->AceType:
ACCESS_ALLOWED_ACE_TYPE<BR>->Dacl : ->Ace[2]: ->AceFlags:
0x0<BR>->Dacl : ->Ace[2]: ->AceSize: 0x18<BR>->Dacl :
->Ace[2]: ->Mask : 0x000f000f<BR>->Dacl : ->Ace[2]: ->SID:
S-1-5-32-544<BR><BR>->Dacl : ->Ace[3]: ->AceType:
ACCESS_ALLOWED_ACE_TYPE<BR>->Dacl : ->Ace[3]: ->AceFlags:
0x0<BR>->Dacl : ->Ace[3]: ->AceSize: 0x14<BR>->Dacl :
->Ace[3]: ->Mask : 0x00020003<BR>->Dacl : ->Ace[3]: ->SID:
S-1-5-12<BR><BR>->Sacl : is NULL</P>
<P><B>总结</B></P>
<P>
最后我们来总结一下,从一个对象可以找到的信息。对象指针都是指向对象体的。<BR><BR>对象头:<BR>使用计数<BR>打开句柄计数<BR>相应类型对象的指针<BR>标志和偏移(指明存在哪些可选部分,对存在的部分指明在对象头之前的偏移)<BR>安全描述符<BR><BR>对象头之前的可选信息(哪些存在由对象头中的标志和偏移决定):<BR>OBJECT_NAME
名字,对象所在目录<BR>OBJECT_HANDLE_DB 使用对象的进程<BR>OBJECT_QUOTA_CHARGES
PagedPool,NonPagedPool 的使用情况<BR>OBJECT_CREATOR_INFO
打开进程ID,本类型对象链表<BR><BR>类型对象:<BR>该类型对象链表头(绝大多数的类型,并不构造这个链)<BR>类型名(Unicode字符串)<BR>类型序号(用一个数表示的类型)<BR>其他的信息<BR>该类型的一些例程<BR><BR>
前面对对象头及其相关结构做了介绍,并对 Directory 类型,Type 类型 对象的对象体也做了介绍。Process 类型,Thred 类型
对象将在其他地方做更多介绍。需要特别说明的是,通过 Directory
可以找到的对象只是系统存在的所有对象中的一小部分。很多对象是被进程使用的,在有关进程的介绍中,我们将看到如何找到更多的对象。<BR><BR>欢迎交流,欢迎交朋友,<BR>欢迎访问
<A href="http://jiurl.yeah.net/">http://jiurl.yeah.net/</A> <A
href="http://jiurl.cosoft.org.cn/forum">http://jiurl.cosoft.org.cn/forum</A>
</P>
<P> </P>
<P> </P>
<P><BR></P>
<P> </P></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -