12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 219|回复: 0

堆溢出分析一

[复制链接]

305

主题

305

帖子

620

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
620
发表于 2020-9-17 17:48:20 | 显示全部楼层 |阅读模式
堆溢出研究一
环境windows2000目录


  • 堆内存概念的认识
  • 堆内存与栈内存的对比堆内存中数据结构的认识
1. 堆内存概念的认识
在计算机科学中, 动态内存分配(Dynamic memory allocation)又称为堆内存分配,是指计算机程序在运行期中分配使用内存。它可以当成是一种分配有限内存资源所有权的方法。 动态分配的内存在被程序员明确开释或被垃圾回收之前不停有效。与静态内存分配的区别在于没有一个固定的生存期。这样被分配的对象称之为有一个“动态生存期”。 《维基百科》堆内存栈内存的对比

堆内存申请,开释,操作,特点:
1. 堆内存申请环境:堆内存需要程序员在程序中申请 ,动态分配,申请的大小有程序决定。
2. 堆内存申请方法:C语言中的malloc() 函数 , c++ 中的new()函数。堆内存进行申请时间可能会申请失败,申请成功与失败与计算机性能,当前运行环境等有关。   
3. 堆内存开释:申请过后的堆内存不能由系统自动进行开释,C语言中采用free()函数,c++中采用 delete()函数进行开释内存。
4. 堆内存操作:申请过后的内存,会返回指向堆内存的指针,后续对于内存的读写等操作需要通过此指针进行。
5. 堆内存特点:地址由低向高生长。  堆内存非线性,呈现无序状态。   
栈内存的申请,开释,操作,特点:
1. 栈内存的申请是在程序中定义好的,包罗栈的大小,包含的变量,(存储局部变量,数组,栈帧,函数返回地址等)  
2. 栈内存的开释是有程序自身决定的不消掉用函数,当程序退出时,栈内存会自动烧毁,维持栈平衡,否则就会发生内存访问错误。
3. 栈内存的操作,有两种 push pop 只有这两种操作。  
4. 栈内存的特点:由高地址向低地址生长,呈现线性规划。
堆内存中数据结构&&管理计谋堆内存中数据结构
简介:堆的数据结构主要分为堆块和堆表两类:

堆块:
出于对性能的考虑,、堆区的内存按照差别大小的块被构造起来,以字节为单元进行标识。
堆块的结构:堆块分为快首和块身。
块首的结构:块首包含当前堆块的主要信息例如:此堆块的大小,是否是空闲态照旧占用态等状态表信息。
对块首的识别:当一连进行内存申请的时间返回的指针地址是有差距的,两个一连的指针之间的差距就是第二个块身的块首。
块身的结构:块身就是本堆块存放数据的位置,即最终分配给用户的数据区。
块身位置  :块身位于块首的背面紧挨着。
对块身的操作:当申请堆区成功后返回的指针直接指向的块身的首地址,对堆区的操作也就是对堆区的操作
堆表  
    堆表的意义:堆表用来索引堆块。堆表中包含索引堆块的大小,位置,状态等信息。堆表的数据结构决定啦堆区的构造方式,是快速检索空闲块,包管堆分配效率的关键。堆表进行设计的时间会考虑二叉树平衡计谋,快速查找计谋等。现代的操作系统中堆表的数据结构还不止一种。

    2.在windows中,占用态的堆块索引使用自己的程序索引,堆表只索引所有空闲态的堆块。告急的堆表包含两类:空闲双向链表(简称空表),快速单向链表(块表)。下面逐一对其要点进行分析。
空表

1.堆区空闲堆块的块首都包含一对指针,这对指针用于将空闲的堆块构造成双向链表,按照大小的差别,统共分为128条。
2.堆区一开始的堆表区,中有一个128项的指针数组,叫空表数组索引,该数组的每一项都包含两个指针,用来标示一条空表。
3.空表的结构如下图所示:

上图重点知识:

  • freelist[0]被称为零号空表 并且是节点从第一个 1024bytes 渐渐增减1024的整数倍。第二个及以后的节点 >=1024 bytes 从第二个链表开始即:free list【1】 开始: free list【1】 此空闲链表中每个节点是八个字节。free list【2】 = 16bytes
            即:    节点的字节数  = 下表 * 8  
    3.此处服膺零号空闲链表。在堆分配的时间很告急。 4.空表的特点:可以发生堆块合并,分配的效率低
块表

1.快速单项链表。块表是windows加速堆块分配的一种链表
2.快表特点:永久处于占用态意味着不会发生合并,快表只包含四个节点。同样的快表也是包含128条,构造结构跟空表很雷同,块表总是被初始化为空。
3.结构如下图:
   
如上图所示:最多为四个节点,链表编号为(0 ~ 127)   
堆分配计谋

  • 堆块的分配
  • 堆块的开释堆块的合并
堆块的分配
堆块的分配包罗:空表的分配,快表的分配,零号空表的分配   


  • 快表的分配:包罗寻找到精确匹配大小的空闲块,将此空闲块标注为占用状态,从快表中卸下,返回指向堆块块身的指针供程序使用。
  • 零号空表的分配:零号空表中所有的空闲块是按照从小到大的顺序分列的,因此在分配的时间先从末了的堆块进行分配,看可否满足要求,如果能满足要求,则正向寻找最小能满足要求的堆块进行分配。空表分配:普通空表进行分配时间,寻找最优解决方案,若不满满足最优解决方案,则采用次优解决方案进行分配。空表分配中存在找零钱的征象,即:当无法找到最有解决方案,次优解决方案的时间,就会从大的尾块中进行割下一小快可以大概满足要求的堆块,末了进行尾块的块首的状态信息进行修改即可。
    4.堆块分配的特点:快表中只存在精确分配,不存在找零钱征象。空表中存在找零钱征象(不考虑堆缓存,碎片化等情况)
堆块的开释
堆表的开释包罗将讲占用态该为空闲态,开释的堆块链入相应的堆表,所有开释的都链入相应的表尾,分配的时间先从表尾进行分配。块表只包含四个节点;堆块的合并
经过反反复复的堆块的分配与开释,堆区会出新很多凌乱的碎片,这时间就需要用到堆块的合并,堆块的合并包罗几个动作:将堆块从空表中卸下,合并堆块,修改合并后的块首,链接入新的琏表。(合并的时间还有一种操作叫内存紧缩)。  合并的时间之会合并相邻的堆块。       根据申请的内存大小的差别,分配和开释算法分为三类

参考:《0day安全:软件漏洞分析技术》
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-5-19 21:00 , Processed in 0.217773 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表