Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  Windows Internals 다시보기 10 
작성일시 : 2010. 2. 19. 14:51 | 분류 : Windows Server/Kernel

* 아직은 많이 부족하기 때문에 제가 자신이 생길 때 까지 본 글은 제 블로그에 대한 링크만 허용합니다.

Type 객체

동일한 종류의 객체를 위한 하나의 틀이라고 볼 수 있습니다. 이 Type 객체는 동일한 종류의 여러 객체들의 어트리뷰트 (내부 변수) 중 동일하게 가져가는 값들을 책임지고 있습니다. 예를 들어 프로세스 객체에 대하여 디버그 플래그를 설정한다면 아래 그림과 같이 다른 모든 프로세스 객체 역시 해당 플래그가 설정되게 되는 것이죠.

image

우리가 이전에 봤던 !process 커맨드를 통해 우리는 쉽게 프로세스 객체에 대해 들여다 볼 수 있습니다.

1. lkd> !process 0 0
2. **** NT ACTIVE PROCESS DUMP ****
3. PROCESS 860f1ab0 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000
4. DirBase: 00122000 ObjectTable: 83000118 HandleCount: 484.
5. Image: System

일단 프로세스 객체의 주소를 확인했으면 !object를 실행 합니다.
1. lkd> !object 860f1ab0
2. Object: 860f1ab0 Type: (860f1ed0) Process
3. ObjectHeader: 860f1a98 (old version)
4. HandleCount: 4 PointerCount: 139

여러분도 알고 있는것과 같이 오브젝트의 해더는 오브젝트 바디 보다 0x18 비트 앞에 위치하고 있습니다.
자 우리는 아래 커멘드를 통해 해당 오브젝트의 해더를 확인 할 수 있습니다.
1. lkd> dt nt!_OBJECT_HEADER 860f1a98
2. +0x000 PointerCount : 139
3. +0x004 HandleCount : 4
4. +0x004 NextToFree : 0x00000004
5. +0x008 Type : 0x860f1ed0 _OBJECT_TYPE
6. +0x00c NameInfoOffset : 0 ''
7. +0x00d HandleInfoOffset : 0 '' 146
8. +0x00e QuotaInfoOffset : 0 ''
9. +0x00f Flags : 0x22 '"'
10. +0x010 ObjectCreateInfo : 0x82109380 _OBJECT_CREATE_INFORMATION
11. +0x010 QuotaBlockCharged : 0x82109380
12. +0x014 SecurityDescriptor : 0x83003482
13. +0x018 Body : _QUAD

마지막으로 Type 필드를 통해서 우리는 실제 Type 객체를 확인 할 수 있습니다.
1. lkd> dt nt!_OBJECT_TYPE 0x860f1ed0
2. +0x000 Mutex : _ERESOURCE
3. +0x038 TypeList : _LIST_ENTRY [ 0x860f1f08 - 0x860f1f08 ]
4. +0x040 Name : _UNICODE_STRING "Process"
5. +0x048 DefaultObject : (null)
6. +0x04c Index : 6
7. +0x050 TotalNumberOfObjects : 0x4f
8. +0x054 TotalNumberOfHandles : 0x12d
9. +0x058 HighWaterNumberOfObjects : 0x52
10. +0x05c HighWaterNumberOfHandles : 0x141
11. +0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER
12. +0x0ac Key : 0x636f7250
13. +0x0b0 ObjectLocks : [32] _EX_PUSH_LOCK

이 정보를 통해 우리는 객체 타입의 이름이나 객체 및 핸들에 대한 현재 개수 및 피크치에서의 개수 등을 확인 할 수 있습니다. 그리고 TypeInfo 필드는 데이터 구조체에 대한 포인터를 저장하고 있습니다. 이 데이터 구조체에는 일반적으로 모든 객체에 공통적으로 가지고 있는 객체 타입이나 객체 타입의 메소드에 대한 포인터가 저장되어 있습니다.
1. lkd> dt nt!_OBJECT_TYPE_INITIALIZER 0x860f1ed0+60
2. +0x000 Length : 0x4c
3. +0x002 ObjectTypeFlags : 0xa ''
4. +0x002 CaseInsensitive : 0y0
5. +0x002 UnnamedObjectsOnly : 0y1
6. +0x002 UseDefaultObject : 0y0
7. +0x002 SecurityRequired : 0y1
8. +0x002 MaintainHandleCount : 0y0
9. +0x002 MaintainTypeList : 0y0
10. +0x004 ObjectTypeCode : 0
11. +0x008 InvalidAttributes : 0
12. +0x00c GenericMapping : _GENERIC_MAPPING
13. +0x01c ValidAccessMask : 0x1fffff
14. +0x020 PoolType : 0 ( NonPagedPool )
15. +0x024 DefaultPagedPoolCharge : 0x1000
16. +0x028 DefaultNonPagedPoolCharge : 0x2a0
17. +0x02c DumpProcedure : (null) 147
18. +0x030 OpenProcedure : 0x822137d3 long nt!PspProcessOpen+0
19. +0x034 CloseProcedure : 0x8221c3d4 void nt!PspProcessClose+0
20. +0x038 DeleteProcedure : 0x8221c1e2 void nt!PspProcessDelete+0
21. +0x03c ParseProcedure : (null)
22. +0x040 SecurityProcedure : 0x822502bb long nt!SeDefaultObjectMethod+0
23. +0x044 QueryNameProcedure : (null)
24. +0x048 OkayToCloseProcedure : (null)

image

|