Dump 분석을 하게 되면 Pool Header를 직접 봐야 할때가 있지요.평소에는 !pool 이라는 굉장히 편리한 Extension Command가 있어서 쉽게 볼 수 있지만 그러지 않은 경우도 있습니다. ( 예를 들자면 POOL1, POOL2, POOL3 의 메모리가 연속으로 구성되어 있을떄 POOL2번이 깨져서 POOL3부터는 보이지 않는경우 라던지 … ) 이럴 경우을 대비해서 Pool Header의 정보를 확인해 두는 것이 좋습니다.
1: kd> dt nt!_POOL_HEADER
+0×000 PreviousSize : Pos 0, 9 Bits
+0×000 PoolIndex : Pos 9, 7 Bits
+0×002 BlockSize : Pos 0, 9 Bits
+0×002 PoolType : Pos 9, 7 Bits
+0×000 Ulong1 : Uint4B
+0×004 ProcessBilled : Ptr32 _EPROCESS
+0×004 PoolTag : Uint4B
+0×004 AllocatorBackTraceIndex : Uint2B
+0×006 PoolTagHash : Uint2B
Pool Header는 총 8Byte로 구성 됩니다. 이 중에 강조된 부분의 값들은 우리가 Debugging에 가장 많이 사용하는 값입니다.
1: kd> !pool e1000ef8
….
e1000e58 size: 18 previous size: 18 (Allocated) SeSi
e1000e70 size: 10 previous size: 18 (Allocated) ObDi
e1000e80 size: 78 previous size: 10 (Free ) MmDT
*e1000ef8 size: 20 previous size: 78 (Allocated) *MmDT
Pooltag MmDT : Mm debug, Binary : nt!mm
e1000f18 size: 58 previous size: 20 (Allocated) MmDT
e1000f70 size: 20 previous size: 58 (Allocated) MmDT
e1000f90 size: 28 previous size: 20 (Allocated) MmDT
e1000fb8 size: 28 previous size: 28 (Allocated) MmDT
e1000fe0 size: 20 previous size: 28 (Allocated) MmDT
1: kd> dt nt!_POOL_HEADER e1000ef8
+0×000 PreviousSize : 0y000001111 (0xf)
+0×000 PoolIndex : 0y0000010 (0×2)
+0×002 BlockSize : 0y000000100 (0×4)
+0×002 PoolType : 0y0000110 (0×6)
+0×000 Ulong1 : 0xc04040f
+0×004 ProcessBilled : 0×54446d4d _EPROCESS
+0×004 PoolTag : 0×54446d4d
+0×004 AllocatorBackTraceIndex : 0×6d4d
+0×006 PoolTagHash : 0×5444
!pool Extension과 Header의 정보가 다소 차이가 있는 것을 발견 할 수 있지요. 이 이유는 Header 에 표신된 Size 값은 8Byte Block의 Count 값이기 때문입니다. 측 0×4 * 0×8 = 0×20 이 된다는 말씀 …. 그럼 Pool Tag를 확인 해 보도록 하겠습니다. 기본적으로 Windows는 Little Endian을 사용하고 있다는것은 모두들 알고 있는 사실.. 그렇기 때문에 0×54446d4d 값을 Big Endian 으로 바꿔서 확인하면 아래와 같이 정상 적인 값을 얻을 수 있습니다.
1: kd> .formats 4d6d4454
Evaluate expression:
Hex: 4d6d4454
Decimal: 1299006548
Octal: 11533242124
Binary: 01001101 01101101 01000100 01010100
Chars: MmDT
Time: Wed Mar 02 04:09:08 2011
Float: low 2.48792e+008 high 0
Double: 6.41795e-315
실제로 Pool Header를 확인해서 Debugging 해야 할 경우는 많지 않지만 언젠가는 한번 만날 날이 있을꺼 같습니다. ㅎㅎ
최근 답글