NtCreateFileをフックした後、操作されたファイル名をどのように取得しますか?
ファイル名を取得するために、操作を行う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; }
注意してください。これはNtCreateFileのフック後に操作されたファイル名を取得する方法を示したサンプルコードです。実際のアプリケーションでは、具体的な要件に基づいて修正や改善が必要です。