Windows C++堆破坏场景及分析

原文连接: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值