Object Type Initializers

kd> dt _OBJECT_TYPE_INITIALIZER
   +0x000 Length           : Uint2B
   +0x002 UseDefaultObject : UChar
   +0x003 CaseInsensitive  : UChar
   +0x004 InvalidAttributes : Uint4B
   +0x008 GenericMapping   : _GENERIC_MAPPING
   +0x018 ValidAccessMask  : Uint4B
   +0x01c SecurityRequired : UChar
   +0x01d MaintainHandleCount : UChar
   +0x01e MaintainTypeList : UChar
   +0x020 PoolType         : _POOL_TYPE
   +0x024 DefaultPagedPoolCharge : Uint4B
   +0x028 DefaultNonPagedPoolCharge : Uint4B
   +0x02c DumpProcedure    : Ptr32    
   +0x030 OpenProcedure    : Ptr32    
   +0x034 CloseProcedure   : Ptr32    
   +0x038 DeleteProcedure  : Ptr32    
   +0x03c ParseProcedure   : Ptr32    
   +0x040 SecurityProcedure : Ptr32    
   +0x044 QueryNameProcedure : Ptr32    
   +0x048 OkayToCloseProcedure : Ptr32  

커널이 관리하는 OBJECT에는 OBJECT_TYPE이라는 구조체를 가지고 있고, 이 내부에
OBJECT_TYPE_INITIALIZER라는 구조체가 중첩되어 있다. 그중에서 Dump, Open, Close,
Delete... 와 같은 Procedure를 등록시키는 필드를 가지고 Rootkit에서 응용 가능하다.

kd> dt nt!_OBJECT_TYPE_INITIALIZER  poi(nt!PsProcessType)+60
   +0x000 Length           : 0x4c
   +0x002 UseDefaultObject : 0 ''
   +0x003 CaseInsensitive  : 0 ''
   +0x004 InvalidAttributes : 0xb0
   +0x008 GenericMapping   : _GENERIC_MAPPING
   +0x018 ValidAccessMask  : 0x1f0fff
   +0x01c SecurityRequired : 0x1 ''
   +0x01d MaintainHandleCount : 0 ''
   +0x01e MaintainTypeList : 0 ''
   +0x020 PoolType         : 0 ( NonPagedPool )
   +0x024 DefaultPagedPoolCharge : 0x1000
   +0x028 DefaultNonPagedPoolCharge : 0x290
   +0x02c DumpProcedure    : (null)
   +0x030 OpenProcedure    : (null)
   +0x034 CloseProcedure   : (null)
   +0x038 DeleteProcedure  : 0x8058468a     nt!PspProcessDelete+0
   +0x03c ParseProcedure   : (null)
   +0x040 SecurityProcedure : 0x8056be70     nt!SeDefaultObjectMethod+0
   +0x044 QueryNameProcedure : (null)
   +0x048 OkayToCloseProcedure : (null)

kd> dt nt!_OBJECT_TYPE_INITIALIZER  poi(nt!IoFileObjectType)+60
   +0x000 Length           : 0x4c
   +0x002 UseDefaultObject : 0 ''
   +0x003 CaseInsensitive  : 0x1 ''
   +0x004 InvalidAttributes : 0x130
   +0x008 GenericMapping   : _GENERIC_MAPPING
   +0x018 ValidAccessMask  : 0x1f01ff
   +0x01c SecurityRequired : 0 ''
   +0x01d MaintainHandleCount : 0x1 ''
   +0x01e MaintainTypeList : 0x1 ''
   +0x020 PoolType         : 0 ( NonPagedPool )
   +0x024 DefaultPagedPoolCharge : 0x400
   +0x028 DefaultNonPagedPoolCharge : 0xe8
   +0x02c DumpProcedure    : (null)
   +0x030 OpenProcedure    : (null)
   +0x034 CloseProcedure   : 0x8056c7e9     nt!IopCloseFile+0
   +0x038 DeleteProcedure  : 0x8056c5f3     nt!IopDeleteFile+0
   +0x03c ParseProcedure   : 0x80573b5a     nt!IopParseFile+0
   +0x040 SecurityProcedure : 0x8059c3e2     nt!IopGetSetSecurityObject+0
   +0x044 QueryNameProcedure : 0x80581c29     nt!IopQueryName+0
   +0x048 OkayToCloseProcedure : (null)

특히 위와 같이 ObjectType을 가지는 것이 File, Process, Thread, Job... 등등 무척
많다는 것이다. 아마 Object Type Initializer를 변조하는 Rootkit을 찾아내는 것이
쉽지만은 않을 것 같다.

Object가 Open, Close, Delete 와 같이 그 Action에 따라서 Procedure를 지정하기 위해
만들어 놓은 것 같다. 이 필드를 조작한다면 Action을 실행하여 특정한 코드를 Trigger시킬 수
있다.

원문 : http://ivanlef0u.free.fr/?p=79

by nerd | 2007/10/18 16:49 | Garage | 트랙백 | 덧글(0)


트랙백 주소 : http://nerd.egloos.com/tb/3442558
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶