【问题标题】:Is anyone familiar with the undocumented ObReferenceObjectByName windows kernel function?有人熟悉未记录的 ObReferenceObjectByName windows 内核函数吗?
【发布时间】:2010-02-19 03:09:06
【问题描述】:

我阅读了一篇非常有趣的文章,该文章是关于使用 wdk 编程驱动程序的,其中使用的一个函数称为 ObReferenceObjectByName。这个功能让我很头疼。第一个坏事是微软没有记录它。第二件事,文章中使用的语言是 C++,我想将我的代码保持在普通的 C 语言中。我知道大多数时候这不应该是一个问题,但我没有 - 因为我的生活 - 能够弄清楚如何包含此功能。

文章中的代码类似于:

extern "C"{

 #include <ntifs.h>


 NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName(PUNICODE_STRING ObjectName,

         ULONG Attributes,

         PACCESS_STATE AccessState,

         ACCESS_MASK DesiredAccess,

         POBJECT_TYPE ObjectType,

         KPROCESSOR_MODE AccessMode,

         PVOID ParseContext OPTIONAL,

         PVOID* Object);
}

我已经尝试复制这几个小时了。我尝试在没有'extern'关键字的情况下声明它,我尝试更改调用约定,我尝试更改包含...我总是以错误“未解析的外部符号...”结束。

我完全被难住了,所以如果有人能提供一些建议,我将不胜感激。谢谢。

【问题讨论】:

    标签: windows driver drivers wdk


    【解决方案1】:

    您不会阅读http://www.codeproject.com/KB/recipes/keystroke-hook.aspx 并尝试创建自己的键盘记录器吧?

    无论如何,不​​要使用它,而是调用 ZwCreateFile 然后 ObReferenceObjectByHandle。

    【讨论】:

    • 那是我读过的文章,但我的最终目标不是键盘记录器。我只是发现如何更改驱动程序中的 MajorFunction 很有趣。感谢您的建议。
    • 我怀疑这在 Vista/Win7 中不起作用,而且这样做肯定不安全,因为您无法正确保证在更改期间不会发送 IO,但出于信息目的,它是我猜是整洁的。
    • 只要您使用原子函数 (InterlockedExchangePointer) 是安全的。
    • 替换本身是安全的,但是如果你在你的钩子里做任何不平凡的事情,事情就会变得非常复杂,因为你不能保证你的 IRP_MJ_READ 的 Irp 被你的 IRP_MJ_CREATE 处理,因为会有成为一个小窗口,您不会在其中完成对调度表的覆盖。
    【解决方案2】:

    这是一个没有问题的编译和构建的测试 C 代码:

    #include <ntddk.h>
    
    NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName(
        PUNICODE_STRING ObjectName,
        ULONG Attributes,
        PACCESS_STATE AccessState,
        ACCESS_MASK DesiredAccess,
        POBJECT_TYPE ObjectType,
        KPROCESSOR_MODE AccessMode,
        PVOID ParseContext OPTIONAL,
        PVOID* Object
        );
    
    NTSTATUS DriverEntry(
        IN PDRIVER_OBJECT  DriverObject,
        IN PUNICODE_STRING RegistryPath
        )
    {
        ObReferenceObjectByName(0, 0, 0, 0, 0, 0, 0, 0);
    
        return STATUS_SUCCESS;
    }
    

    【讨论】:

      【解决方案3】:

      我不知道这个 API,但我可以给你一个技巧,可以帮助你诊断问题。

      在路径中有 MSVC 工具的命令提示符处

      link /dump /exports ???.dll
      

      ???.dll 是您期望此函数的 dll。这将为您提供导出符号名称的完整列表,并告诉您两件事。 1)那里有符号吗?和 2) 它的装饰是否与您尝试的原型相同。

      对于 32 位内核,您应该期望它被称为 _ObReferenceObjectByName@64

      【讨论】:

        猜你喜欢
        • 2011-03-04
        • 2012-06-19
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        相关资源
        最近更新 更多