CN106201851A - 堆内存操作的检测方法及装置 - Google Patents
堆内存操作的检测方法及装置 Download PDFInfo
- Publication number
- CN106201851A CN106201851A CN201510212937.XA CN201510212937A CN106201851A CN 106201851 A CN106201851 A CN 106201851A CN 201510212937 A CN201510212937 A CN 201510212937A CN 106201851 A CN106201851 A CN 106201851A
- Authority
- CN
- China
- Prior art keywords
- memory block
- memory
- heap
- action type
- address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本发明提供了一种堆内存操作的检测方法及装置。通过本发明堆内存操作的检测方法:确定对堆内存进行操作的操作类型;获取用于表述所述堆内存的内存结构信息;依据所述操作类型,以及所述内存结构信息对所述操作进行检测,解决了现有的堆内存非法操作检测工具检测效率低的问题,进而达到了提高堆内存非法操作检测效率的效果。
Description
技术领域
本发明涉及计算机领域,具体而言,涉及一种堆内存操作的检测方法及装置。
背景技术
在应用软件运行的过程中,会存在对应用软件的堆内存进行非法操作,该非法操作一般为如下几种:堆内存块越界读写、读写未分配的堆内存、读写已经释放的堆内存、重复释放堆内存、释放错误的堆内存地址等。上述非法操作一直都是软件开发过程中最易发、危害最大又最难解决的问题之一,目前解决上述非法操作的方法是采用C/C++堆内存非法访问动态检测工具。
这里需要说明的是,目前普遍存在的C/C++堆内存非法访问动态检测工具存在三个缺陷:第一、能检测的非法操作类型少;第二、检测工具本身额外内存开销大,导致在许多软件特别是嵌入式软件上无法正常运行;第三、检测工具检测效率低下,在性能要求较高特别是并发较激烈的软件中无法正常运行。
发明内容
本发明提供了一种堆内存操作的检测方法及装置,以至少解决相关技术中现有的堆内存非法操作检测工具检测效率低的问题。
根据本发明的一个方面,提供了一种堆内存操作的检测方法,包括:确定对堆内存进行操作的操作类型;获取用于表述堆内存的内存结构信息;依据操作类型,以及内存结构信息对操作进行检测。
在本发明实施例中,在内存结构信息包括堆内存所包括的内存块的状态信息的情况下,依据操作类型,以及内存结构信息对操作进行检测包括:确定操作在堆内存所对应的内存块;依据内存块的状态信息确定内存块的状态;依据操作类型,以及确定的内存块的状态,判定操作的合法性。
在本发明实施例中,依据操作类型,以及确定的内存块的状态,判定操作的合法性包括以下至少之一:在操作类型为对内存块进行访问,且内存块的状态为已释放的情况下,判定操作为访问已释放内存块的非法操作;在操作类型为对内存块进行读操作,且内存块的初始化状态为未初始化的情况下,判定操作为读未初始化内存块的非法操作;在操作类型为对内存块进行释放,且内存块的状态为已释放的情况下,判定操作为重复释放内存块的非法操作。
在本发明实施例中,在内存结构信息包括堆内存所包括的内存块的属性信息的情况下,依据操作类型,以及内存结构信息对操作进行检测的步骤包括:确定操作在堆内存块中的操作范围;依据操作范围,以及内存块的属性信息判定操作的合法性,其中,内存块的属性信息包括:操作在堆内存中对应的内存块的起始地址以及内存块的使用长度。
在本发明实施例中,依据操作范围,以及内存块的属性信息判定操作的合法性的步骤包括:判断操作范围是否在内存块的起始地址和内存块的使用长度确定的范围内;在判断结果为否的情况下,确定操作为越界非法操作。
在本发明实施例中,在内存结构信息包括堆内存所包括的内存块的属性信息的情况下,依据操作类型,以及内存结构信息对操作进行检测的步骤包括:在操作为释放操作的情况下,确定操作的释放地址;在内存结构信息中获取不到释放地址对应的属性信息的情况下,判定操作为释放非内存地址的非法操作。
根据本发明的另一方面,提供了一种堆内存操作的检测装置,包括:确定模块,用于确定对堆内存进行操作的操作类型;获取模块,用于获取用于表述堆内存的内存结构信息;检测模块,用于依据操作类型,以及内存结构信息对操作进行检测。
在本发明实施例中,检测模块还包括,第一确定单元,用于确定操作在堆内存所对应的内存块;第二确定单元,用于依据内存块的状态信息确定内存块的状态;第一判断单元,用于依据操作类型,以及确定的内存块的状态,判定操作的合法性。
在本发明实施例中,第一判断单元包括至少如下子单元之一:第一判断子单元,用于在操作类型为对内存块进行访问,且内存块的状态为已释放的情况下,判定操作为访问已释放内存块的非法操作;第二判断子单元,用于在操作类型为对内存块进行读操作,且内存块的初始化状态为未初始化的情况下,判定操作为读未初始化内存块的非法操作;第三判断子单元,用于在操作类型为对内存块进行释放,且内存块的状态为已释放的情况下,判定操作为重复释放内存块的非法操作。
在本发明实施例中,第三确定单元,用于确定操作在堆内存块中的操作范围;第二判断单元,用于依据操作范围,以及内存块的属性信息判定操作的合法性,其中,内存块的属性信息包括:操作在堆内存中对应的内存块的起始地址以及内存块的使用长度。
在本发明实施例中,第二判断单元包括:第四判断子单元,用于判断操作范围是否在内存块的起始地址和内存块的使用长度确定的范围内;第一确定子单元,用于在判断结果为否的情况下,确定操作为越界非法操作。
在本发明实施例中,检测模块还包括:第二确定子单元,用于在操作为释放操作的情况下,确定操作的释放地址;第五判断子单元,用于在内存结构信息中获取不到释放地址对应的属性信息的情况下,判定操作为释放非堆内存地址的非法操作。
通过本发明,采用确定对堆内存进行操作的操作类型;获取用于表述堆内存的内存结构信息;依据操作类型,以及内存结构信息对操作进行检测,解决了相关技术中现有的堆内存非法操作检测工具检测效率低的问题,进而达到了提高检测堆内存操作的效率的效果。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的堆内存操作的检测方法的流程图;
图2是根据本发明实施例的堆内存操作的检测方法中的内存域的示意图;
图3是根据本发明实施例的可选地堆内存操作的检测方法的流程图;
图4是根据本发明实施例的可选地堆内存操作的检测方法的流程图;以及
图5是根据本发明实施例的堆内存操作的检测装置的结构框图。
具体实施方式
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
在本实施例中提供了一种堆内存操作的检测方法,图1是根据本发明实施例的堆内存操作的检测方法的流程图,如图1所示,该流程包括如下步骤:
步骤S102,确定对堆内存进行操作的操作类型。
具体的,上述操作类型可以为访问操作,也可以为释放操作。
这里需要说明的是,上述堆内存可以为一个堆内存区域,在上述堆内存区域中可以划分多个长度相同的内存块,对堆内存的操作即为对上述堆内存区域的操作,也即对内存块的操作。
步骤S104,获取用于表述堆内存的内存结构信息。
具体的,可以通过编译插桩机制提供的堆内存的地址获取到用于表述堆内存的内存结构信息,上述内存结构信息可以分为两部分,第一部分信息可以为内存块的状态信息,比如空闲状态、被使用状态、释放状态等。第二部分信息可以为内存块的属性信息,比如内存块的使用长度,内存块的起始地址等。
步骤S106,依据操作类型,以及内存结构信息对操作进行检测。
具体的,在本方案中,可以根据针对操作类型结合与该堆内存对应的结构信息来对上述操作进行检测,即确定上述针对堆内存的操作是合法或违法。
上述步骤中,通过先获取堆内存的内存结构信息,然后结合针对堆内存操作的操作类型和上述堆内存的内存结构信息检测上述操作的合法性,与相关检测工具相比,极大的降低检测过程中对内存的消耗,并且在并发运行激烈的软件中也可以高效率的实现对堆内存操作的检测,从而解决了现有的堆内存非法操作检测工具检测效率低的问题。
可选地,上述堆内存可以包括至少一个内存块,上述内存结构信息可以为内存块的状态信息,上述步骤S106,依据操作类型,以及内存结构信息对操作进行检测的步骤可以包括:
步骤S1061,确定操作在堆内存所对应的内存块。
步骤S1062,依据内存块的状态信息确定内存块的状态。
步骤S1063,依据操作类型,以及确定的内存块的状态,判定操作的合法性。
具体的,可以通过堆内存地址来获取堆内存地址所对应的内存块,即操作对象,在上述内存块的尾部可以保存有内存块的状态信息,再结合上述操作类型和上述内存块的状态判定操作是否合法。
可选地,上述堆内存可以为一个内存域,该内存域可以包括多个内存块,内存块的状态可以记录在内存块的关键信息中。
在一种可选的实施例中,以上述堆内存可以由包含多个内存块的内存域组成为例,提供一种根据堆内存地址来获取内存块的关键信息的方法:
可以首先先获取堆内存地址Ptr,再根据堆内存地址Ptr通过预先定义好的映射关系去获取上述堆内存地址Ptr所对应的内存区域管理结构,在该内存区域管理结构中则记录着内存区域的起始地址P0和内存块长度Sb,然后根据堆内存地址Ptr、内存区域的起始地址P0和内存块长度Sb得到上述关键信息:根据公式计算出Ptr对应的内存块的起始地址Pb,通过内存块的起始地址Pb加上Sb再减去内存块关键信息的大小Si,即可获得该内存块关键信息的起始地址。这里需要说明的是,在上述内存块的关键信息可以记录着上述内存块状态,比如空闲状态FREED,已使用状态USED,已初始化或未初始化。
在一种可选的实施例中,本方案提供了一种建立上述映射关系方法,提供了一种建立堆内存地址和内存域管理结构的映射关系的方法。本方法是利用现有的基数树(RadixTree)机制,建立一套任意地址与内存域管理结构映射关系的数据结构。即将任一内存地址与(&)域页的结果作为基数树索引,并在索引对应的元素位置保存对应的内存域管理结构的指针;如果该内存地址不是堆内存则索引对应的元素保存0值。建立的步骤如下:初始化基数树,将所有元素保存内容置为0;在内存分配器新建立内存域时,向基数树注册新建内存域所有域页对应的内存域管理结构。即将所有域页作为索引找到的元素的保存内容修改为新建内存域管理结构指针;在内存分配器销毁内存域时,向基数树注销新建内存域所有域页对应的内存域管理结构。即将所有域页作为索引找到的元素的保存内容修改为0。
可选地,步骤S1063,依据操作类型,以及确定的内存块的状态,判定操作的合法性的步骤可以分为如下至少一个方案:
方案一:
在操作类型为对内存块进行访问,且内存块的状态为已释放的情况下,判定操作为访问已释放内存块的非法操作。
具体的,在上述内存块的尾部可以保存有内存块的当前状态信息,在内存的当前状态为FREED(空闲状态)的时候,如果此时对上述内存块进行访问,则判定本次操作为访问已释放内存块的非法访问。
方案二:
在操作类型为对内存块进行读操作,且内存块的初始化状态为未初始化的情况下,判定操作为读未初始化内存块的非法操作。
具体的,在上述内存块的尾部可以保存有内存块的当前状态信息,该当前状态信息可以为内存块的当前初始化状态,在内存块当前的初始化状态为未初始化(此时内存块的初始化标志为1)的情况下,则判定本次读操作为读未初始化内存块的非法操作。
方案三:
在操作类型为对内存块进行释放,且内存块的状态为释放状态的情况下,判定操作为重复释放内存块的非法操作。
具体的,可以根据释放地址Pf通过上述预先定义好的映射关系去获取该释放地址对应内存块的状态,在内存块的当前状态为FREED(空闲状态)的时候,则说明内存块以被释放过,如果此时对上述内存块进行释放,则判定本次操作为释放已经释放的内存块的非法操作。
可选地,在上述内存结构信息中也可以包括堆内存所包括的内存块的属性信息,其中,上述步骤S106,依据操作类型,以及内存结构信息对操作进行检测的步骤可以包括:
步骤S1064,确定操作在堆内存块中的操作范围。
步骤S1066,依据操作范围,以及内存块的属性信息判定操作的合法性,其中,内存块的属性信息包括:操作在堆内存中对应的内存块的起始地址以及内存块的使用长度。
具体的,可以通过堆内存的地址来获取内存块的属性信息,再通过操作范围、内存块的属性信息来对操作的合法性进行检测。
仍旧以上述堆内存可以由包含多个内存块的内存域组成为例,提供一种依据操作范围,以及内存块的起始地址和内存块的使用长度,判定操作的合法性的可选方案:
首先获取编译插桩机制提供的操作的访问范围以及本次内存访问的起始地址Ptr,利用上述获取内存块的关键信息的方案获取到Ptr对应的内存块起始地址Pb和内存块关键信息,在上述内存块关键信息中还可以记录着内存块的使用长度USER_SIZE,则可以根据内存块起始地址Pb、内存块的使用长度USER_SIZE、本次访问的访问范围来判定本次操作的合法性。
可选地,步骤S1066,依据操作范围,以及内存块的起始地址和内存块的使用长度,判定操作的合法性的步骤可以包括:
步骤S10661,判断操作范围是否在内存块的起始地址和内存块的使用长度确定的范围内。
步骤S10662,在判断结果为否的情况下,确定操作为越界非法操作。
具体的,可以读出内存块的使用长度USER_SIZE,如果本次内存访问范围不完全在Pb到Pb+USER_SIZE-1以内则判定本次内存操作是越界类型的非法访问。
可选地,步骤S106,依据操作类型,以及内存结构信息对操作进行检测的步骤还可以包括:
步骤S1067,在操作为释放操作的情况下,确定操作的释放地址。
步骤S1068,在内存结构信息中获取不到释放地址对应的属性信息的情况下,判定操作为释放非堆内存地址的非法操作。
具体的,如果根据释放地址Pf根据上述映射关系获取不到该释放地址对应的属性信息的情况下,则说明该释放地址Pf为不是堆内存的地址,本次操作具体为释放非堆内存的非法操作。
可选地,如果根据上述释放地址Pf获取到了属性信息,但是该内存结构信息中的内存块的属性信息中的内存块的起始地址Pb不等于Pf的情况下,说明该释放地址为一个错误地址,本次操作为释放错误堆内存地址的非法释放操作。
可选地,堆内存操作的检测方法可以分为堆内存的非法访问检测和非法释放检测,下面结合图3和图4对上述两种检测方法进行描述:
非法访问检测:
步骤S21:被检测程序运行。
步骤S22:被检测程序访问内存,触发堆内存非法访问检查。
步骤S23:利用堆内存地址和内存域管理结构的映射关系,判断本次访问内存是否是堆内存。如果不是则跳转到步骤S31,如果是则执行步骤S24。
步骤S24:检查是否访问未分配的内存区域,即利用访问未分配的内存区域的检测方法进行检查,读出内存域状态,如果为未初始化状态则判定本次内存操作是访问未分配的内存区域的非法访问,跳转到步骤S30。如果为已初始化状态则继续下一步。
步骤S25:利用根据任一堆内存地址找到其所属的内存块起始地址和内存块关键信息的方法,获取内存块起始地址Pb和记录在内存块尾部的关键信息。
步骤S26:检查是否是访问已释放的内存块,利用访问已释放内存块的检测方法检查。即从内存块关键信息读出内存块状态,如果状态为FREED则判定本次访问是访问已释放内存块,跳转到步骤S30。否则继续下一步。
步骤S27:检查是否为越界访问,利用越界访问的检测方法检查。即读出内存块关键信息中的USER_SIZE,如果本次内存访问范围不完全在Pb到Pb+USER_SIZE-1以内则判定本次访问是越界访问,跳转到步骤S30。否则继续下一步。
步骤S28:检查是否是读未初始化内存块操作,利用读未初始化内存块的检测方法检查。即从内存块关键信息中读出内存块未初始化标志,如果标志为1且本次为读访问则判定本次访问是读未初始化内存块,跳转到步骤S30。否则如果本次是写访问则将内存块未初始化标志置为0,并继续下一步。
步骤S29:判定本次访问合法,跳转到步骤S31。
步骤S30:输出检测信息。
步骤S31:堆内存非法访问检测结束,被检测程序继续运行。
非法释放检测:
步骤S10,被检测程序运行。
步骤S20,被检测程序释放内存,触发堆内存非法释放检测。
步骤S301,检查是否为释放非内存。即根据释放时传入的地址Pf,利用堆内存地址和内存域管理结构的映射关系,查找Pf对应的内存域。如果找不到对应的内存域则判定为释放非堆内存,跳转到步骤S80;否则执行步骤S40。
步骤S40,利用根据任一堆内存地址找到其所属的内存块起始地址和内存块关键信息的方法,获取内存块起始地址Pb和记录在内存块尾部的关键信息;
步骤S50,检查是否是释放已释放的内存块。即从内存块关键信息读出内存块状态,如果状态为FREED则判定为重复释放内存,跳转到步骤S80。否则执行步骤S60。
步骤S60,检查是否是释放错误堆内存地址,即如果Pf不等于Pb则判定为释放错误堆内存地址,跳转到步骤S80;否则继续下一步。
步骤S70,判定本次释放合法,释放内存,跳转到步骤S90。
步骤S80,输出检测信息。
步骤S90,堆内存非法释放检测结束,被检测程序继续运行。
下面结合具体的实施例对堆内存操作的检测方法进行进一步的说明:
首先,本发明方法可以基于特定算法的堆内存分配器来实现。这种特定算法的堆内存分配器具有如下特性:特性一,堆内存分配器基于一块虚拟地址连续的大内存区域(简称内存域)来管理内存,即以内存域为单位向系统申请和释放内存;特性二,所有的内存域始终按照特定的长度对齐(特定的长度本文称之为域页);特性三,提供用户使用的内存块从内存域中切割,一个内存域可以切割若干内存块但一个内存域切割的所有内存块长度相同;特性四,内存域所有内存完全、完整切分为内存块,没有剩余内存作它用;特性五,每一个内存域存在一个对应的内存域管理结构记录该内存域起始地址、切割的内存块长度和初始化状态(未初始化表示不可提供给用户使用)等信息。内存区域的结构如图2所示。
然后,本实施例可以提供一种记录内存块关键信息的方法:可以利用现有的堆内存分配接口接管方法,接管C库提供的堆内存分配/释放接口,并在分配的内存块尾部插入内存块关键信息。其中,该内存块关键信息可以包括:内存块状态,即FREED和USED。FREED表示本内存块处于空闲状态;USED表示本内存块已分配给用户使用。内存块关键信息还额可以包括:用户希望申请的内存块大小(USER_SIZE),可选地,内存块关键信息还可以包括:未初始化标志,即本内存块未初始化则标志为1,初始化后标志置为0。
接着,本实施例还可以提供一种建立堆内存地址和内存域管理结构的映射关系的方法。该方法是利用现有的基数树(Radix Tree)机制,建立一套任意地址与内存域管理结构映射关系的数据结构。即将任一内存地址与(&)域页的结果作为基数树索引,并在索引对应的元素位置保存对应的内存域管理结构的指针;如果该内存地址不是堆内存则索引对应的元素保存0值。本方法具体步骤如下:初始化基数树,将所有元素保存内容置为0;在内存分配器新建立内存域时,向基数树注册新建内存域所有域页对应的内存域管理结构。即将所有域页作为索引找到的元素的保存内容修改为新建内存域管理结构指针;在内存分配器销毁内存域时,向基数树注销新建内存域所有域页对应的内存域管理结构。即将所有域页作为索引找到的元素的保存内容修改为0。
接着,本实施例还可以提供一种根据堆内存地址Ptr找到其所属的内存块起始地址和内存块关键信息的方法。本方法具体步骤如下:根据堆内存地址和内存域管理结构的映射关系,找出堆内存地址对应的内存域管理结构,读出内存域的起始地址P0和内存块长度Sb;根据公式计算出Ptr对应的内存块的起始地址Pb;Pb加上Sb再减去内存块关键信息的大小Si,即可获得该内存块关键信息的起始地址。
基于上述记录内存块关键信息的方法、建立堆内存地址和内存域管理结构的映射关系的方法、根据堆内存地址Ptr找到其所属的内存块起始地址和内存块关键信息的方法,本实施例可以提供堆内存非法访问的检测方法。需要说明的是,堆内存非法访问的检测点是利用编译器编译插桩机制实现的,即在被检测软件进行内存访问时进行。编译插桩机制提供本次内存访问的起始地址和访问范围。上述堆内存非法访问的检测方法包括:访问未分配的内存区域的检测方法。根据编译插桩机制提供本次内存访问的起始地址Ptr,利用堆内存地址和内存域管理结构的映射关系,找出Ptr对应的内存域,如果内存域的状态为未初始化,则判定本次内存操作是访问未分配的内存区域的非法访问。
可选地,堆内存非法访问的检测方法还可以包括:访问已释放内存块的检测方法。根据编译插桩机制提供本次内存访问的起始地址Ptr,利用任一堆内存地址找到其所属的内存块起始地址和内存块关键信息的方法,获取内存块关键信息。读出内存块关键信息中的内存块状态,如果内存块状态为FREED则判定本次内存操作是访问已释放内存块的非法访问。
可选地,堆内存非法访问的检测方法还包括:越界访问的检测方法。根据编译插桩机制提供本次内存访问的起始地址Ptr,利用任一堆内存地址找到其所属的内存块起始地址和内存块关键信息的方法,获取Ptr对应的内存块起始地址Pb和内存块关键信息。读出内存块关键信息中的USER_SIZE,如果本次内存访问范围不完全在Pb到Pb+USER_SIZE-1以内则判定本次内存操作是越界类型的非法访问。
可选地,堆内存非法访问的检测方法还包括:读未初始化内存块的检测方法。该方法具体步骤如下:内存块分配时利用记录内存块关键信息的方法将关键信息中的未初始化标志置为1;内存访问时,根据编译插桩机制提供本次内存访问的起始地址Ptr,利用任一堆内存地址找到其所属的内存块起始地址和内存块关键信息的方法,获取内存块关键信息,读出内存块未初始化标志。如果本次访问是写访问则将未初始化标志置为0;如果本次是读访问,则判断内存块未初始化标志是否为1,如果为1则判定本次操作是读未初始化内存块的非法操作。
可选地,本实施例还可以提供内存非法释放的检测方法。
内存非法释放的检测方法包括:释放非堆内存的检测方法。根据释放时传入的地址Pf,利用堆内存地址和内存域管理结构的映射关系,查找Pf对应的内存域。如果找不到对应的内存域则表明Pf并不是堆内存地址,即可判定本次内存操作是释放非堆内存的非法释放。
可选地,内存非法释放的检测方法还包括:重复释放内存块的检测方法。根据释放时传入的地址Pf,利用任一堆内存地址找到其所属的内存块起始地址和内存块关键信息的方法,获取内存块关键信息。读出内存块关键信息中的内存块状态,如果内存块状态为FREED则判定本次内存操作是重复释放内存块的非法释放。
可选地,内存非法释放的检测方法还包括:释放错误堆内存地址的检测方法。根据释放时传入的地址Pf,利用任一堆内存地址找到其所属的内存块起始地址和内存块关键信息的方法,获取内存块起始地址Pb。如果Pf不等于Pb则判定本次内存操作是释放错误堆内存地址的非法释放。
综上,针对现有检测工具检测类型较少、内存消耗大、检测效率低下的缺陷,本申请的方案可以实现效果如下:能实现检查各种堆内存违法的、内存消耗更低和更加快速的堆内存非法操作检测方法。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例的方法。
在本实施例中还提供了一种堆内存操作的检测装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图5是根据本发明实施例的堆内存操作的检测装置的结构框图,如图5所示,该装置包括:确定模块50,用于确定对堆内存进行操作的操作类型;获取模块52,用于获取用于表述所述堆内存的内存结构信息;检测模块54,用于依据所述操作类型,以及所述内存结构信息对所述操作进行检测。
可选地,检测模块54可以包括:第一确定单元,用于确定所述操作在所述堆内存所对应的内存块;第二确定单元,用于依据所述内存块的状态信息确定所述内存块的状态;第一判断单元,用于依据所述操作类型,以及确定的所述内存块的状态,判定所述操作的合法性。
可选地,上述第一判断单元可以包括至少如下子单元之一:第一判断子单元,用于在所述操作类型为对所述内存块进行访问,且所述内存块的状态为已释放的情况下,判定所述操作为访问已释放内存块的非法操作;第二判断子单元,用于在所述操作类型为对所述内存块进行读操作,且所述内存块的初始化状态为未初始化的情况下,判定所述操作为读未初始化内存块的非法操作;第三判断子单元,用于在所述操作类型为对所述内存块进行释放,且所述内存块的状态为释放状态的情况下,判定所述操作为重复释放内存块的非法操作。
可选地,上述检测模块54还可以包括:第三确定单元,用于确定操作在堆内存块中的操作范围;第二判断单元,用于依据操作范围,以及内存块的属性信息判定操作的合法性,其中,内存块的属性信息包括:操作在堆内存中对应的内存块的起始地址以及内存块的使用长度。
可选地,上述第二判断单元可以包括:第四判断子单元,用于判断所述操作范围是否在所述内存块的起始地址和所述内存块的使用长度确定的范围内;第一确定子单元,用于在判断结果为否的情况下,确定所述操作为越界非法操作。
可选地,检测模块54还可以包括:第二确定子单元,用于在所述操作为释放操作的情况下,确定所述操作的释放地址,第五判断子单元,用于在所述内存结构信息中获取不到所述释放地址对应的信息的情况下,判定所述操作为释放错误释堆非内存地址的非法操作。
本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的程序代码:
S1,确定对堆内存进行操作的操作类型。
S2,获取用于表述所述堆内存的内存结构信息。
S3,依据所述操作类型,以及所述内存结构信息对所述操作进行检测。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,确定所述操作在所述堆内存所对应的内存块;
S2,依据所述内存块的状态信息确定所述内存块的状态;
S3,依据所述操作类型,以及确定的所述内存块的状态,判定所述操作的合法性。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,在所述操作类型为对所述内存块进行访问,且所述内存块的状态为已释放的情况下,判定所述操作为访问已释放内存块的非法操作;
S2,在所述操作类型为对所述内存块进行读操作,且所述内存块的初始化状态为未初始化的情况下,判定所述操作为读未初始化内存块的非法操作;
S3,在所述操作类型为对所述内存块进行释放,且所述内存块的状态为已释放的情况下,判定所述操作为重复释放内存块的非法操作。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,确定所述操作在所述堆内存块中的操作范围;
S2,依据所述操作范围,以及所述内存块的属性信息判定所述操作的合法性,其中,所述内存块的属性信息包括:所述操作在所述堆内存中对应的内存块的起始地址以及所述内存块的使用长度。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,判断所述操作范围是否在所述内存块的起始地址和所述内存块的使用长度确定的范围内;
S2,在判断结果为否的情况下,确定所述操作为越界非法操作。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,在所述操作为释放操作的情况下,确定所述操作的释放地址;
S2,在所述内存结构信息中获取不到所述释放地址对应的所述属性信息的情况下,判定所述操作为释放非内存地址的非法操作。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行:
S1,确定对堆内存进行操作的操作类型。
S2,获取用于表述所述堆内存的内存结构信息。
S3,依据所述操作类型,以及所述内存结构信息对所述操作进行检测。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行:
S1,确定所述操作在所述堆内存所对应的内存块;
S2,依据所述内存块的状态信息确定所述内存块的状态;
S3,依据所述操作类型,以及确定的所述内存块的状态,判定所述操作的合法性。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行:
S1,在所述操作类型为对所述内存块进行访问,且所述内存块的状态为已释放的情况下,判定所述操作为访问已释放内存块的非法操作;
S2,在所述操作类型为对所述内存块进行读操作,且所述内存块的初始化状态为未初始化的情况下,判定所述操作为读未初始化内存块的非法操作;
S3,在所述操作类型为对所述内存块进行释放,且所述内存块的状态为已释放的情况下,判定所述操作为重复释放内存块的非法操作。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行:
S1,确定所述操作在所述堆内存块中的操作范围;
S2,依据所述操作范围,以及所述内存块的属性信息判定所述操作的合法性,其中,所述内存块的属性信息包括:所述操作在所述堆内存中对应的内存块的起始地址以及所述内存块的使用长度。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行:
S1,判断所述操作范围是否在所述内存块的起始地址和所述内存块的使用长度确定的范围内;
S2,在判断结果为否的情况下,确定所述操作为越界非法操作。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行:
S1,在所述操作为释放操作的情况下,确定所述操作的释放地址;
S2,在所述内存结构信息中获取不到所述释放地址对应的所述属性信息的情况下,判定所述操作为释放非内存地址的非法操作。
可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (12)
1.一种堆内存操作的检测方法,其特征在于,包括:
确定对堆内存进行操作的操作类型;
获取用于表述所述堆内存的内存结构信息;
依据所述操作类型,以及所述内存结构信息对所述操作进行检测。
2.根据权利要求1所述的方法,其特征在于,在所述内存结构信息包括所述堆内存所包括的内存块的状态信息的情况下,依据所述操作类型,以及所述内存结构信息对所述操作进行检测包括:
确定所述操作在所述堆内存所对应的内存块;
依据所述内存块的状态信息确定所述内存块的状态;
依据所述操作类型,以及确定的所述内存块的状态,判定所述操作的合法性。
3.根据权利要求2所述的方法,其特征在于,依据所述操作类型,以及确定的所述内存块的状态,判定所述操作的合法性包括以下至少之一:
在所述操作类型为对所述内存块进行访问,且所述内存块的状态为已释放的情况下,判定所述操作为访问已释放内存块的非法操作;
在所述操作类型为对所述内存块进行读操作,且所述内存块的初始化状态为未初始化的情况下,判定所述操作为读未初始化内存块的非法操作;
在所述操作类型为对所述内存块进行释放,且所述内存块的状态为已释放的情况下,判定所述操作为重复释放内存块的非法操作。
4.根据权利要求1所述的方法,其特征在于,在所述内存结构信息包括所述堆内存所包括的内存块的属性信息的情况下,依据所述操作类型,以及所述内存结构信息对所述操作进行检测的步骤包括:
确定所述操作在所述内存块中的操作范围;
依据所述操作范围,以及所述内存块的属性信息判定所述操作的合法性,其中,所述内存块的属性信息包括:所述操作在所述堆内存中对应的内存块的起始地址以及所述内存块的使用长度。
5.根据权利要求4所述的方法,其特征在于,依据所述操作范围,以及所述内存块的属性信息判定所述操作的合法性的步骤包括:
判断所述操作范围是否在所述内存块的起始地址和所述内存块的使用长度确定的范围内;
在判断结果为否的情况下,确定所述操作为越界非法操作。
6.根据权利要求1所述的方法,其特征在于,在所述内存结构信息包括所述堆内存所包括的内存块的属性信息的情况下,依据所述操作类型,以及所述内存结构信息对所述操作进行检测的步骤包括:
在所述操作为释放操作的情况下,确定所述操作的释放地址;
在所述内存结构信息中获取不到所述释放地址对应的所述属性信息的情况下,判定所述操作为释放非内存地址的非法操作。
7.一种堆内存操作的检测装置,其特征在于,包括:
确定模块,用于确定对堆内存进行操作的操作类型;
获取模块,用于获取用于表述所述堆内存的内存结构信息;
检测模块,用于依据所述操作类型,以及所述内存结构信息对所述操作进行检测。
8.根据权利要求7所述的装置,其特征在于,所述检测模块还包括,
第一确定单元,用于确定所述操作在所述堆内存所对应的内存块;
第二确定单元,用于依据所述内存块的状态信息确定所述内存块的状态;
第一判断单元,用于依据所述操作类型,以及确定的所述内存块的状态,判定所述操作的合法性。
9.根据权利要求8所述的装置,其特征在于,所述第一判断单元包括至少如下子单元之一:
第一判断子单元,用于在所述操作类型为对所述内存块进行访问,且所述内存块的状态为已释放的情况下,判定所述操作为访问已释放内存块的非法操作;
第二判断子单元,用于在所述操作类型为对所述内存块进行读操作,且所述内存块的初始化状态为未初始化的情况下,判定所述操作为读未初始化内存块的非法操作;
第三判断子单元,用于在所述操作类型为对所述内存块进行释放,且所述内存块的状态为已释放的情况下,判定所述操作为重复释放内存块的非法操作。
10.根据权利要求7所述的装置,其特征在于,所述检测模块还包括,
第三确定单元,用于确定所述操作在内存块中的操作范围;
第二判断单元,用于依据所述操作范围,以及所述内存块的属性信息判定所述操作的合法性,其中,所述内存块的属性信息包括:所述操作在所述堆内存中对应的内存块的起始地址以及所述内存块的使用长度。
11.根据权利要求10所述的装置,其特征在于,所述第二判断单元包括:
第四判断子单元,用于判断所述操作范围是否在所述内存块的起始地址和所述内存块的使用长度确定的范围内;
第一确定子单元,用于在判断结果为否的情况下,确定所述操作为越界非法操作。
12.根据权利要求7所述的装置,其特征在于,所述检测模块还包括:
第二确定子单元,用于在所述操作为释放操作的情况下,确定所述操作的释放地址;
第五判断子单元,用于在所述内存结构信息中获取不到所述释放地址对应的属性信息的情况下,判定所述操作为释放非堆内存地址的非法操作。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510212937.XA CN106201851A (zh) | 2015-04-29 | 2015-04-29 | 堆内存操作的检测方法及装置 |
PCT/CN2015/088906 WO2016173172A1 (zh) | 2015-04-29 | 2015-09-02 | 堆内存操作的检测方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510212937.XA CN106201851A (zh) | 2015-04-29 | 2015-04-29 | 堆内存操作的检测方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106201851A true CN106201851A (zh) | 2016-12-07 |
Family
ID=57198072
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510212937.XA Pending CN106201851A (zh) | 2015-04-29 | 2015-04-29 | 堆内存操作的检测方法及装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN106201851A (zh) |
WO (1) | WO2016173172A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109117357A (zh) * | 2017-06-23 | 2019-01-01 | 中兴通讯股份有限公司 | 记录全局变量信息及检测全局变量越界操作的方法、装置 |
CN111859372A (zh) * | 2020-07-29 | 2020-10-30 | 中国工商银行股份有限公司 | 堆内存攻击的检测方法、装置和电子设备 |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110795247B (zh) * | 2019-10-28 | 2023-06-30 | 天津津航计算技术研究所 | 一种应用于mcu的高效动态内存管理方法 |
CN111338794A (zh) * | 2020-02-18 | 2020-06-26 | 苏州洞察云信息技术有限公司 | 一种内存越界监控方法、装置及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101110042A (zh) * | 2006-07-20 | 2008-01-23 | 中兴通讯股份有限公司 | 一种检测内存访问越界的方法 |
CN102650959A (zh) * | 2012-03-31 | 2012-08-29 | 华为技术有限公司 | 一种检测内存单元的方法及设备 |
CN103116529A (zh) * | 2011-07-18 | 2013-05-22 | 英飞凌科技股份有限公司 | 用于实时检测缓冲区溢出致堆内存损坏的方法和设备 |
-
2015
- 2015-04-29 CN CN201510212937.XA patent/CN106201851A/zh active Pending
- 2015-09-02 WO PCT/CN2015/088906 patent/WO2016173172A1/zh active Application Filing
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101110042A (zh) * | 2006-07-20 | 2008-01-23 | 中兴通讯股份有限公司 | 一种检测内存访问越界的方法 |
CN103116529A (zh) * | 2011-07-18 | 2013-05-22 | 英飞凌科技股份有限公司 | 用于实时检测缓冲区溢出致堆内存损坏的方法和设备 |
CN102650959A (zh) * | 2012-03-31 | 2012-08-29 | 华为技术有限公司 | 一种检测内存单元的方法及设备 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109117357A (zh) * | 2017-06-23 | 2019-01-01 | 中兴通讯股份有限公司 | 记录全局变量信息及检测全局变量越界操作的方法、装置 |
CN111859372A (zh) * | 2020-07-29 | 2020-10-30 | 中国工商银行股份有限公司 | 堆内存攻击的检测方法、装置和电子设备 |
CN111859372B (zh) * | 2020-07-29 | 2023-08-22 | 中国工商银行股份有限公司 | 堆内存攻击的检测方法、装置和电子设备 |
Also Published As
Publication number | Publication date |
---|---|
WO2016173172A1 (zh) | 2016-11-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101427323B (zh) | 读取非易失性计算机存储器的系统和方法 | |
CN106909317B (zh) | 在存储节点上存储数据 | |
KR102099544B1 (ko) | 스트리밍 데이터의 분배 처리 방법 및 디바이스 | |
CN109409889A (zh) | 一种区块链中的区块确定方法、装置及电子设备 | |
US20100312749A1 (en) | Scalable lookup service for distributed database | |
CN105468642A (zh) | 数据的存储方法及装置 | |
CN106201851A (zh) | 堆内存操作的检测方法及装置 | |
CN109661659B (zh) | 视觉定位地图存储及加载方法、装置、系统及存储介质 | |
CN110347744B (zh) | 多层块链式账本的数据存储方法、装置及设备 | |
CN106201698A (zh) | 一种管理应用程序的方法、装置及电子设备 | |
CN101983376A (zh) | 访问装置、信息记录装置、信息记录系统、文件管理方法和程序 | |
CN107402950A (zh) | 基于分库分表的文件处理方法和装置 | |
CN108875046A (zh) | 一种存储系统访问方法、装置及电子设备 | |
CN107480074A (zh) | 一种缓存方法、装置及电子设备 | |
CN101963977A (zh) | 无城市搜索方法及移动终端 | |
CN109460406A (zh) | 一种数据处理方法及装置 | |
CN110532228A (zh) | 一种区块链数据读取的方法、系统、设备及可读存储介质 | |
CN104700030A (zh) | 一种病毒数据查找方法、装置及服务器 | |
KR101565975B1 (ko) | 인덱스를 저장하는 플래시 메모리를 포함하는 사용자 장치 및 그것의 인덱스 액세스 방법 | |
CN102129454A (zh) | 一种基于云存储的百科数据处理方法及系统 | |
CN107220342A (zh) | 一种分布式数据库的控制方法及系统 | |
CN107133163A (zh) | 一种验证描述类api的方法与设备 | |
CN115811483A (zh) | 一种网络状态监测方法、装置、电子设备和存储介质 | |
CN114721891A (zh) | 一种内存管理单元中缓冲区数据的写入方法及装置 | |
CN102436453A (zh) | 一种父子维的处理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20161207 |
|
WD01 | Invention patent application deemed withdrawn after publication |