原文连接:https://blog.csdn.net/CJF_iceKing/article/details/119488750
堆破坏
在<<谈一谈Windows中的堆>>中比较详细地讲解了堆的结构,这里我们简单说一说堆中对象存储的基本结构。
堆的结构主要分为三层层:
一个堆由若干个Segment组成,每个Segment是连续的空间
一个Segment一般由若干个连续的Entry构成。
我们每次使用malloc/new申请的内存就占用一个Entry,一个Entry中只有User Data部分是malloc/new返回给应用程序的使用的地址,其他的部分为当前Entry的元数据,用于堆管理,在调试模式下还有一些用于调试的信息。
下图展示的了堆是如何破坏的,假设有两处应用程序申请的内存,分别为Entry1和Entry2管理, 并且是连续的内存。那么这个时候拷贝信息到Entry1的User Data, 然而没有控制好拷贝的长度,覆盖了Entry2的Meta和部分User Data。
这里我们问一个问题, 当出现上述堆破坏的时候,堆会直接报错吗? 并不会,因为此时执行的是内存拷贝操作,并不会做堆的任何检查操作。而是下次在堆上分配或者释放内存的时候,和这个Entry相关联的操作检查到堆破坏,从而导致程序崩溃。
其实程序崩溃有时候反而是好事,如果在堆被破坏发生时,其他对象的数据被修改,并且不立即导致程序崩溃,而继续运行进入了错误逻辑,可能会导致严重的后果。
那么我们要去检测堆破坏,能够抓取到破坏时候的函数调用栈吗?可以的,但是在讲解这种方法之前,先讲解下: 如果非第一现场检测到堆破坏,如何进行分析。
————————————————
版权声明:本文为CSDN博主「一个程序员的修炼之路」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CJF_iceKing/article/details/119488750