1

我正在编写一个内存跟踪应用程序,它使用 IAT 修补机制挂钩对 HeapAlloc 的所有调用。这个想法是捕获对 HeapAlloc 的所有调用并获得一个调用堆栈。

但是,我目前面临使用 DBGHELP API 获取调用堆栈的问题。我发现 dbghelp dll 本身正在链接到 MSVCRT dll,并且这种依赖性会导致递归调用。当我尝试为来自目标应用程序的任何调用获取调用堆栈时,dbghelp 在内部调用来自 MSVCRT 的某些方法,该方法再次调用 HeapAlloc。由于我已经修补了 MSVCRT,它会导致无限循环。

有没有人遇到过这个问题并解决了?有没有办法摆脱这个僵局?

4

3 回答 3

3

这是函数拦截代码中的标准问题。我们在使用共享内存来存储日志级别信息的日志库中遇到了类似的问题,而共享内存库必须记录信息。

我相信我们修复它的方式可以应用于您的情况。

在您的拦截代码中,维护一个指示您是否处于拦截中间的静态标志。当您的拦截被调用并且未设置标志时,设置标志然后执行您当前执行的操作,包括调用 DbgHelp,然后清除标志。

如果在设置标志时调用了拦截,则仅调用后端 HeapAlloc 代码而不执行任何其他操作(包括调用 DbgHelp 导致无限递归)。

类似于(伪代码)的东西:

function MyHookCode:
    static flag inInterceptMode = false
    if inInterceptMode:
        call HeapAlloc
        return
    inInterceptMode = true
    call DbgHelp stuff
    call HeapAlloc
    inInterceptMode = false
    return

function main:
    hook HeapAlloc with MyHookCode
    : : :
    return
于 2009-05-11T05:32:40.220 回答
0

您可以使用Deviare API Hook并获得完整的堆栈跟踪,而无需使用存在大量问题的 API。

于 2010-11-15T20:02:46.897 回答
0

使用像GlowCode这样的真实内存跟踪产品怎么样?

于 2009-05-11T05:30:55.150 回答