메모장 입니다2
Windows] SSDT 후킹 - 설명 본문
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
'Study > Programming' 카테고리의 다른 글
Windows] SSDT 후킹 - ZwQuerySystemInformation Hook Source (0) | 2017.08.08 |
---|---|
IDT 후킹 (0) | 2017.03.22 |
Windows] SSDT 후킹 - MDL 활용. (0) | 2017.03.16 |
Windows] 드라이버 개발 - 6) IRP (0) | 2017.02.24 |
Windows] 드라이버 개발 - 5) WDM 드라이버, 디바이스 스택 (0) | 2017.02.23 |