게임 시큐리티2009/10/13 13:40


 
System Service Dispatcher


ntdll.dll -->
        eax, 인덱스
        edx, 리턴값
        int 2Eh
                  --> ntoskrnl.exe


ntdll.dll Zw* Nt* 함수가 있으면
ntoskrnl.exe Zw* Nt* 함수가 존재한다.

ntdll.dll 은 단순히 인터페이스이고, ntdll.Zw* ntdll.Nt* 함수가 같은 주소를 사용하는 동일함수이다.
ntoskrnl.exe 에 ntoskrnl.Nt* 함수가 진짜 함수 ...

 

Service Descriptor Tables (SST)


ntoskrnl , win32k 두개의 시스템 서비스 테이블을 가지고 있고
이는 각각 KiServiceTable, KiArgumentTable
W32pServiceTable , W32pArgumentTable 이라는 테이블을 가지고 있다.

이 테이블들은 각각 함수의 주소와 인자의 갯수를 가진 배열구조체 이다.


int 2Eh 는 바로 위 테이블을 참조해서 KiSystemService() 로 진입하고 쓰레드는
global SDT를 사용하지 않고 KeServiceDescriptorTable 을 사용하지 않고 자체의 포인터로
KiServiceTable 와 KiArgumentTable을 참조한다.


ntdll.dll 과 ntoskrnl.exe 가 가진 함수는

C runtime library ( memcpy , sprintf .. )
Extended runtime library ( Rtl* ...)
Floating-point emulator ( _eFLD .. )

그리고 기타 프리픽스에 따라
Ki : 커널 인터럽트 핸들러
Ke : 커널 루틴
Ldr : 이미지 로더
Ps : 프로세스 서포트
Nt : Native NT API
Hal : 하드웨어 추상레이어 함수  ...



자주사용되는 데이터 타입은


문자열의 경우 UNICODE_STRING 이고
Length, MaximumLength, Buffer ... 세가지로 이루어진 구조체인데
이를 다룰려면 RtlCreateUnicodeString , RtlInitUnicodeString , RtlCopyUnicodeString 등 함수를 사용해야됨...


Native API 에 접근하기 위해서는 ntdll.lib 을 사용하고
커스터마이징 헤더를 사용하면 됨...

참고는 Undocumented Windows 2000 Secrets, "The Windows 2000 Runtime Library" 편에서...

Posted by 진실찾기