개체 핸들

드라이버 및 사용자 모드 구성 요소는 핸들을 통해 대부분의 시스템 정의 개체에 액세스 합니다. 핸들은 핸들 불투명 데이터 형식으로 표시됩니다. (핸들은 디바이스 개체 또는 드라이버 개체에 액세스하는 데 사용되지 않습니다.)

대부분의 개체 형식에서 개체를 만들거나 여는 커널 모드 루틴은 호출자에게 핸들을 제공합니다. 그런 다음 호출자는 개체에 대한 후속 작업에서 해당 핸들을 사용합니다.

다음은 드라이버에서 일반적으로 사용하는 개체 형식 목록과 해당 형식의 개체에 대한 핸들을 제공하는 루틴입니다.

개체 유형 해당 만들기/열기 루틴

파일

IoCreateFile, ZwCreateFile, ZwOpenFile

레지스트리 키

IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey

스레드

PsCreateSystemThread

이벤트

IoCreateSynchronizationEvent, IoCreateNotificationEvent

바로 가기 링크

ZwOpenSymbolicLinkObject

디렉터리 개체

ZwCreateDirectoryObject

Section 개체

ZwOpenSection

드라이버가 더 이상 개체에 액세스할 필요가 없는 경우 ZwClose 루틴을 호출하여 핸들을 닫습니다. 위의 표에 나열된 모든 개체 형식에 대해 작동합니다.

핸들을 제공하는 대부분의 루틴은 OBJECT_ATTRIBUTES 구조를 매개 변수로 사용합니다. 이 구조체를 사용하여 핸들의 특성을 지정할 수 있습니다.

드라이버는 다음 핸들 특성을 지정할 수 있습니다.

  • OBJ_KERNEL_HANDLE

    핸들은 커널 모드에서만 액세스할 수 있습니다.

  • OBJ_INHERIT

    현재 프로세스의 모든 자식은 핸들을 만들 때 핸들의 복사본을 받습니다.

  • OBJ_FORCE_ACCESS_CHECK

    이 특성은 시스템이 핸들에 대한 모든 액세스 검사를 수행한다고 지정합니다. 기본적으로 시스템은 커널 모드에서 만든 핸들에 대한 모든 액세스 검사를 무시합니다.

InitializeObjectAttributes 루틴을 사용하여 이러한 특성을 OBJECT_ATTRIBUTES 구조로 설정합니다.

개체 핸들의 유효성을 검사하는 방법에 대한 자세한 내용은 개체 핸들 유효성 검사 실패를 참조하세요.

Private Object Handles

드라이버가 프라이빗 용도로 개체 핸들을 만들 때마다 드라이버는 OBJ_KERNEL_HANDLE 특성을 지정해야 합니다. 이렇게 하면 사용자 모드 애플리케이션에서 핸들에 액세스할 수 없습니다.

공유 개체 핸들

커널 모드와 사용자 모드 간에 개체 핸들을 공유하는 드라이버는 실수로 보안 허점이 발생하지 않도록 신중하게 작성해야 합니다. 다음은 몇 가지 지침입니다.

  1. 커널 모드에서 핸들을 만들고 다른 방법 대신 사용자 모드로 전달합니다. 사용자 모드 구성 요소에서 만들어 드라이버에 전달된 핸들은 신뢰할 수 없습니다.

  2. 드라이버가 사용자 모드 애플리케이션을 대신하여 핸들을 조작해야 하는 경우 OBJ_FORCE_ACCESS_CHECK 특성을 사용하여 애플리케이션에 필요한 액세스 권한이 있는지 확인합니다.

  3. ObReferenceObjectByPointer를 사용하여 공유 핸들에 커널 모드 참조를 유지합니다. 그렇지 않으면 사용자 모드 구성 요소가 핸들을 닫으면 참조 수가 0으로 이동하고 드라이버가 핸들을 사용하거나 닫으려고 하면 시스템이 충돌합니다.

사용자 모드 애플리케이션이 이벤트 개체를 만드는 경우 드라이버는 해당 이벤트가 신호를 받을 때까지 안전하게 기다릴 수 있지만 애플리케이션이 IOCTL을 통해 이벤트 개체에 대한 핸들을 드라이버에 전달하는 경우에만 가능합니다. 드라이버는 이벤트를 만든 프로세스의 컨텍스트에서 IOCTL을 처리해야 하며 ObReferenceObjectByHandle을 호출하여 핸들이 이벤트 핸들인지 확인해야 합니다.