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()을 호출하면 되겠군요!
복구시에는 저장했던 함수의 주소로 다시 바꿔치면......
[출처] ZwCreateFile()????