프로세스 – EPROCESS, KPROCESS

그럼 먼저 프로세스 구조체인 EPROCESS에 대해 확인해 보자. 거대한 구조체인만큼 많은 정보를 가지고 있다.

앞서 애기하였지만, 모든 내용을 암기하려 하지 말자. 역분석에서 중요한 포인트는 흐름과 이해라 할 수 있다.

EPROCESS를 통해 확인 할 수 있는 정보는 상당하다. 그도 그럴것이, 운영체제는 프로세스를 지윈하기 위한 사전에 마련된 공간과 같다. 이를 각프로세스들이 자신에 필요한 만큼 가져가고, 설정하여 사용하므로써, 운영체제 위에서 우리가 필요한 환경들이 구성되는 것이다. 그럼 EPROCESS에 포함된 정보들에 대해 알아보자.

 

KPROCESS(Kernel process) 블록:

공통 디스패처 개체 해더와 프로세스 페이지 디렉토리 포인터, 퀀텀, 기본 우선 쉰위등의 정보를 가지고 있다.(EPROCESS 이후 해당 구조체에 대해 살펴볼 것이다.)

프로세스 식별:

프로세스 고유 ID와 부모 프로세스 정보등

쿼타 블록:

Non-page, paged pool 제한등과 같은 Winlogon에서 설정해 준 상호작동 세션에 할당량

VAD 정보:

가상메모리 데이터 구조 정보

워킹셋 정보:

워킹셋 리스트의 포인터로 현재, 최소, 최대 사이즈 정보

가상메모리 정보:

현재, 갑작스런 상황시 사용할 수 있는 가상 메모리 사이즈, 그외 프로세스 페이지 디렉토리 엔트리 등의 정보

예외 LPC 포트:

예외 상황 발생시 사용되는 채널

디버깅 LPC 포트:

디버깅시 사용되는 채널

엑세스 토큰:

현 프로세스의 보안 프로파일

핸들 테이블:

현 프로세스의 핸들 테이블(핸들 테이블은 프로세스별로 갖는다,)

디바이스 맵:

디바이스 이름을 참조한 개체 디렉토리 주소 정보

PEB(Process environment block):

이미지 정보, 프로세스 힙 정보등, 유저모드에서 접근가능한 정보 제공

Win32 subsystem process block:

프로세스에서 필요한 Win32 서브시스템의 커널 모드 컴퍼넌트

 

윈도우 7 64비트의 EPROCESS의 전체 구조체를 확인해보자.

 

kd> dt _EPROCESS

+0x000 Pcb : _KPROCESS // PCB, 즉 KPROCESS를 가르킨다. 바로 다음에 다룬다.

+0x160 ProcessLock : _EX_PUSH_LOCK

+0x168 CreateTime : _LARGE_INTEGER // 프로세스 생성 시간

+0x170 ExitTime : _LARGE_INTEGER // 프로세스 종료 시간

+0x178 RundownProtect : _EX_RUNDOWN_REF

+0x180 UniqueProcessId : Ptr64 Void // 프로세스 ID

+0x188 ActiveProcessLinks : _LIST_ENTRY // 모든 프로세스를 관리하는데 사용되는 LIST_ENTRY

+0x198 ProcessQuotaUsage : [2] Uint8B

+0x1a8 ProcessQuotaPeak : [2] Uint8B

+0x1b8 CommitCharge : Uint8B // 프로세스가 사용하는 물리적 메모리 공간, -장 메모리의 워킹셋에서 확인할 수 있다.

+0x1c0 QuotaBlock : Ptr64 _EPROCESS_QUOTA_BLOCK

+0x1c8 CpuQuotaBlock : Ptr64 _PS_CPU_QUOTA_BLOCK

+0x1d0 PeakVirtualSize : Uint8B //프로세스가 사용하는 최대 메모리량, -장 메모리의 워킹셋에서 확인할 수 있다.

+0x1d8 VirtualSize : Uint8B //프로세스가 사용하는 메모리 량, -장 메모리의 워킹셋에서 확인할 수 있다.

+0x1e0 SessionProcessLinks : _LIST_ENTRY // 세션내 프로세스를 관리하는데 사용되는 LIST_ENTRY

+0x1f0 DebugPort : Ptr64 Void // 디버깅 예외 처리시 사용되는 LPC 포트, -장 예외 처리에서 다룬다.

+0x1f8 ExceptionPortData : Ptr64 Void

+0x1f8 ExceptionPortValue : Uint8B

+0x1f8 ExceptionPortState : Pos 0, 3 Bits

+0x200 ObjectTable : Ptr64 _HANDLE_TABLE // 프로세스의 핸들(Handle) 테이블 포인터를 가르킨다.

+0x208 Token : _EX_FAST_REF //프로세스 토큰 정보로, 1부에서 진행하였다.

+0x210 WorkingSetPage : Uint8B //워킹셋 페이지수

+0x218 AddressCreationLock : _EX_PUSH_LOCK

+0x220 RotateInProgress : Ptr64 _ETHREAD

+0x228 ForkInProgress : Ptr64 _ETHREAD

+0x230 HardwareTrigger : Uint8B

+0x238 PhysicalVadRoot : Ptr64 _MM_AVL_TABLE

+0x240 CloneRoot : Ptr64 Void

+0x248 NumberOfPrivatePages : Uint8B

+0x250 NumberOfLockedPages : Uint8B

+0x258 Win32Process : Ptr64 Void

+0x260 Job : Ptr64 _EJOB

+0x268 SectionObject : Ptr64 Void

+0x270 SectionBaseAddress : Ptr64 Void // 세션 베이스 주소

+0x278 Cookie : Uint4B // 현재 시간값, 그외에 연산을 통해 고유값을 생성한다.

+0x27c Spare8 : Uint4B

+0x280 WorkingSetWatch : Ptr64 _PAGEFAULT_HISTORY

+0x288 Win32WindowStation : Ptr64 Void // Windows Station ID, -장 데스크탑 힙에서 다룬다.

+0x290 InheritedFromUniqueProcessId : Ptr64 Void

+0x298 LdtInformation : Ptr64 Void

+0x2a0 Spare : Ptr64 Void

+0x2a8 ConsoleHostProcess : Uint8B

+0x2b0 DeviceMap : Ptr64 Void

+0x2b8 EtwDataSource : Ptr64 Void

+0x2c0 FreeTebHint : Ptr64 Void

+0x2c8 PageDirectoryPte : _HARDWARE_PTE

+0x2c8 Filler : Uint8B

+0x2d0 Session : Ptr64 Void // 터미널 연결시 세션 ID로 사용.

+0x2d8 ImageFileName : [15] UChar // 프로세스 이름

+0x2e7 PriorityClass : UChar // 본 프로세스의 우선 순위 등급

+0x2e8 JobLinks : _LIST_ENTRY

+0x2f8 LockedPagesList : Ptr64 Void

+0x300 ThreadListHead : _LIST_ENTRY

+0x310 SecurityPort : Ptr64 Void

+0x318 Wow64Process : Ptr64 Void

+0x320 ActiveThreads : Uint4B

+0x324 ImagePathHash : Uint4B

+0x328 DefaultHardErrorProcessing : Uint4B

+0x32c LastThreadExitStatus : Int4B

+0x330 Peb : Ptr64 _PEB // Process Environment Block를 가르키는 포인터

+0x338 PrefetchTrace : _EX_FAST_REF

+0x340 ReadOperationCount : _LARGE_INTEGER // 여기 값들은 I/O에서 Raed를 수행한 횟수, Xperf에서 다루였다.

+0x348 WriteOperationCount : _LARGE_INTEGER // 여기 값들은 I/O에서 Write를 수행한 횟수

+0x350 OtherOperationCount : _LARGE_INTEGER

+0x358 ReadTransferCount : _LARGE_INTEGER

+0x360 WriteTransferCount : _LARGE_INTEGER

+0x368 OtherTransferCount : _LARGE_INTEGER

+0x370 CommitChargeLimit : Uint8B // 사용가능한 최대 메모리량

+0x378 CommitChargePeak : Uint8B // 사용된 메모리량

+0x380 AweInfo : Ptr64 Void

+0x388 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INF

+0x390 Vm : _MMSUPPORT

+0x418 MmProcessLinks : _LIST_ENTRY

+0x428 HighestUserAddress : Ptr64 Void

+0x430 ModifiedPageCount : Uint4B

+0x434 Flags2 : Uint4B

+0x434 JobNotReallyActive : Pos 0, 1 Bit

+0x434 AccountingFolded : Pos 1, 1 Bit

+0x434 NewProcessReported : Pos 2, 1 Bit

+0x434 ExitProcessReported : Pos 3, 1 Bit

+0x434 ReportCommitChanges : Pos 4, 1 Bit

+0x434 LastReportMemory : Pos 5, 1 Bit

+0x434 ReportPhysicalPageChanges : Pos 6, 1 Bit

+0x434 HandleTableRundown : Pos 7, 1 Bit

+0x434 NeedsHandleRundown : Pos 8, 1 Bit

+0x434 RefTraceEnabled : Pos 9, 1 Bit

+0x434 NumaAware : Pos 10, 1 Bit

+0x434 ProtectedProcess : Pos 11, 1 Bit

+0x434 DefaultPagePriority : Pos 12, 3 Bits

+0x434 PrimaryTokenFrozen : Pos 15, 1 Bit

+0x434 ProcessVerifierTarget : Pos 16, 1 Bit

+0x434 StackRandomizationDisabled : Pos 17, 1 Bit

+0x434 AffinityPermanent : Pos 18, 1 Bit

+0x434 AffinityUpdateEnable : Pos 19, 1 Bit

+0x434 PropagateNode : Pos 20, 1 Bit

+0x434 ExplicitAffinity : Pos 21, 1 Bit

+0x438 Flags : Uint4B

+0x438 CreateReported : Pos 0, 1 Bit

+0x438 NoDebugInherit : Pos 1, 1 Bit

+0x438 ProcessExiting : Pos 2, 1 Bit

+0x438 ProcessDelete : Pos 3, 1 Bit

+0x438 Wow64SplitPages : Pos 4, 1 Bit

+0x438 VmDeleted : Pos 5, 1 Bit

+0x438 OutswapEnabled : Pos 6, 1 Bit

+0x438 Outswapped : Pos 7, 1 Bit

+0x438 ForkFailed : Pos 8, 1 Bit

+0x438 Wow64VaSpace4Gb : Pos 9, 1 Bit

+0x438 AddressSpaceInitialized : Pos 10, 2 Bits

+0x438 SetTimerResolution : Pos 12, 1 Bit

+0x438 BreakOnTermination : Pos 13, 1 Bit

+0x438 DeprioritizeViews : Pos 14, 1 Bit

+0x438 WriteWatch : Pos 15, 1 Bit

+0x438 ProcessInSession : Pos 16, 1 Bit

+0x438 OverrideAddressSpace : Pos 17, 1 Bit

+0x438 HasAddressSpace : Pos 18, 1 Bit

+0x438 LaunchPrefetched : Pos 19, 1 Bit

+0x438 InjectInpageErrors : Pos 20, 1 Bit

+0x438 VmTopDown : Pos 21, 1 Bit

+0x438 ImageNotifyDone : Pos 22, 1 Bit

+0x438 PdeUpdateNeeded : Pos 23, 1 Bit

+0x438 VdmAllowed : Pos 24, 1 Bit

+0x438 CrossSessionCreate : Pos 25, 1 Bit

+0x438 ProcessInserted : Pos 26, 1 Bit

+0x438 DefaultIoPriority : Pos 27, 3 Bits //I/O 우선 순위 기본 등급

+0x438 ProcessSelfDelete : Pos 30, 1 Bit

+0x438 SetTimerResolutionLink : Pos 31, 1 Bit

+0x43c ExitStatus : Int4B

+0x440 VadRoot : _MM_AVL_TABLE //이 프로세스에 할당된 모든 유저 메모리 영역의 포인터

+0x480 AlpcContext : _ALPC_PROCESS_CONTEXT

+0x4a0 TimerResolutionLink : _LIST_ENTRY

+0x4b0 RequestedTimerResolution : Uint4B

+0x4b4 ActiveThreadsHighWatermark : Uint4B

+0x4b8 SmallestTimerResolution : Uint4B

+0x4c0 TimerResolutionStackRecord : Ptr64 _PO_DIAG_STACK_RECORD

[내용] Windbg를 통해 확인한 EPROCESS 구조체

 

KPROCESS, 즉 PCB(Kernel process block)에는 커널에서 스레드 스케줄링에 필요한 정보들이 들어간다. KPROCESS의 구조체 전체는 아래 내용과 같다.

 

kd> dt _KPROCESS

ntdll!_KPROCESS

+0x000 Header : _DISPATCHER_HEADER //디스패처 개체마다 가지고 있는 헤더로써, 동기화, 우선처리와 같은 대기상황 허용을 위해 사용된다.

+0x018 ProfileListHead : _LIST_ENTRY

+0x028 DirectoryTableBase : Uint8B //프로세스별로 관리되는 가상메모리의 CR3레지스터의 값을 저장한다. –장 PTE에서 다룬다.

+0x030 ThreadListHead : _LIST_ENTRY //프로세스가 가지고 있는 스레드 리스트를 가르킨다.

+0x040 ProcessLock : Uint8B //EPROCESS 접근시 사용될 동기화 개체

+0x048 Affinity : _KAFFINITY_EX //멀터 프로세서에서 이 프로세스가 즐겨 사용하는 선호 프로세서

+0x070 ReadyListHead : _LIST_ENTRY //현재 준비상태의 스레드 리스트

+0x080 SwapListEntry : _SINGLE_LIST_ENTRY //현재 스와핑되고 있는 스레드 리스트

+0x088 ActiveProcessors : _KAFFINITY_EX //현재 활성화된 프로세서 수

+0x0b0 AutoAlignment : Pos 0, 1 Bit

+0x0b0 DisableBoost : Pos 1, 1 Bit

+0x0b0 DisableQuantum : Pos 2, 1 Bit

+0x0b0 ActiveGroupsMask : Pos 3, 4 Bits

+0x0b0 ReservedFlags : Pos 7, 25 Bits

+0x0b0 ProcessFlags : Int4B

+0x0b4 BasePriority : Char //기본 우선순위, -장 스레드 스케줄링에서 다룬다.

+0x0b5 QuantumReset : Char //기본 퀀텀값, -장 퀀텀에서 다룬다.

+0x0b6 Visited : UChar

+0x0b7 Unused3 : UChar

+0x0b8 ThreadSeed : [4] Uint4B

+0x0c8 IdealNode : [4] Uint2B

+0x0d0 IdealGlobalNode : Uint2B

+0x0d2 Flags : _KEXECUTE_OPTIONS

+0x0d3 Unused1 : UChar

+0x0d4 Unused2 : Uint4B

+0x0d8 Unused4 : Uint4B

+0x0dc StackCount : _KSTACK_COUNT

+0x0e0 ProcessListEntry : _LIST_ENTRY

+0x0f0 CycleTime : Uint8B

+0x0f8 KernelTime : Uint4B //프로세스가 커널레벨에서 사용된 시간

+0x0fc UserTime : Uint4B //프로세스가 유저레벨에서 시용된 시간

+0x100 InstrumentationCallback : Ptr64 Void

+0x108 LdtSystemDescriptor : _KGDTENTRY64

+0x118 LdtBaseAddress : Ptr64 Void

+0x120 LdtProcessLock : _KGUARDED_MUTEX

+0x158 LdtFreeSelectorHint : Uint2B

+0x15a LdtTableLength : Uint2B

[내용] Windbg를 통해 확인한 KPROCESS 구조체

 

 

 

프로세서 선호도 지정

우리는 앞서 KPROCESS를 통해, 선호 프로세서를 확인할 수 있음을 알 수 있었다. 그럼 이 선호 프로세서는 어떻게 지정할 수 있을까?

이는 작업관리자에서 쉽게 다음과 같이 지정할 수 있다.

아래와 같이 작업 관리자를 실행한 후 선호도를 저정하고자 하는 프로세스를 선택후, 선호도 설정을 들어갈 수 있다.


↓ 선호 프로세서를 지정하면, 해당 프로세서를 이용하여 실행된다


[그림] 선호 프로세서 지정

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다