【问题标题】:Hook NtReadFile. Change text挂钩 NtReadFile。更改文本
【发布时间】:2017-02-19 05:07:13
【问题描述】:

我想挂钩 NtReadFile 以便它可以更改从文件中读取的文本。但是当我尝试读取文件时,我收到消息“此应用程序无法启动,因为应用程序配置不正确”。

这是我的代码。怎么了?

NTSTATUS HookNtReadFile (
    IN HANDLE FileHandle,
    IN HANDLE Event,
    IN PIO_APC_ROUTINE ApcRoutine,
    IN PVOID ApcContext,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    OUT PVOID Buffer,
    IN ULONG Length,
    IN PLARGE_INTEGER ByteOffset,
    IN PULONG Key) 
{
    NTSTATUS retstatus;

    retstatus = glRealNtReadFile (FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key);

    IoStatusBlock->Information = 3;
    Length = 3;
    Buffer = ExAllocatePool(PagedPool, Length);
    Buffer = "hi";

    return retstatus;
}

【问题讨论】:

  • 您是否尝试过为该错误消息列出的steps
  • 你为什么要这样做?
  • @andlabs 这是我在大学的任务之一。我做了另一个钩子(NtCreateFile、NtOpenFile...),但是使用 NtReadFile 我遇到了一些问题。
  • 你应该小心你的钩子。似乎您正在用"hi" 替换每个读取的文件。在这种情况下,这可能会妨碍 Windows 读取您的可执行文件或支持文件(如清单)。尝试仅更改对特定文件或特定程序的特定调用的结果。

标签: c winapi hook wdk


【解决方案1】:

这显然行不通:

Buffer = ExAllocatePool(PagedPool, Length);
Buffer = "hi";

您正在分配内存,然后立即丢弃该地址。这不是您在 C 中复制字符串的方式。您需要使用 strcpy,或者最好使用更安全的替代方法之一。

还值得指出的是,Native API 不使用 ASCII 字符。一般来说,所有字符串都应该是宽字符串。

最后,只有在返回码表示成功时,并且(正如其他人在 cmets 中指出的那样)文件句柄与您尝试更改的特定文件相关联时,您才应该更改这些值。

【讨论】:

    【解决方案2】:

    http://www.rohitab.com/discuss/topic/40492-my-first-kernel-mode-rootkit/

    我知道它看起来像一个狡猾的链接。但您所寻求的答案可以一键找到。

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      相关资源
      最近更新 更多