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' 항목