[Windows service crash分析]一次编码转换导致的堆破坏

问题:有时候发邮件的时候,会导致service crash

分析:
1.收集到dump,先看下栈。发现是在free一块内存的时候crash了,看参数似乎是地址01c9fa25。但是因为这里的参数是windbg从栈里取的,因为64位程序通常前4个参数都会传到寄存器里,所以这里的参数通常都是错的。

[Windows service crash分析]一次编码转换导致的堆破坏_第1张图片


2.想要查看实际的内容,可以通过阅读汇编代码,查看寄存器的内容。不过这种方法不推荐,这里我使用的windbg的插件cmkd来查看函数参数。通过windbg插件cmkd的命令查看调用栈:

[Windows service crash分析]一次编码转换导致的堆破坏_第2张图片


3.看到了需要需要free的地址是173c7e0,再看一下这个地址的信息。这个block的大小的0x410。所属堆段是0x1730000。在这里已经看到了一些error,
173cbe0似乎被破坏了。


4.再来看下这个堆段的状态:

>!heap -a 1730000

173cbe0是173c7e0的下一个堆块,这里通常第二列代表的是前一个堆块的大小,第三列代表的是本堆块的大小。这样就可以看出173c7d0显示自己的大小是410,但是173cbe0却显示它上一个堆块大小是139a0。所以很明显,这里173cbe0这个堆块的被上一个堆块覆盖了。


5.结合代码看一下:
但是通过分析代码发现在一处编码转换的地方可能导致dest的大小会大于src,但是dest和src申请的大小是一样的,这样就造成了堆溢出。

知道原因后,就可以对代码进行修改了。

你可能感兴趣的:(Crash分析,Windows,windbg,堆溢出)