Hooked VirtualAlloc在被系统DLL调用时返回nullptr

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hooked VirtualAlloc在被系统DLL调用时返回nullptr相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

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

以上是关于Hooked VirtualAlloc在被系统DLL调用时返回nullptr的主要内容,如果未能解决你的问题,请参考以下文章

使用 Frida 从 hooked 方法中读取 uchar 值

Windows API一日一练 77 VirtualAlloc函数

detours hooked CreateFile 函数触发堆栈溢出

VirtualAlloc

Windows XP - VirtualAlloc() 如何(memoryapi.h 在哪里???)

VirtualAlloc/VirtualFree 与堆函数 [关闭]