2010-06-01 6 views
1

ZWOpenFile과 NtOpenFile은 모두 nt dll의 함수입니다 .ZwOpenFile은 NtopenFile과 동일하게 구현됩니다.하지만 왜 ZWopenFile이 DLL 함수에 포함되어 있는지 이해할 수 없습니다. 차이점을 설명해 주실 수 있습니까?ZwOpenFile과 NtOpenFile의 차이점은 무엇입니까?

답변

3

documented in MSDN입니다 :

커널 모드 드라이버는 매개 변수가 신뢰할 수있는, 커널 모드 소스에서 제공하는 루틴을 알리기 위해 기본 시스템 서비스 루틴의 ZW 버전을 호출합니다. 이 경우 루틴은 먼저 매개 변수를 검증하지 않고 매개 변수를 안전하게 사용할 수 있다고 가정합니다. 그러나 매개 변수가 사용자 모드 소스 또는 커널 모드 소스 중 하나 일 경우 드라이버는 대신 Nt 버전의 루틴을 호출합니다.이 버전은 호출 스레드의 기록을 기반으로 사용자가 시작한 매개 변수 모드 또는 커널 모드. 루틴이 커널 모드 매개 변수와 사용자 모드 매개 변수를 구별하는 방법에 대한 자세한 내용은 PreviousMode을 참조하십시오.

기본적으로 매개 변수의 유효성 검사 방법과 관련이 있습니다.

2

일반적으로 커널 드라이버는 ZwXxx() 기능 만 사용해야합니다.

사용자 모드에서 호출 할 때 ZwXxx()NtXxx() 함수는 완전히 동일합니다. ntdll.dll에서 동일한 코드 비트를 처리합니다.

커널 모드 드라이버에서 호출 할 때 Zwxxx() 변형은 커널이 사용하는 플래그가 요청자 모드 (호출자의 모드를 나타내는 것으로 가정)가 커널 모드임을 나타내도록 설정됩니다. 커널 드라이버가 NtXxx() 변형을 호출하면 요청자 모드가 명시 적으로 설정되지 않으므로이 지점까지는 호출 스택에서 발생한 내용에 따라 사용자 또는 커널 모드를 나타낼 수 있습니다.

요청자 모드 플래그가 사용자 모드로 설정된 경우 커널은 올바른 작업이 아닌 매개 변수의 유효성을 검사합니다 (특히 커널 드라이버가 커널 모드 버퍼를 통과하는 경우 유효성 검사가 실패하므로 커널 모드로 설정되면 커널은 암시 적으로 매개 변수를 신뢰합니다.

이러한 API 이름을 사용하는 규칙은 일반적으로 다음과 같이 요약됩니다. 커널 드라이버를 작성하는 경우 ZwXxx() 버전으로 전화하십시오 (특수 상황을 다루지 않는 경우가 아니라면 자신이하는 일과 그 이유). 사용자 모드 구성 요소를 작성하는 경우 사용자가 호출하는 설정은 중요하지 않습니다.

내가 아는 한 Microsoft는 NtXxx()을 사용자 모드에서 사용하기 위해 문서화합니다 (사용자 모드는 해당 ZwXxx() 기능과 동일한 사용자 모드임을 나타냄).

0

OP 또는 다른 사람을 보장하기 위해 이미 말한 것을 보여주는 예는 완벽한 그림을 얻습니다.

  1. 사용자 모드에서의 NtXxx 호출은 신뢰도가 낮은 데이터 (사용자 모드에서)를보다 권한있는 계층 (커널 모드)으로 전달합니다. 따라서 버퍼에 유효한 사용자 모드 주소가 있고 전달되는 핸들이 유효한 사용자 모드 핸들 등일 것으로 예상됩니다.

  2. 드라이버가 동등한 ZwXxx 대신 NtXxx API를 호출하면 유효한 사용자 모드 인수가 있는지 확인해야합니다 즉, 커널 모드 주소 (유효하더라도)와 커널 모드 핸들 (OBJ_KERNEL_HANDLE 참조)을 전달할 수 없습니다.

  3. 이미 API의 ZwXxx에 해당하는 기능은 피 호출자가 호출자와 동일한 권한 수준에 있기 때문에 이러한 매개 변수 유효성 검사를 건너 뛰어야 함을 명시 적으로 나타냅니다 (요청자 수준을 통해). 여기

는 분명, https://www.osronline.com/article.cfm?id=257 넘어 가고 싶은 사람을위한 좋은 출발점에 대한 링크입니다.

관련 문제