我正在编写一个内存跟踪应用程序,它使用IAT修补机制挂钩所有对HeapAlloc的调用。这个想法是捕获所有对HeapAlloc的调用并获得一个callstack。
但是我目前正面临使用DBGHELP Apis获取callstack的问题。我发现dbghelp dll本身链接到MSVCRT dll,这种依赖性会导致递归调用。当我尝试从目标应用程序获取任何调用的callstack时,dbghelp在内部从MSVCRT调用一些再次调用HeapAlloc的方法。由于我已经修补了MSVCRT,因此导致无限循环。
有人遇到过这个问题并解决了吗?有没有办法摆脱这种僵局?
答案 0 :(得分: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
答案 1 :(得分:0)
如何使用GlowCode等真实的内存跟踪产品?
答案 2 :(得分:0)
您可以使用Deviare API Hook并获得完整的堆栈跟踪,而无需使用存在大量问题的API。