要獲取被操作的文件名,您可以在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
后獲取被操作的文件名。實際應用中,您需要根據具體的需求進行修改和完善。