要获取被操作的文件名,您可以在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
后获取被操作的文件名。实际应用中,您需要根据具体的需求进行修改和完善。
辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
推荐阅读: Hook(钩子技术)基本知识讲解,原理