Windows Hooking을 연구하다가 기초가 너무 없음을 느끼고서 차근차근 해보자는 심정으로 조사를 해봤다.


일단. GDT!


1) GDT


GDT : Global Descriptor Table의 약자이며, 해당 레벨에 사용할 메모리 영역을 지정하는데 이때 메모리 전체의 사용 영역을 서술하는 테이블을 GDT라고 한다.

이때! 레벨에 사용할 메모리 영역을 지정하는게 또 뭔가...ㅠ



사용자가 커널공간을 침범하기 못하게 하기 위해 CPU자체에서 메모리 접근에 대한 검사를 하는데 이때 이 특권링, 혹은 특권레벨을 검사하게 된다. 


Level 0 : 커널 공간(Core)

Level 1~2 : 커널 공간(Subsystem )

Level 3 : 유저 공간


으로 나뉘어 지며, Level 0에는 커널의 핵심 부분이 위치하고, 디바이스나 GUI같은 서비스들은 Level 1~2에 위치하며 User Application은 Level 3에 위치하게 된다. 하지만 보통의 운영체제는  0,3 두가지만 사용된다고 한다.


GDT는 세그먼트 디스크립터 자료구조를 이용해 테이블에 저장하는데, 세그먼트 디스크립터의 구조를 보면 다음과 같다.


< 세그먼트 디스크립터(SD : Segment Descriptor) >



GDT의 자세한 구조는 IA-32 Intel(R) Architecture Software Developer's Manual에 나와있습니다.

우리가 알아볼 것은 GDT에서 중요한 DPL과 Type필드인데 


DPL - (Descriptor Privilege Level)로 2비트로 되어 있으며, 특권 레벨 지정에 쓰인다.

Type - 해당 영역이 코드인지, 데이터 혹은 읽기/쓰기 권한, 실행 권한을 지정한다.


2) LDT


LDT : Local Descriptor Table의 약자이며, GDT가 운영체제와 모든 어플리케이션에서 참조하는 세그먼트들을 정의할 때 쓰인다면, LDT는 각각의 어플리케이션마다 고유한 세그먼트를 정의할 때 사용된다. 또한 LDT의 특징으로는 태스크 전환에 연동되어 전환이 가능한 테이블이며,Base address, access rights, 타입, 길이, 그리고 현재 세그먼트에 대한 사용 정보를 저장합니다. 

LDT의 위치를 나타내는 세그먼트 디스크립터를 GDT안에 저장한뒤에, 그떄의 인덱스를 LDTR레지스터에 넣어주면, CPU는 LDT를 읽어들임으로써 태스크의 전환이 일어나게 되는것이다.


3) IDT


IDT : Interrupt Descriptor Table의 약자로써, 인터럽트가 발생하였을 때 처리해주는 함수의 루틴을 포함하는 테이블이다.(인터럽트에 관한 자료는 이전 포스팅 참조)


< IDT 구조 >


Offset 15:0과 Offset 31:16 이 두 필드가 합쳐진 32비트 값이 실제 인터럽트처리 루틴의 주소를 가지고 있는 인터럽트오브젝트의 주소를 나타낸다. 만일, 프로세서가 여러 개라면 IDT도 프로세서의 개수에 맞추어 존재한다. 


4) SSDT


SSDT : System Service Dispatch Table 의 약자이며, System service API함수(Native API)의 주소를 담고 있는 테이블이다. System service API는 유저모드 애플리케이션이 Kernel service를 받고자 할 때 사용되는 함수이다.

KeServiceDescriptorTable은 커널이 제공하는 테이블로써 SSDT의 주소를 가지고 있다.

총 4개의 서비스 테이블로 구성되어 있고 각각의 서비스 테이블은 ServiceDescriptorEntry라는 구조체로 이루어져 있다.


typedef struct ServiceDescriptorEntry{

PDWORD base

PDWORD counter

DWORD limit

PBYTE arg

}SDE;


typedef struct ServiceDescriptorTable{

SDE ntoskrnl;

SDE win32k;

SDE reserved[2];

}SDT;

< SDT 구조 >


base - 함수 테이블의 시작주소를 가르킴

counter - 각 함수가 몇 번 호출되었는지를 기록함.

limit - 함수 테이블에 포함된 함수의 개수를 저장.

arg - 인자크기를 저장하는 테이블 시작주소 가르킴.

'O.S' 카테고리의 다른 글

Flag Register  (0) 2012.07.20
Mutex  (0) 2012.05.16
Classic Problems of Synchronization / Monitor  (0) 2012.04.27
Synchronization Hardware  (0) 2012.04.27
Semaphore  (0) 2012.04.27

+ Recent posts