'ZwCreateFile()'에 해당되는 글 1건

  1. 2008.12.03 ZwCreateFile()
Programming/Kernel / Driver2008. 12. 3. 11:34

ZwCreateFile()....여러모로 쓸모있는 함수입니다.

파일 핸들을 얻어올 때, 파일을 생성할 때, 파일을 이동할 때, 파일을 삭제할 때 등등 여러모로 쓰이는 유용한 함수인데.....

(파일 삭제할때도 쓰이는줄은 몰랐었다)


원형을 보면

NTKERNELAPI

NTSTATUS
NTAPI
ZwCreateFile(
      OUT PHANDLE FileHandle,
      IN ACCESS_MASK DesiredAccess,
      IN POBJECT_ATTRIBUTES ObjectAttributes,
      OUT PIO_STATUS_BLOCK IoStatusBlock,
      IN PLARGE_INTEGER AllocationSize OPTIONAL,
      IN ULONG FileAttributes,
      IN ULONG ShareAccess,
      IN ULONG CreateDisposition,
      IN ULONG CreateOptions,
      IN PVOID EaBuffer OPTIONAL,
      IN ULONG EaLength);

......이렇습니다.


그러나!

이렇게 인자가 많은 반면, 실질적으로 이 함수가 하는 일은 단순히 NewAPI인 IoCreateFile()을 호출하는 역할만 한다는거.....!

(원래 이 일은 ZwCreateFile가 아닌 NtCreateFile이 한다)


직접 구현해 보면 이렇습니다.

NTSTATUS
NTAPI
ZwCreateFile(
    OUT PHANDLE FileHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN PLARGE_INTEGER AllocationSize OPTIONAL,
    IN ULONG FileAttributes,
    IN ULONG ShareAccess,
    IN ULONG CreateDisposition,
    IN ULONG CreateOptions,
    IN PVOID EaBuffer OPTIONAL,
    IN ULONG EaLength)
{
      return IoCreateFile(
            FileHandle,
            DesiredAccess,
            ObjectAttributes,
            IoStatusBlock,
            AllocationSize,
            FileAttributes,
            ShareAccess,
            CreateDisposition,
            CreateOptions,
            EaBuffer,
            EaLength,
            CreateFileTypeNone,
            NULL,
            0);

}

Documented By :

ReactOS


실제로, 제가 ZwCreateFile()을 후킹해서 위와 같은 함수주소로 바꿔치기하여 성공적으로 작동하는지 시도해 본 결과,

성공적으로 잘 되었습니다.

후킹할 때, IoCreateFile()이 후킹되지 않았다면, ZwCreateFile()의 원래 함수를 호출하는 대신, IoCreateFile()을 호출하면 되겠군요!

복구시에는 저장했던 함수의 주소로 다시 바꿔치면......

Posted by skensita