【问题标题】:Hooked VirtualAlloc returns nullptr when called by system DLLs被系统 DLL 调用时,Hooked VirtualAlloc 返回 nullptr
【发布时间】:2018-05-30 08:41:15
【问题描述】:

我想跟踪VirtualAlloc 完成的内存分配。为此,我尝试使用mhookeasyhook。只要我自己打电话给VirtualAlloc,两者都可以正常工作。注册的钩子被调用,从那里我调用真正的VirtualAlloc函数,内存按预期返回。

我现在的问题是我尝试打开一个SFML-window 并捕获其中的VirtualAlloc 调用,但没有返回内存。函数调用通过 sfml-window-2.dll 并从那里调用 wglCreateContext,后者调用 CreateAnyContext,后者调用 VirtualAllocwglCreateContext 在 Opengl32.dll 中。我猜我的用户空间代码没有权限为其分配内存。我的问题是,如果不允许我为系统库分配内存,为什么系统库会通过同一个存根(我挂钩)?我如何区分这些调用并防止这种情况发生?

我的意思是,在我的特殊情况下,我可以等到窗口打开并在此之后挂钩 VirtualAlloc。但这将是一个非常糟糕的解决方案,因为我想跟踪任意程序甚至可能注入我的 dll 来跟踪内存。

编辑: 我不仅想跟踪程序内存,而且还希望能够将其重置为记录状态,同时程序执行不应减慢太多,因为在我的情况下它将是游戏。因此,我想从 VirtualAlloc 开始并设置 MEM_WRITE_WATCH 标志并手动跟踪 GetWriteWatch 返回的页面。我已经写了一个可以通过这种方式重置的向量,但我需要它更通用。 /编辑

要注意的另一件事是,我已经使用HeapAlloc 进行了尝试,它也在所述函数中调用,但它返回内存。这就是我尝试两个库的原因。 任何帮助表示赞赏。

【问题讨论】:

  • 您是否在 UI 中显示? wglCreateContext 用于与图形设备驱动程序交互的 OpenGL init。可能是图形设备驱动程序还挂钩 VirtualAlloc 以将附加值传递给它?我注意到返回的内存需要 200MB 缓冲区,因为页面错误超过 1 秒我不知道,这是一个惊人的 CPU 时间量。这是几年前我确实测量过的。
  • 反正不用hook VirtualAlloc。下载 Windows 性能工具包 wpr -start VirtualAlloc,执行用例 wpr -stop c:\temp\VirtualAllocTracing.etl 并使用 WPA(最好的 ETW 查看器)查看数据以发现几乎所有泄漏:aloiskraus.wordpress.com/2017/12/13/…跨度>
  • @AloisKraus 感谢您的阅读。是的,我打开一个 OpenGL 窗口。该函数似乎没有被挂钩,我跟随我自己的 VirtualAlloc 调用到与从 wglCreateContext 调用的地址相同的地址。但考虑到这一点,我会再次跟踪它。我在帖子中更新了我的用例。

标签: c++ c windows memory dll


【解决方案1】:

事实证明,我不允许更改标志。我的解决方法是,因为我无法以合理的方式知道调用者是谁,所以我用改变的标志分配它,如果失败,我用原始标志再次分配它。

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 2014-12-10
    • 1970-01-01
    • 2012-01-24
    • 2012-02-11
    • 2016-05-23
    • 2012-10-07
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多