EPROCESS와 KPROCESS, ETHREAD, KTHREAD 구조체

프로세스를 관리하기 위해 커널에서 사용하는 EPROCESS와 KPROCESS, ETHREAD, KTHREAD 구조체에 대해 더 자세히 알아보도록 하자.

프로세스와 스레드에 대한 정보를 담고 있는 만큼 이 와 연결된 서브 구조체들도 상당히 많다.

운영체제의 우리가 파악하고자 하는 프로세스와 스레드의 모든 정보가 여기 이 구조체를 파악함으로써 이해할 수 있게 된다.

EPROCESS에서는 KPROCESS(Kernel process block)의 포인터를 통해 프로세스 정보들과 프로세스에서 생성되는 기본 스레드 정보를 가지고 있다. 이외에도 EPROCESS에는 프로세스 식별 정보, 프로세스에서 사용하는 메모리 정보, 그리고 PEB(Process environment block) 등의 정보를 확인 할 수 있고, KPROCESS(PCB) 커널 모드에서 동작한다. (앞서 애기 했듯이 PEB와 PCB block은 커널에 존재한다.) 즉 PEB는 Csrss가 프로세스를 관리를 위해 자유롭게 접근할 수 있도록 유저모드로 생성되었고 PCB는 Win32k에서 스레드 생성과 같은 작업을 위한 커널 모드에서 접근 가능하도록 구분되어 사용된다.

그럼 계속 해서, 스레드 정보를 관리하는 ETHREAD를 알아보자. ETHREAD는 KPROCESS의 ThreadListhead를 통해 서로 링크드 리스트로 관리 되며, EPROCESS와 같이 유저모드와 커널모드의 영역에서 활동한다. ETHREAD역시 KTHREAD(Kernel Thread) block의 포인터 정보를 가지고 있으며, KTHREAD(TCB)의 KPROCESS와 같이 커널 모드에서 동작하며, Thread environment block(TEB) 포인터 정보와 스레드 스케줄링과 실행 퀀텀값등의 정보를 가지고 있다.

이 4가지 구조체는 EPROCESS를 중심으로 서로 연결되어 있으며, 이 구조체들의 연관관계를 그림으로 표현하면 아래와 같다.

EPROCESS와 KPROCESS, ETHREAD, KTHREAD 구조체

[그림]프로세스와 스레드 오브젝트의 연관 관계

우리는 앞으로, Windbg에서 dt(Display Type) 명령을 통해 구조체에서 해당 정보를 확인할 것이다. 이는 차후 여러 방향에서 응용 사용이 가능하다.

구조체 확인에 앞서 dt 명령에 대해 알아보자.

dt는 Windbg에서 제일 많이 사용하는 명령어중 하나로, 지역 변수값, 전역 변수값 또는 데이터 타입과 구조체등을 확인할 수 있다.

기본적인 명령어 사용방법은 다음과 같다. (자주 사용하는 옵션을 굵게 표시했다.)

dt [-DisplayOpts] [-SearchOpts] Address/[module!]Name [-l List] [-SearchOpts]

DisplayOpts은 필수는 아니지만 기본적인 정보에서 출력 내용을 조절할 수 있다. 사용할 수 있는 옵션에 대해 알아보자.

-a[개수]: 현재 색인된 지정 구조체 정보의 표시 개수를 지정한다. [개수]를 지정하지 않으면 전체를 표시한다.

-b: 하위 구조체가 있는 경우 하위 구조체 정보도 함께 표시한다.

-c: 하나의 라인으로 구조체를 표시한다.

-d: 구조체이름과 비슷한 구조체를 함께 검색하기 위해 *사용시 해당 이름이 포함된 구조체 전부를 표시한다. 지정시 모듈은 기입을 하여야 한다.

-e: 거희 사용되지 않는것으로 강제로 정보를 표시하고자 할 때 사용한다.

-i: 하위 구조체는 제외하고 표시한다.

-o: 오프셋 값을 생략하고 표시한다.

-p: 물리 주소를 기준으로 표시한다. (기본적으로는 가상주소로 사용한다.)

-r[개수]: 하위 구조체 표시 깊이를 지정할 수 있다.

-s: 저정한 사이즈와 같은 구조체 필드를 표시한다. –v 옵션과 함께 사용하면 유용하다.

-v: 각 구조체 필드에 대해 세부 정보를 함께 표시한다.

SearchOpts은 모듈 이름을 검색 하거나 모듈내 필드를 검색할 수 있다. 정확한 구조체 이름을 모를 때 유용하다. 2가지 옵션이 있는데, 같이 지정하여 사용할 수 있다.

-n: 다음 인자가 주소가 아닌 이름이라는 것을 나타낸다.

-y: 지정한 이름으로 시작하는 구조체나 구조체 필드의 정보를 표시한다.

프로세스 – EPROCESS, KPROCESS

 

스레드 – ETHREAD, KTHREAD

Facebook Comments

Leave A Reply

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