在delphi中获取指针缓冲区(ZwWriteFile)的内容



我在ZwWriteFile上设置了一个全局钩子来加密所有写文件。这是我的新实例ZwWriteFile:

function New_ZwWriteFile(FileHandle: HANDLE; Event: HANDLE;
  ApcRoutine: PIO_APC_ROUTINE; ApcContext: PVOID;
  IoStatusBlock: PIO_STATUS_BLOCK; Buffer: PVOID; Length: ULONG;
  ByteOffset: PLARGE_INTEGER; Key: PULONG): THandle; stdcall;
Begin
///
End;

当我在New_ZwWriteFile中调用原始ZwWriteFile时,由于缓冲区为空,文件已损坏!

function New_ZwWriteFile(FileHandle: HANDLE; Event: HANDLE;
  ApcRoutine: PIO_APC_ROUTINE; ApcContext: PVOID;
  IoStatusBlock: PIO_STATUS_BLOCK; Buffer: PVOID; Length: ULONG;
  ByteOffset: PLARGE_INTEGER; Key: PULONG): THandle; stdcall;
Begin
  result := Old_ZwWriteFile(FileHandle, Event, ApcRoutine, ApcContext,
        IoStatusBlock, Buffer, Length, ByteOffset, Key);
End;  

我也测试@Buffer,但得到相同的结果!

  result := Old_ZwWriteFile(FileHandle, Event, ApcRoutine, ApcContext,
        IoStatusBlock, @Buffer, Length, ByteOffset, Key);

,缓冲区数据类型为Pointer,我如何检索它的内容并将其写入文件?任何想法?

首先,我们必须假设HANDLE被正确定义为THandle的别名。或者至少是指针大小的类型。并且问题中代码中的其他类型都是正确翻译的。如果这些翻译是不正确的,那么显然可以解释你的问题。

除此之外,问题中的代码唯一错误的地方是返回值的类型。应该是NTSTATUS而不是THandle。这将对x64产生影响,因为NTSTATUS是32位宽的,而THandle是指针大小的。

使用@Buffer代替Buffer是一个严重的错误。别这样。

最新更新