예전에 IDT 후킹을 통한 PS/2 키로거를 만들면서 구조를 파악했었는데 발표 때문에 몇달만에 다시 보니 구조가 가물가물하더군요. 내용 까먹기가 아까워서 그냥 직접 커널을 추적하며 그려봤습니다. 단순 복습.. ;;
IDTENTRY 부분은 직접 WinDbg에 있는 값을 그대로 가져왔습니다. ( Windows XP SP3 )
IDTENTRY 그림처럼 생겼으며 상위 2Byte 하위 2Byte에서 Gate Address를 구할 수 있습니다.
High 값 기준으로 세번째 Byte는 비트마다 의미가 있는데 그 의미는 다음과 같습니다.
http://wiki.osdev.org/IDT
P (Present): 사용하지 않는 인터럽트나 페이징을 위해 0으로 셋팅가능한 비트
DPL (Descriptor Privilege Level): 게이트 호출을 보호하는 비트. 인터럽트를 호출할 수 있는 권한을 나타냄
그래서 하드웨어와 CPU 인터럽트는 유저영역에서 호출되는 것을 막을 수 있다.
S (Storage Segment): 인터럽트 게이트는 0
Typ (Gate Type 0...3): 가능한 IDT 게이트 타입
위 그림에서 0x93은 키보드 인터럽트 입니다. 그렇기 때문에 80386 32bit interrupt gate라는 것을 알 수 있습니다.
게이트가 호출되면 내부적으로 KiInterruptDispatch함수를 호출하게 되며 해당 함수에서는 해당 인터럽트에 맞게 IRQL값을 설정해주고 실질적인 인터럽트 서비스 루틴(ISR)을 호출하게 됩니다.
복습 차원에서 적어봤습니다.
IDT 후킹 루틴은 다음과 같이 짜면 됩니다.
IDTENTRY 부분은 직접 WinDbg에 있는 값을 그대로 가져왔습니다. ( Windows XP SP3 )
IDTENTRY 그림처럼 생겼으며 상위 2Byte 하위 2Byte에서 Gate Address를 구할 수 있습니다.
High 값 기준으로 세번째 Byte는 비트마다 의미가 있는데 그 의미는 다음과 같습니다.
http://wiki.osdev.org/IDT
P (Present): 사용하지 않는 인터럽트나 페이징을 위해 0으로 셋팅가능한 비트
DPL (Descriptor Privilege Level): 게이트 호출을 보호하는 비트. 인터럽트를 호출할 수 있는 권한을 나타냄
그래서 하드웨어와 CPU 인터럽트는 유저영역에서 호출되는 것을 막을 수 있다.
S (Storage Segment): 인터럽트 게이트는 0
Typ (Gate Type 0...3): 가능한 IDT 게이트 타입
0101 | 0x5 | 80386 32bit Task gate |
0110 | 0x6 | 80286 16bit interrupt gate |
0111 | 0x7 | 80286 16bit trap gate |
1110 | 0xE | 80386 32bit interrupt gate |
1111 | 0xF | 80386 32bit trap gate |
위 그림에서 0x93은 키보드 인터럽트 입니다. 그렇기 때문에 80386 32bit interrupt gate라는 것을 알 수 있습니다.
게이트가 호출되면 내부적으로 KiInterruptDispatch함수를 호출하게 되며 해당 함수에서는 해당 인터럽트에 맞게 IRQL값을 설정해주고 실질적인 인터럽트 서비스 루틴(ISR)을 호출하게 됩니다.
복습 차원에서 적어봤습니다.
IDT 후킹 루틴은 다음과 같이 짜면 됩니다.
'My Study > Programming&Theory' 카테고리의 다른 글
Windows Cache (2) | 2011.05.31 |
---|---|
Share Memory & Share Moudle (0) | 2011.05.26 |
Get clipboard data (0) | 2011.05.17 |
프로세스 생성 막기 (2) | 2011.04.28 |
IEEE Std 754 (2) | 2011.04.27 |