Hongfluenza

EPROCESS,PEB,KPROCESS 본문

STUDY/FORENSIC

EPROCESS,PEB,KPROCESS

Hongfluenza 2019. 1. 26. 21:48

프로세스가 처음 실행될 때 커널 메모리에 해당 프로세스의 정보를 지닌 구조체를 생성한다.


때문에 모든 프로세스는 각각의 Eprocess 구조체를 가진다. 


또한, 프로세스에서 실행하고 있는 Thread의 갯수만큼 ETHREAD 구조체를 커널 메모리에 갖는다.






Eprocess란



- EProcess(Executive Process)는 윈도우에서 프로세스라고 불리는 커널 오브젝트를 대표한다.


- 윈도우의 관점에서 프로세스란 바로 이 구조체를 의미하며, 프로세스를 종료한다는 것은 이 구조체에 대한 포인터 값을 관련 링크드 리스트에서 삭제하는 것을 의미한다.


- 이 구조체 안에는 시스템이 프로세스를 실행하고 관리하기 위해 필요한 모든 정보가 들어있다.





PEB와 EProcess의 차이점


- PEB 



: User Mode에서의 프로세스 정보를 지닌 구조체


: 각 프로세스마다 PEB가 존재하여 하나의 스레드 마다 하나의 TEB(Thread Environment Block)를 갖는다.


: User Mode인 어플리케이션은 시스템 콜과 같은 '간접 적인' 방식으로 호출하여 커널에 있는 정보를 가져와야 한다.


그렇기에 시간이 상대적으로 오래 걸린다. 


: 따라서 User Mode의 메모리에 프로세스 구조체를 저장하여 프로세스 정보를 좀 더 효율적으로 가져온다.


이렇게 되면 굳이 User Mode에서 Kernel Mode로 데이터를 호출할 일은 사라지므로 빠른 연산 수행이 가능하다. 


이러한 이유는 ETHREAD에서도 동등하게 적용된다.




- EPROCESS 



: Kernel Mode에서의 프로세스 정보를 지닌 구조체


: '직접 적인' 접근이 가능하다.




F 쉽게 설명하자면 PEB는 유저모드에서의 프로세스, EPROCESS는 커널모드에서의 프로세스 구조체이다.


프로세스가 만약 기본적인 정보인 PROCESS ID값을 얻고자 할 때 EPROCESS까지 가려면 커널의 구조체에 접근을 해야


한다. 이는 유저모드에서 접근이 불가능하기 때문에 시간이 오래걸리고 빈번하게 갱신되는 프로세스의 정보도 커널에


접근하여 수정해야 한다. 그래서 유저 메모리에 PEB 구조체를 만들어 프로세스 정보를 좀 더 효율적으로 가져가는 것


이다.







EPROCESS와 ETHREAD(Executive Thread Block)


- 이 두 개의 내부에는 PCB(Process Control Block)와 TCB(Thread Control Block)란 이름의 KPROCESS, KTHREAD(Kernel Thread Block) 구조체가 존재한다.


- KPROCESS 


: NULL 동기화 객체, 디스패처 객체 헤더, 가상 메모리 CR3 레지스터 값, 프로세스 스레드 리스트 헤더, CPU 종속성 정보, 프로세스 우선 순위, 프로세스 생성 스레드 기본 실행 시간 값 등


- KTHREAD 

 

: 스레드 종료 동기화 객체, TEB(Thread Environment Block) 포인터, 스레드 우선 순위, 스케줄러, 스레드 리스트 등 Windows에선 플세스가 여러 개의 스레드를 지닌다.







EPROCESS의 구조 




: Windows XP SP3에서의 EPROCESS 구조체 내용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
nt!_EPROCESS
 
   +0x000 Pcb              : _KPROCESS // PCB인 KPROCESS를 가리킨다.
 
   +0x06c ProcessLock      : _EX_PUSH_LOCK
 
   +0x070 CreateTime       : _LARGE_INTEGER // 프로세스 생성 시간
 
   +0x078 ExitTime         : _LARGE_INTEGER // 프로세스 종료 시간
 
   +0x080 RundownProtect   : _EX_RUNDOWN_REF
 
   +0x084 UniqueProcessId  : Ptr32 Void // 프로세스 ID
 
   +0x088 ActiveProcessLinks : _LIST_ENTRY // 모든 프로세스를 관리하는데 사용된다.
 
   +0x090 QuotaUsage       : [3] Uint4B
 
   +0x09c QuotaPeak        : [3] Uint4B
 
   +0x0a8 CommitCharge     : Uint4B // 프로세스가 사용하는 물리적 메모리 공간
 
   +0x0ac PeakVirtualSize  : Uint4B // 프로세스가 사용하는 최대 메모리 량
 
   +0x0b0 VirtualSize      : Uint4B // 프로세스가 사용하는 메모리 량
 
   +0x0b4 SessionProcessLinks : _LIST_ENTRY // 세션 내 프로세스를 관리하는데 사용되는 LIST_ENTRY
 
   +0x0bc DebugPort        : Ptr32 Void // 디버깅 예외 처리 시 사용되는 LPC 포트
 
   +0x0c0 ExceptionPort    : Ptr32 Void
 
   +0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE
 
   +0x0c8 Token            : _EX_FAST_REF
 
   +0x0cc WorkingSetLock   : _FAST_MUTEX
 
   +0x0ec WorkingSetPage   : Uint4B
 
   +0x0f0 AddressCreationLock : _FAST_MUTEX
 
   +0x110 HyperSpaceLock   : Uint4B
 
   +0x114 ForkInProgress   : Ptr32 _ETHREAD
 
   +0x118 HardwareTrigger  : Uint4B
 
   +0x11c VadRoot          : Ptr32 Void
 
   +0x120 VadHint          : Ptr32 Void
 
   +0x124 CloneRoot        : Ptr32 Void
 
   +0x128 NumberOfPrivatePages : Uint4B
 
   +0x12c NumberOfLockedPages : Uint4B
 
   +0x130 Win32Process     : Ptr32 Void
 
   +0x134 Job              : Ptr32 _EJOB
 
   +0x138 SectionObject    : Ptr32 Void
 
   +0x13c SectionBaseAddress : Ptr32 Void // 세션 베이스 주소
 
   +0x140 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK
 
   +0x144 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY
 
   +0x148 Win32WindowStation : Ptr32 Void // WINDOWS STATION ID
 
   +0x14c InheritedFromUniqueProcessId : Ptr32 Void
 
   +0x150 LdtInformation   : Ptr32 Void
 
   +0x154 VadFreeHint      : Ptr32 Void
 
   +0x158 VdmObjects       : Ptr32 Void
 
   +0x15c DeviceMap        : Ptr32 Void
 
   +0x160 PhysicalVadList  : _LIST_ENTRY
 
   +0x168 PageDirectoryPte : _HARDWARE_PTE
 
   +0x168 Filler           : Uint8B
 
   +0x170 Session          : Ptr32 Void // 터미널 연결 시 세션 ID로 사용됨
 
   +0x174 ImageFileName    : [16] UChar // 프로세스 이름
 
   +0x184 JobLinks         : _LIST_ENTRY
 
   +0x18c LockedPagesList  : Ptr32 Void
 
   +0x190 ThreadListHead   : _LIST_ENTRY
 
   +0x198 SecurityPort     : Ptr32 Void
 
   +0x19c PaeTop           : Ptr32 Void
 
   +0x1a0 ActiveThreads    : Uint4B
 
   +0x1a4 GrantedAccess    : Uint4B
 
   +0x1a8 DefaultHardErrorProcessing : Uint4B
 
   +0x1ac LastThreadExitStatus : Int4B
 
   +0x1b0 Peb              : Ptr32 _PEB // PEB(Process Environment Block)를 가리킴
 
   +0x1b4 PrefetchTrace    : _EX_FAST_REF
 
   +0x1b8 ReadOperationCount : _LARGE_INTEGER // I/O에서 Read를 수행한 횟수
 
   +0x1c0 WriteOperationCount : _LARGE_INTEGER // I/O에서 Write를 수행한 횟수
 
   +0x1c8 OtherOperationCount : _LARGE_INTEGER
 
   +0x1d0 ReadTransferCount : _LARGE_INTEGER
 
   +0x1d8 WriteTransferCount : _LARGE_INTEGER
 
   +0x1e0 OtherTransferCount : _LARGE_INTEGER
 
   +0x1e8 CommitChargeLimit : Uint4B // 사용 가능 최대 메모리량
 
   +0x1ec CommitChargePeak : Uint4B // 사용된 메모리량
 
   +0x1f0 AweInfo          : Ptr32 Void
 
   +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
 
   +0x1f8 Vm               : _MMSUPPORT
 
   +0x238 LastFaultCount   : Uint4B
 
   +0x23c ModifiedPageCount : Uint4B
 
   +0x240 NumberOfVads     : Uint4B
 
   +0x244 JobStatus        : Uint4B
 
   +0x248 Flags            : Uint4B
 
   +0x248 CreateReported   : Pos 0, 1 Bit
 
   +0x248 NoDebugInherit   : Pos 1, 1 Bit
 
   +0x248 ProcessExiting   : Pos 2, 1 Bit
 
   +0x248 ProcessDelete    : Pos 3, 1 Bit
 
   +0x248 Wow64SplitPages  : Pos 4, 1 Bit
 
   +0x248 VmDeleted        : Pos 5, 1 Bit
 
   +0x248 OutswapEnabled   : Pos 6, 1 Bit
 
   +0x248 Outswapped       : Pos 7, 1 Bit
 
   +0x248 ForkFailed       : Pos 8, 1 Bit
 
   +0x248 HasPhysicalVad   : Pos 9, 1 Bit
 
   +0x248 AddressSpaceInitialized : Pos 10, 2 Bits
 
   +0x248 SetTimerResolution : Pos 12, 1 Bit
 
   +0x248 BreakOnTermination : Pos 13, 1 Bit
 
   +0x248 SessionCreationUnderway : Pos 14, 1 Bit
 
   +0x248 WriteWatch       : Pos 15, 1 Bit
 
   +0x248 ProcessInSession : Pos 16, 1 Bit
 
   +0x248 OverrideAddressSpace : Pos 17, 1 Bit
 
   +0x248 HasAddressSpace  : Pos 18, 1 Bit
 
   +0x248 LaunchPrefetched : Pos 19, 1 Bit
 
   +0x248 InjectInpageErrors : Pos 20, 1 Bit
 
   +0x248 VmTopDown        : Pos 21, 1 Bit
 
   +0x248 Unused3          : Pos 22, 1 Bit
 
   +0x248 Unused4          : Pos 23, 1 Bit
 
   +0x248 VdmAllowed       : Pos 24, 1 Bit
 
   +0x248 Unused           : Pos 25, 5 Bits
 
   +0x248 Unused1          : Pos 30, 1 Bit
 
   +0x248 Unused2          : Pos 31, 1 Bit
 
   +0x24c ExitStatus       : Int4B
 
   +0x250 NextPageColor    : Uint2B
 
   +0x252 SubSystemMinorVersion : UChar
 
   +0x253 SubSystemMajorVersion : UChar
 
   +0x252 SubSystemVersion : Uint2B
 
   +0x254 PriorityClass    : UChar // 프로세스 우선 등급
 
   +0x255 WorkingSetAcquiredUnsafe : UChar
 
   +0x258 Cookie           : Uint4B
cs



 ● 주요 필드 


 항목 이름

 설명

 Pcb

 : 데이터 타입 : _KPROCESS

 : PCB, KPROCESS의 위치를 가리킴

 : DISPATCHER_HEADER, 디렉토리 테이블 주소, KTHREAD의 목록, 우선순위, 커널/유저 CPU 시간 등에 대     한 정보를 가지고 있다.

 CreateTime

 : 데이터 타입 - _LARGE_INTEGER

 : 64비트 윈도우 시간 형식을 가지고 있으며, 프로세스가 시작된 시간을 나타낸다.

 ExitTime

 : 데이터 타입 - _LARGE_INTEGER

 : 64비트 윈도우 시간 형식을 가지고 있으며, 프로세스가 종료된 시간을 나타낸다.

 ImageFileName

 EPROCESS 구조체에 저장되는 프로세스 이름으로 커널 드라이버에서 프로세스의 이름을 구할 경우 사용됨

 ActiveProcessLinks

 : 데이터 타입 - LIST_ENTRY

 : ActiveProcess List를 구성하는 이중 링크드 리스트이다. 

 : 모든 프로세스를 관리하는 LIST_ENTRY

 UniqueProceeID

 : 데이터 타입 - Ptr32Void 

 : 프로세스 ID값(PID)을 의미한다.

 ObjectTable

 : 데이터 타입 - Ptr32_HANDLE_TABLE

 : 오브젝트 핸들 테이블의 위치를 가리키는 포인터 값이다. 

 : 프로세스의 핸들 테이블 포인터

 Token

 프로세스 토큰 정보

 VadRoot

 프로세스에 할당된 모든 유저 메모리 영역의 포인터

 PEB

 : 데이터 타입 - Ptr32_PEB

 : PCB가 프로세스 관리에 필요한 구조체라면 PEB는 프로세스 실행에 필요한 정보들을 담고 있는 구조체이     다. 베이스 어드레스, 모듈 리스트, 힙/스택 정보가 여기에 속한다. 

 : Process Environment Block를 가리키는 포인터



KPROCESS의 구조



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
0: kd> dt nt!_KPROCESS
 
   +0x000 Header           : _DISPATCHER_HEADER // 디스패처 객체마다 갖고 있는 헤더로써 동기화와 우선처리 같은 대기 상황 허용을 위해 사용된다.
 
   +0x010 ProfileListHead  : _LIST_ENTRY
 
   +0x018 DirectoryTableBase : [2] Uint4B // 프로세스 별로 관리되는 가상메모리의 CR3 레지스터 값을 저장
 
   +0x020 LdtDescriptor    : _KGDTENTRY
 
   +0x028 Int21Descriptor  : _KIDTENTRY
 
   +0x030 IopmOffset       : Uint2B
 
   +0x032 Iopl             : UChar
 
   +0x033 Unused           : UChar
 
   +0x034 ActiveProcessors : Uint4B // 현재 활성화된 프로세서 수
 
   +0x038 KernelTime       : Uint4B // 프로세스가 커널 레벨 사용된 시간
 
   +0x03c UserTime         : Uint4B // 프로세스가 유저 레벨 사용된 시간
 
   +0x040 ReadyListHead    : _LIST_ENTRY // 현재 준비상태의 스레드 리스트
 
   +0x048 SwapListEntry    : _SINGLE_LIST_ENTRY // 현재 스와핑 되고 있는 스레드 리스트
 
   +0x04c VdmTrapcHandler  : Ptr32 Void
 
   +0x050 ThreadListHead   : _LIST_ENTRY // 프로세스가 갖고 있는 스레드 리스트를 가리킴
 
   +0x058 ProcessLock      : Uint4B // EPROCESS 접근 시 사용될 동기화 개체
 
   +0x05c Affinity         : Uint4B // 멀티 프로세스에서 이 프로세스가 즐겨 사용하는 선호 프로세스 정보
 
   +0x060 StackCount       : Uint2B
 
   +0x062 BasePriority     : Char // 기본 우선순위
 
   +0x063 ThreadQuantum    : Char // 기본 퀀텀 값
 
   +0x064 AutoAlignment    : UChar
 
   +0x065 State            : UChar
 
   +0x066 ThreadSeed       : UChar
 
   +0x067 DisableBoost     : UChar
 
   +0x068 PowerState       : UChar
 
   +0x069 DisableQuantum   : UChar
 
   +0x06a IdealNode        : UChar
 
   +0x06b Flags            : _KEXECUTE_OPTIONS
 
   +0x06b ExecuteOptions   : UChar

cs




출처

https://capoo.tistory.com/6

http://blog.naver.com/PostView.nhn?blogId=stop2y&logNo=221365537605&categoryNo=0&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=1

https://gatsbyv.tistory.com/203


'STUDY > FORENSIC' 카테고리의 다른 글

윈도우에 볼라틸리티(Volatility) 설치하기  (0) 2019.01.20