winDBG로 Process 리스트 및 Process 검증하기
Header 가지고 놀기 2011. 3. 11. 16:19 |모든 테스트는 Windows xp service pack 3에서 수행되었습니다.
- winDBG download
http://msdn.microsoft.com/en-us/windows/hardware/gg463009
- winDBG symbol download
http://msdn.microsoft.com/en-us/windows/hardware/gg463028
-LiveKD download
http://technet.microsoft.com/en-us/sysinternals/bb897415
위 URL에서 테스트시 사용할 파일을 다운로드 한 후 설치하였습니다.
winDBG는 기본설정으로 설치하였으며, symbol은 c:\symbols에 설치하였습니다.
1. LiveKD
설치 후 winDBG로 커널 접근을 쉽게 도와주는 LiveKD를 사용하였습니다.
-w 옵션을 사용하여, LiveKD를 사용함과 동시에 winDBG를 사용하였습니다.
2. PROCESS 내역 보기
!process 0 0 을 사용하여 현재 동작하고 있는 프로세스 내역을 확인해 봅니다.
0: kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 825b7830 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000
DirBase: 02b40020 ObjectTable: e1002e40 HandleCount: 264.
Image: System
PROCESS 82429948 SessionId: none Cid: 0220 Peb: 7ffd8000 ParentCid: 0004
DirBase: 02b40040 ObjectTable: e14558d8 HandleCount: 19.
Image: smss.exe
PROCESS 82446da0 SessionId: 0 Cid: 0260 Peb: 7ffd7000 ParentCid: 0220
DirBase: 02b40060 ObjectTable: e15e3858 HandleCount: 378.
Image: csrss.exe
PROCESS 82344020 SessionId: 0 Cid: 0278 Peb: 7ffd8000 ParentCid: 0220
DirBase: 02b40080 ObjectTable: e14f2590 HandleCount: 460.
Image: winlogon.exe
PROCESS 8242f6e8 SessionId: 0 Cid: 02a4 Peb: 7ffdb000 ParentCid: 0278
DirBase: 02b400a0 ObjectTable: e17ac350 HandleCount: 261.
Image: services.exe
PROCESS 82449b88 SessionId: 0 Cid: 02b0 Peb: 7ffd7000 ParentCid: 0278
DirBase: 02b400c0 ObjectTable: e17a6dd0 HandleCount: 349.
Image: lsass.exe
3. 프로세스 링크 따라가기
작업관리자 -> 프로세스에서 확인되는 프로세스를 winDBG로 따라 들어 가보겠습니다.
0: kd> dt _EPROCESS 8238ea00
+0x174 ImageFileName : [16] "cmd.exe"
+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x821dc0a8 - 0x81f03658 ]
0: kd> dd 8238ea00+0x088
8238ea88 821dc0a8 81f03658
FLINK BLINK
0: kd> dt _EPROCESS 81f03658-0x88
+0x174 ImageFileName : [16] "AYServiceNT.aye"
+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x8238ea88 - 0x82366280 ]
4. 프로세스 특징
윈도우는 Memory Pool에 8바이트 단위로 메모리를 할당합니다. Memory Pool에는 Ethread와 Eprocess와 같은 커널 오브젝트가 존재합니다.
- Pool_Header
메모리 풀에 할당된 메모리 블록은 관리를 위한 자료구조인 Pool_Header를 포함합니다.
- windbg에서
dt _POOL_HEADER 를 확인하면 0x004 offset에 PoolTag가 있습니다.
4-1. _POOL_HEADER에서 확인된 주소가 process와 thread를 담고있으면 0xe36f7250, 0xe5726854값을 가지게 됩니다.
PROCESS 82283370 SessionId: 0 Cid: 0574 Peb: 7ffde000 ParentCid: 0638
DirBase: 02b403a0 ObjectTable: e1624420 HandleCount: 56.
Image: notepad.exe
0: kd> dt _POOL_HEADER 82283370-0x18-0x8
nt!_POOL_HEADER
+0x000 PreviousSize : 0y000000001 (0x1)
+0x000 PoolIndex : 0y0000000 (0)
+0x002 BlockSize : 0y001010000 (0x50)
+0x002 PoolType : 0y0000101 (0x5)
+0x000 Ulong1 : 0xa500001
+0x004 ProcessBilled : 0xe36f7250 _EPROCESS
+0x004 PoolTag : 0xe36f7250
+0x004 AllocatorBackTraceIndex : 0x7250
+0x006 PoolTagHash : 0xe36f
4-2. Object_Header
Object_HEADER는 Type필드를 가지고 있으면 오브젝트에 대한 일반적인 속성을 담고 있습니다. 해당 값이 프로세스일 경우 PsProcessType과 같거나 0xbad040값을 갖습니다.
PROCESS 82283370 SessionId: 0 Cid: 0574 Peb: 7ffde000 ParentCid: 0638
DirBase: 02b403a0 ObjectTable: e1624420 HandleCount: 56.
Image: notepad.exe
0: kd> !object 82283370
Object: 82283370 Type: (825b7e70) Process
ObjectHeader: 82283358 (old version)
HandleCount: 2 PointerCount: 17
0: kd> dd PsProcessType L1
805659b8 825b7e70
4-3. DISPATCHER_HEADER
Eprocess구조체 가장 앞부분에 존재하는 DISPATCHER_HEADER의 type과 size를 확인해보면, 프로세스의 경우 type은 0x3 size는 0x1b라는 것을 알 수 있습니다.
PROCESS 82283370 SessionId: 0 Cid: 0574 Peb: 7ffde000 ParentCid: 0638
DirBase: 02b403a0 ObjectTable: e1624420 HandleCount: 56.
Image: notepad.exe
0: kd> dt _DISPATCHER_HEADER 82283370
ntdll!_DISPATCHER_HEADER
+0x000 Type : 0x3 ''
+0x001 Absolute : 0 ''
+0x002 Size : 0x1b ''
+0x003 Inserted : 0 ''
+0x004 SignalState : 0
+0x008 WaitListHead : _LIST_ENTRY [ 0x82283378 - 0x82283378 ]
'Header 가지고 놀기' 카테고리의 다른 글
PE구조 알아보자 (0) | 2011.02.10 |
---|---|
Prefetch Header 분석 (4) | 2010.01.08 |
Thumbs.db을 통한 사진파일 복구 (3) | 2009.09.02 |