我在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
是一个严重的错误。别这样。