windbg에서 idle 프로세스 찾기

Analysis/WinDbg 2013. 3. 9. 20:03 Posted by munggeun

windbg에서 idle 프로세스 찾기

 

1)

Idle 프로세스의 주소를 가지고 있는 PsIdleProcess 변수를 이용하는 것이다.

 

kd> !process poi(nt!PsIdleProcess) 0

PROCESS 82d38640 SessionId: none Cid: 0000 Peb: 00000000 ParentCid: 0000

DirBase: 00185000 ObjectTable: 88e01b80 HandleCount: 491.

Image: Idle

* poi(x) : x 가리키는 곳의

* process [address] 0 : address 있는 _EPROCESS 구조체를 참조하여 마스크 0(가장 최소한의 정보) 표현

 

kd> dt _EPROCESS 82d38640

ntdll!_EPROCESS

+0x000 Pcb : _KPROCESS

+0x098 ProcessLock : _EX_PUSH_LOCK

+0x0a0 CreateTime : _LARGE_INTEGER 0x0

…...

+0x160 PageDirectoryPte : _HARDWARE_PTE_X86

+0x160 Filler : 0

+0x168 Session : (null)

+0x16c ImageFileName : [15] "Idle"

 

2)

프로세스 컨트롤 블록인 _KPCR extension _KPRCB Idle 쓰레드 주소를 이용하는 것이다.

 

kd> !prcb

PRCB for Processor 0 at 82d2ed20:

Current IRQL -- 28

Threads-- Current 82d38380 Next 00000000 Idle 82d38380 -> Idle 쓰레드

Processor Index 0 Number (0, 0) GroupSetMember 1

Interrupt Count -- 0005617a

Times -- Dpc 0000001f Interrupt 00000039

Kernel 0003403e User 00000399

 

kd> !thread -p 82d38380 0

PROCESS 853e88e8 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000

DirBase: 00185000 ObjectTable: 88e01b80 HandleCount: 491.

Image: System

 


 

번째 방식과 번째 방식의 차이점은 Idle 프로세스이냐 System 프로세스이냐 인데

System 프로세스는 Idle 프로세스와 존재하는 메모리 영역부터 다르므로

번째 방법으로 찾는 것이 맞는다고 본다.

 

kd> dc 82d38640-30 -> Idle 프로세스 주변 메모리 검사

82d38610 00000000 00000000 00000000 00000000 ................

82d38620 00000000 00000000 00000000 00000000 ................

82d38630 00000000 00000000 00989680 00000000 ................

82d38640 00260003 00000000 82d38648 82d38648 ..&.....H...H...

82d38650 82d38650 82d38650 00185000 00000000 P...P....P......

82d38660 00000000 00000000 00000000 82d38560 ............`...

82d38670 82d38560 00000000 00010001 00000000 `...............

82d38680 00000001 82d38684 82d38684 00000000 ................

 

kd> dc 853e88e8-30 -> System 프로세스 주변 메모리 검사

853e88b8 00000000 00000000 00000000 00000000 ................

853e88c8 045c005b e36f7250 00000083 00000003 [.\.Pro.........

853e88d8 00000000 02000007 82d39cc0 88e05ec1 .............^..

853e88e8 00260003 00000000 853e88f0 853e88f0 ..&.......>...>.

853e88f8 853e88f8 853e88f8 00185000 00000000 ..>...>..P......

853e8908 00000000 00000000 00000000 853e87f0 ..............>.

853e8918 85633620 00000000 00010001 00000000 6c.............

853e8928 00000001 853e892c 853e892c 00000000 ....,.>.,.>.....

 

System 프로세스 앞에는 헤더가 붙는데 Idle 프로세스 앞에는 헤더가 붙지 않고,

_EPROCESS 구조체의 실제 필드값들을 살펴보면 비슷한(완전히 똑같지는 않은) 점이 많다.

 

생각에는 System 프로세스가 먼저 실행 되고 후에 Idle 프로세스가 System 프로세스를 복사하면서

생성되는 같은데 부분은 살펴봐야겠다.

 

살펴보니 Idle 프로세스의 CreateTime 필드값은 0인데 반해 System 프로세스의 CreateTime 필드값는 0 아니다.

Idle 프로세스는 일종의 특수한 프로세스라고 생각해야 같다. --a

 

* Idle 프로세스는 단순히 사용 중이지 않은 CPU 자원을 나타내기 위한 프로세스이다.

 

남은 의문점)

Idle 프로세스는 언제 생성되는가?

Idle 프로세스 앞에는 헤더 및 오브젝터 헤더가 붙지 않는가?

Idle 프로세스는 풀에 존재하지 않는가?

 

참고)

https://groups.google.com/forum/?fromgroups=#!topic/microsoft.public.windbg/vlgDfK0XrNU

windbg help '!pcr', '!prcb', '!process' 항목

 

 
AND