温馨提示×

HOOK了NtCreateFile后如何获取被操作文件名

小亿
153
2023-12-20 17:10:46
栏目: 编程语言

要获取被操作的文件名,您可以在HOOK的回调函数中进行操作。具体步骤如下:
1. 在您的HOOK回调函数中,获取`NtCreateFile`函数的参数,包括`FileObject`和`FileName`。
2. 使用`ObReferenceObjectByHandle`函数将`FileObject`转换为文件对象。
3. 使用`IoFileObjectType`对象的`FileObject->FileName`成员获取文件名。
下面是一个示例代码,演示了如何获取被操作文件的文件名:

NTSTATUS NtCreateFileHook(

    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 ) {

    // 调用原始的NtCreateFile函数

    NTSTATUS status = OriginalNtCreateFile(

        FileHandle,

        DesiredAccess,

        ObjectAttributes,

        IoStatusBlock,

        AllocationSize,

        FileAttributes,

        ShareAccess,

        CreateDisposition,

        CreateOptions,

        EaBuffer,

        EaLength

    );

    // 获取被操作的文件名

    if (NT_SUCCESS(status))

    {

        PFILE_OBJECT fileObject;

        status = ObReferenceObjectByHandle(*FileHandle, FILE_READ_ATTRIBUTES, *IoFileObjectType, 

        KernelMode, (PVOID*)&fileObject, NULL);

        if (NT_SUCCESS(status))

        {

            UNICODE_STRING fileName = fileObject->FileName;

            // 在这里进行你的处理,例如输出文件名

            DbgPrint(“%wZ\n”, &fileName);

            ObDereferenceObject(fileObject);

        }

    }

    return status; }

请注意,这只是一个示例代码,用于说明如何在HOOK NtCreateFile后获取被操作的文件名。实际应用中,您需要根据具体的需求进行修改和完善。

0