解释App Verifier输出:堆损坏或错误解释堆栈地址作为堆地址?

时间:2011-02-17 23:13:28

标签: winapi mfc stack heap cstring

我们有一个测试用例,它会崩溃我们的基于MFC的大型应用程序,并出现堆损坏错误。

我使用App Verifier为有问题的DLL启用了页面堆(不幸的是,由于其他原因,打开整个进程的堆是不可行的。)验证者没有给我们提供任何更多的信息。有;它在原始崩溃的同一点触发。

现在我有两个相互竞争的理论。您认为哪种理论更可能是正确的,您接下来的步骤是什么?

  1. 这确实是堆腐败。验证者没有捕获原始损坏,因为它发生在另一个DLL中。我们应该尝试为更多的DLL激活验证程序,并确定哪些代码会损坏堆。
  2. 堆很好;问题是我们将堆栈地址视为堆地址。我们应该进一步研究这个callstack中的代码,找出出错的地方。
  3. 我倾向于#2因为free()的参数看起来像堆栈地址,但到目前为止还没有人提出过如何做到这一点的解释。

    这是一个调用堆栈的片段。 MyString是CString的简单包装器。 MyAppDll是设置为使用页面堆的DLL。

    msvcr90.dll!free(void * pBlock=0x000000000012d6e8)  Line 110
    mfc90u.dll!ATL::CStringT > >::~CStringT > >()  Line 1011 + 0x1e bytes
    MyStringDll.dll!MyString::~MyString()  Line 59
    MyAppDll.dll!doStuffWithLotsOfStringInlining(MyClass* input=0x000000000012d6d0)  Line 863 + 0x26 bytes

    以下是free()堆栈框架内的寄存器:

    RAX = 0000000000000000 RBX = 000000000012D6E8 RCX = 0000000000000000 
    RDX = 0000000000000000 RSI = 000000000012D6D0 RDI = 00000000253C1090 
    R8  = 0000000000000000 R9  = 0000000000000000 R10 = 0000000000000000 
    R11 = 0000000000000000 R12 = 000000000012D7D0 R13 = 000007FFFFC04CE0 
    R14 = 0000000025196600 R15 = 0000000000000000 RIP = 00000000725BC7BC 
    RSP = 000000000012D570 RBP = 000007FFF3670900 EFL = 00000000 
    

    这是app验证程序消息:

    VERIFIER STOP 0000000000000010: pid 0x1778: Corrupted start stamp for heap block. 
    
        00000000083B1000 : Heap handle used in the call.
        000000006DD394E8 : Heap block involved in the operation.
        54D32858A8747589 : Size of the heap block.
        000000005E33BA8D : Corrupted stamp value.
    

1 个答案:

答案 0 :(得分:1)

我认为你的字符串或其用户是/在字符串的缓冲区溢出/下溢,可能是在字符串指针旁边的一个字段,然后你试图释放它。

你的RSP是12D570,这是你试图释放的94个四分之一(英寸),所以在那之间,缓冲区发生了一些不好的事情。

验证您没有执行任何不安全的字符串操作,并且您正在阅读文档以将缓冲区/字符串传递到您正在使用的DLL中。

如果您想要更准确的答案,您可能需要在问题中添加更多代码。