windbg桟内存破坏的检测过程

执行这个程序,选择1会输出”Full application Name:Memory Corruption Sample”.然后再输入2,输出”Memory Corruption completed”.再一次输入1之后,程序崩溃了。
windbg显示:访问地址非法。

用kb打印出当前的调用桟:

从调用桟看出CAppInfo::PrintAppInfo调用wprintf出现了问题。我们可以推定传递给wprintf的参数m_wszAppName或者m_wszVersion是无效的。
我们分析一下g_AppInfo这个对象的状态。

我们发现m_wszAppName和m_wszVersion指针指向的地址都是不可访问的。这很奇怪,第一次可以正常访问,而现在却不正常了。
我们再看看g_AppInfo指向的内存

看上去g_AppInfo的指针似乎被”Corrupt”字符串覆盖了。现在我们查看代码,果然如此。

下面是一些指导性的规则来分析被破坏的内存:

  1. 通过dc命令以双字的格式转储出内存,或者以da以单字的方式转储,看看是否有字符串转储出。
  2. 通过!address命令收集关于内存的信息。!address可以告诉你内存的类型,保护级别,状态和通途。
  3. 通过dds命令将内存转储成双字或者符号。这可以有助于将内存与特定的类型关联起来。
  4. 通过dpp命令对指针解引用,并且以双字形式转储出内存的内容。如果有任何一个双字匹配某个符号,那么这个符号也将被显示。如果指针指向的内存包含了一个虚函数表,那么这种技巧是非常有用的。
  5. 通过dpa命令和dpu命令将指针指向的内存分别显示成ascii和unicode格式。
  6. 如果内存中内容是一个很小的数值,比如4的倍数,那么它很可能是个句柄。你可以使用!handle来查看这个值的句柄信息。

对于桟内存破坏,最好的工具就是编译器,开启编译器的编译选项来从源头定位问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注