美文网首页
堆的初步认知

堆的初步认知

作者: 苏州暮雨 | 来源:发表于2017-12-07 00:30 被阅读0次

堆的分配是在程序运行时完成的,分配速度较为缓慢,但是堆的可用空间非常的大。常见的堆空间操作有如:new,malloc(申请);free,delete(释放),底层函数RtlAllocateHeap(ntdll.dll中),更详细的函数信息查看MSDN。堆分配的空间较为碎片化,需要对堆块的管理:按照堆块的大小分类组织在一起,在堆区的起始位置建立堆表用于索引堆块;而每一个堆块头部也记录着本块大小、空闲与否等(8字节),空闲块区还有前向指针(flink),后向指针(binlk),一共16字节。

每一次堆分配或者堆释放时,都将从空堆表末尾进行操作。堆的操作存在修改链表链接和块首信息,构造伪造的节点就可以实现一次内存读写的操作。

堆溢出的时候,就是溢出修改堆的首部指针,当块卸下的时候,将实现向我们在blink处写的地址target写入原flink处的修改值payload(与此同时在blink处写的数据也将写到flink偏移4字节的位置去)。一般target选取为函数返回,异常发生或函数调用等。也可以用于目标地址变量值的修改,或填入nop之类修改函数流程。特别的使用方法就是修改PEB中线程同步的函数入口地址,进程退出时,exitprocess调用线程中的rtlentercriticalsection等函数来处理线程间实现临界段锁的数据清理。

调试堆与常态管理有不同:调试堆不使用块表只用空表分配;所有堆块添加16字节尾部用于防止程序溢出(不是堆溢出);块首标志位不同。如果堆初始化结束后再attach程序可以看见真实状态的堆。

在多线程的程序里,每个线程都有其自己独立的栈,它们都共享一个堆。栈是面向线程的而堆是面向进程的。

linux下的堆与windows平台下差别不大:

相关文章

  • 堆的初步认知

    堆的分配是在程序运行时完成的,分配速度较为缓慢,但是堆的可用空间非常的大。常见的堆空间操作有如:new,mallo...

  • 初步的解读—认知

    苹果的认知 知觉是大脑神经网络的某个区域,这个区域是静态的存在。比如苹果这个声音的知觉,无论是否听到苹果这个声音,...

  • 化妆的初步认知

    为什么看化妆博主化妆那么容易,那么好看,自己总是手残。 第一,博主已经非常熟练了,不然做不了博主,任何人都是把自己...

  • Java初步认知

    Mac环境进行开发分为两个部分: 一个是JDK的安装。(Java语言环境) 运行工具。推荐可用IDEA(项目开发工...

  • JVM 堆内存初步认识

    堆内存,是JVM运行时一块最大的内存,几乎所有的对象都分配在堆内存中。为什么说是几乎,因为有的对象会分配到栈上,例...

  • 对营销的初步认知

    经过最近的学习,接触到了一些营销的基本法则,和思路。我觉得将我能理解的东西总结为一句话就是:“思路决...

  • 对学习的初步认知

    人类的学习行为是人类进化的内在动力,那什么是学习,为什么同样都是“人模人样”,有些人乐于学习,善于学习,学习能力超...

  • 对“社群”的初步认知

    说到群,我们一点也不陌生,一打开手机的微信、QQ各种群消息就会一涌上来,那么在这些群里面,哪些是社群呢? 对于一个...

  • 迁移学习的初步认知

    所谓迁移学习,就是将一个问题上训练好的模型,通过简单的调整,使其适用于一个新的问题的过程。 一、迁移学习的特点 1...

  • 关于运营的初步认知

    运营是做什么的 运营是产品与用户之间的维系。 在产品初期建立并留存种子用户,运用一切手段发展用户群体并且维护用户与...

网友评论

      本文标题:堆的初步认知

      本文链接:https://www.haomeiwen.com/subject/rtglixtx.html