메모장 입니다2

Windows] SSDT 후킹 - 설명 본문

Study/Programming

Windows] SSDT 후킹 - 설명

Wooum@n 2017. 3. 17. 01:37

1.SSDT 정의


 -System Service Descriptor Table.

 -유저모드의 API 함수를 호출했을 때에 최종적으로 호출되는 

 커널영역의 Native API 함수들의 주소가 저장된 커널 구조체.

 -시스템 콜번호 순서대로 함수주소가 저장되있다.

 -ntoskrnl.exe 영역에 존재하며, Native API 함수코드 또한 이 곳에 존재한다.





2.API 실행 구조


-유저모드

1)CreateFile() 호출.

2)문자 타입에 따라 CreateFileA/CreateFileW 호출.

3)kernel32.dll!CreateFile 호출

4)ntdll.dll!nt/zwCreateFile 호출.

->SSDT의 인덱스 번호 전달.

->유저모드에서 사용된 스택주소 전달.

->*시스템콜을 통한 커널영역 진입.


*시스템콜

1)int 2e

: KiSystemService()를 바로 호출

2)SYSENTER

: KiFastCallEntry() 호출,

KiFastCallEntry 내에서 KiSystemService()가 호출됨.



 -커널모드

1)KiSystemService(시스템 서비스 디스패처) 호출.

->ntdll.dll에서 저장했던 SSDT 인덱스번호를 이용해

 nt!KeServiceDescriptorTable!SSDT에서 해당 함수를 호출.


 -디버깅

1)32bit

->SYSENTER를 이용한 시스템 콜.



2)64bit

->WOW64를 경유한 시스템 콜.


*TEB[C0]: WOW64Reserved





3.계획


 -필요 요소

1)SSDT 주소

->ntoskrnl.exe에서 제공하는 KeServiceDescriptorTable 구조체의 하위멤버 ServiceTableBase가 

가리킨다.

>>__declspec(dllimport)로 얻어옴.


2)인덱스 번호

->zwXX 함수시작주소에 위치한 mov eax, [인덱스 번호] 명령어를 따라가, 

  인덱스 번호에 해당하는 메모리값을 읽음.

>>zwXX의 함수주소+1이 인덱스 번호. //메크로 사용.



 -메모리 보호 해제

1)MDL(Memory Descriptor List)

->지정한 메모리에 대한 속성 및 정보를 저장하여 관리. 


2)CR0(Control Register)

->프로세서 레지스터로 프로세스의 동작모드, 속성을 지정 가능.

->구조

*CR0[16]: 1 -> 0 //WP off