커널 모드에서 sysenter를 호출하면 어떻게 되나요?
sysenter 호출
CreateFile을 예로 들어 보겠습니다. 이는 일반적이고 nt의 NtCreateFile 함수에 해당하기 때문입니다.
프로그램 스쿼드론에서 CreateFile을 호출하는 경우 컴파일러는 이를 다음 어셈블리 코드로 컴파일합니다.
매개변수가 먼저 스택에 푸시된 다음 함수가 호출됩니다:
01031017 call dword ptr[__imp__CreateFileW@28 (1032000h)]
위 1032000의 값은 0x7664cc56으로, 이 값으로 점프한다는 의미입니다. 이는 다른 모듈의 기능을 적용하는 표준 방법입니다. (가져오기 테이블을 통해 이동)
kernel32 모듈에서 다음 코드를 살펴보세요.
_CreateFileWImplementation@28:
7664CC56 mov edi, edi
피><피>. . .
7664CC98 푸시 dword ptr [ebp 8]
7664CC9B _CreateFileW@28(7664CCA9h)를 호출하세요
. . .
함수가 다시 호출됩니다. 호출 메서드는 여전히 kernel32에 있어야 합니다.
_CreateFileW@28:
7664CCA9 jmp dword ptr[__imp__CreateFileW@28 (766019E0h) ]
처리 방법은 exe와 동일한 것으로 보입니다. 다른 모듈의 함수로 점프할 때 가져오기 테이블의 해당 함수 주소가 사용됩니다.
물론 KernelBase.dll에 있습니다. (VS2010은 dll을 로드할 때마다 해당 위치에서 시작한다는 것을 알았습니다. 이는 보안상의 이유이지만 디버깅할 때 매우 짜증납니다.)
_CreateFileW@28 :
75B9A850 mov edi, edi
. . .
매개변수를 준비하고 스택에 푸시합니다(44바이트 매개변수),
75B9AA1B lea eax, [ebp-8]
75B9AA1E push eax
p>
p>
75B9AA1F esi
75B9AA21 mov ebx,eax
75B9AA23 mov edi,0C0000022h
를 호출합니다. . .
호출 후 ntdll의 _NtCreateFile@44에 도달합니다(이 함수는 msdn에 도입되었으며, 처리된 파일 이름이 매개변수에 포함되어 있습니다). 이 함수는 호출 번호와 튀어나온 바이트 수만 다르기 때문에 소프트웨어로 생성해야 합니다.
_NtCreateFile@44:
778455C8 mov eax, 42h
778455CD mov edx, 7FFE0300h
778455D2 call dword ptr [edx]
778455D4 ret 2Ch
위의 42h는 win7에서는 없습니다! NtCreateFile의 시스템 호출 번호(win2003과 다르네요. 마이크로소프트는 정말 역겨워요). 7FFE0300h는 고정된 위치로, CPU가 sysenter를 지원하는지 여부에 따라 다른 기능으로 설정됩니다.
다음은 KiFastSystemCall입니다:
_KiFastSystemCall@0:
778470B0 mov edx, esp
778470B2 sysenter
리턴 없이 위 함수를 호출하기 전, eax는 시스템 호출의 호출 번호인데 edx는 무엇일까요? 다음 스택 구조를 살펴보십시오.
KiFastSystemCall@0 반환 후 eip 주소
_NtCreateFile@44 반환 후 eip 주소
매개변수 1
매개변수 2
매개변수 3에는 경로 정보가 포함됩니다. 확인 방법은 아래를 참고하세요.
. . .
매개변수 11
따라서 edx-8은 첫 번째 매개변수의 주소입니다. 매개변수 3은 다음과 같이 확인됩니다.
주소는 POBJECT_ATTRIBUTES 구조를 가리킵니다. 세 번째 멤버는 파일 이름입니다.
자, 이것이 전부 사용자 모드이고 나머지는 커널에 들어가야 합니다.