⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jiurl玩玩win2k 对象.htm

📁 关于win2000核心编程的文章
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      "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&nbsp;<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&gt; !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&gt; 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&gt; 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&gt; 
      dd e308ac48 l 1<BR>dd e308ac48 l 1<BR>e308ac48 00000016<BR>\\ 有0x16 
      项<BR><BR>kd&gt; 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&gt; !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&gt; !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&nbsp;<BR>\\ 
      QuotaChargesOffset ObjectFlags&nbsp;<BR><BR>kd&gt; 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&gt; 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&gt; 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&gt; 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&gt; !object \<BR>!object 
      \<BR>Object: 8141ecd0 Type: (81452820) Directory<BR>ObjectHeader: 
      8141ecb8<BR><BR>kd&gt; 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&gt; 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&gt; 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&gt; !sd 
      e10010f8<BR>!sd e10010f8<BR>-&gt;Revision: 0x1<BR>-&gt;Sbz1 : 
      0x0<BR>-&gt;Control : 
      0x8004<BR>SE_DACL_PRESENT<BR>SE_SELF_RELATIVE<BR>-&gt;Owner : 
      S-1-5-32-544<BR>-&gt;Group : S-1-5-18<BR>-&gt;Dacl :<BR>-&gt;Dacl : 
      -&gt;AclRevision: 0x2<BR>-&gt;Dacl : -&gt;Sbz1 : 0x0<BR>-&gt;Dacl : 
      -&gt;AclSize : 0x5c<BR>-&gt;Dacl : -&gt;AceCount : 0x4<BR>-&gt;Dacl : 
      -&gt;Sbz2 : 0x0<BR>-&gt;Dacl : -&gt;Ace[0]: -&gt;AceType: 
      ACCESS_ALLOWED_ACE_TYPE<BR>-&gt;Dacl : -&gt;Ace[0]: -&gt;AceFlags: 
      0x0<BR>-&gt;Dacl : -&gt;Ace[0]: -&gt;AceSize: 0x14<BR>-&gt;Dacl : 
      -&gt;Ace[0]: -&gt;Mask : 0x00020003<BR>-&gt;Dacl : -&gt;Ace[0]: -&gt;SID: 
      S-1-1-0<BR><BR>-&gt;Dacl : -&gt;Ace[1]: -&gt;AceType: 
      ACCESS_ALLOWED_ACE_TYPE<BR>-&gt;Dacl : -&gt;Ace[1]: -&gt;AceFlags: 
      0x0<BR>-&gt;Dacl : -&gt;Ace[1]: -&gt;AceSize: 0x14<BR>-&gt;Dacl : 
      -&gt;Ace[1]: -&gt;Mask : 0x000f000f<BR>-&gt;Dacl : -&gt;Ace[1]: -&gt;SID: 
      S-1-5-18<BR><BR>-&gt;Dacl : -&gt;Ace[2]: -&gt;AceType: 
      ACCESS_ALLOWED_ACE_TYPE<BR>-&gt;Dacl : -&gt;Ace[2]: -&gt;AceFlags: 
      0x0<BR>-&gt;Dacl : -&gt;Ace[2]: -&gt;AceSize: 0x18<BR>-&gt;Dacl : 
      -&gt;Ace[2]: -&gt;Mask : 0x000f000f<BR>-&gt;Dacl : -&gt;Ace[2]: -&gt;SID: 
      S-1-5-32-544<BR><BR>-&gt;Dacl : -&gt;Ace[3]: -&gt;AceType: 
      ACCESS_ALLOWED_ACE_TYPE<BR>-&gt;Dacl : -&gt;Ace[3]: -&gt;AceFlags: 
      0x0<BR>-&gt;Dacl : -&gt;Ace[3]: -&gt;AceSize: 0x14<BR>-&gt;Dacl : 
      -&gt;Ace[3]: -&gt;Mask : 0x00020003<BR>-&gt;Dacl : -&gt;Ace[3]: -&gt;SID: 
      S-1-5-12<BR><BR>-&gt;Sacl : is NULL</P>
      <P><B>总结</B></P>
      <P>&nbsp;&nbsp;&nbsp; 
      最后我们来总结一下,从一个对象可以找到的信息。对象指针都是指向对象体的。<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>&nbsp;&nbsp;&nbsp; 
      前面对对象头及其相关结构做了介绍,并对 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 + -