CN114625646A - 一种检测系统内存越界的方法和装置 - Google Patents
一种检测系统内存越界的方法和装置 Download PDFInfo
- Publication number
- CN114625646A CN114625646A CN202210246000.4A CN202210246000A CN114625646A CN 114625646 A CN114625646 A CN 114625646A CN 202210246000 A CN202210246000 A CN 202210246000A CN 114625646 A CN114625646 A CN 114625646A
- Authority
- CN
- China
- Prior art keywords
- memory
- instruction
- memory access
- address
- jump
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明公开了一种检测系统内存越界的方法和装置,方法包括:申请内存,查寻内存检测函数的地址,同时生成跳转指令代码段模板并记录内存间隔的地址;检测系统内存越界时,若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集;修改后的所述跳转指令代码段调用所述内存检测函数,所述内存检测函数判断所述内存访问指令即将访问的内存地址是否属于内存间隔地址,若属于,则内存越界。本发明检测系统内存越界方法的实时性好,一旦发生内存越界就可以立即发现异常,直接在发生内存越界指令处抛出异常,减少定位时间。
Description
技术领域
本发明属于嵌入式技术领域,更具体地,涉及一种检测系统内存越界的方法和装置。
背景技术
内存越界一直是C语言常见的问题,常见的定位方法有两种:一种是在内存块加警戒字符,当内存释放的时候检查警戒字符是否被修改来确定越界,但是这种方法有延迟,即什么时候发送内存越界不清楚,什么原因造成的也不清楚,只能通过走读代码排查,定位速度慢;另外一种是设置内存保护页,每次申请内存都至少分配三个内存页,操作系统限制只能以页为单位设置内存读写属性,一般需要内存使用块至少占用一个页,尾部页保护需要一个页设置成不可读写属性,内存管理头需要一个页设置成可读属性,这样一共需要至少3个页,一个页大小约为4KB,4GB的内存下最多分配35万个内存块,将前后面的内存页设置为不可读写状态,一旦内存越界,可以触发内存管理器硬件错误,这种方法实时性高,但是消耗内存大,嵌入式系统中内存容量通常较小,大软件无法正常启动运行。
内存越界的第三方检测工具有地址错误检查器(Address Sanitizer,简称ASAN),ASAN运行速度慢,不是所有编译器版本和处理器框架都支持,并且编译器clang官方测试后证实加入ASAN后,运行速度下降2倍,实际工程中使用ASAN会造成运行速度下降,因此不适用第三方检测工具。
鉴于此,克服该现有技术产品所存在的不足是本技术领域亟待解决的问题。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种检测系统内存越界的方法和装置,其目的在于通过在内存访问前跳转至内存检测函数以便检测访问地址是否属于间隔地址,由此解决嵌入式系统中内存容量小不适用第三方检测工具进行内存越界的技术问题。
第一方面,本发明提供了一种检测系统内存越界的方法,方法包括:
申请内存,查寻内存检测函数的地址,同时生成跳转指令代码段模板并记录内存间隔的地址;
检测系统内存越界时,若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集;
修改后的所述跳转指令代码段调用所述内存检测函数,所述内存检测函数判断所述内存访问指令即将访问的内存地址是否属于内存间隔地址,若属于,则内存越界。
优选的,所述若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,方法包括:
若所述内存访问指令为立即数寻址类指令时,将所述内存访问指令中的立即数作为源赋值传递给处理器框架对应的传参寄存器,根据所述内存访问指令修改所述跳转指令代码段中的传参指令。
优选的,所述若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,方法还包括:
若所述内存访问指令为寄存器寻址类指令,获取与处理器框架对应的寄存器,将所述寄存器中存在的访问内存地址作为第一内存访问地址;
将所述第一内存访问地址作为源赋值传递给处理器框架对应的传参寄存器,根据所述第一内存访问指令修改所述跳转指令代码段中的传参指令。
优选的,所述若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,方法还包括:
若所述内存访问指令为基址加变址寻址类指令时,获取与处理器框架对应的基址寄存器和变址寄存器;
将所述基址寄存器和所述变址寄存器的地址之和作为第二内存访问地址,并将所述基址寄存器和所述变址寄存器的地址之和作为源赋值传递给处理器框架对应的传参寄存器;
根据所述第二内存访问指令修改所述跳转指令代码段中的传参指令。
优选的,所述跳转指令代码段的结尾处为所述内存访问指令和跳转到所述内存访问指令下一条指令的跳转指令。
优选的,方法还包括:
所述跳转指令代码段保存所述内存访问指令的上下文,若所述内存检测函数判断所述内存间隔块的地址不属于内存间隔地址,所述跳转指令代码段恢复所述内存访问指令的上下文,继续执行所述内存访问指令。
优选的,所述储存跳转指令代码段,查寻内存检测函数的地址,同时生成跳转指令代码段模板并记录内存间隔的地址,具体方法包括:
跳转指令代码段在栈上开辟内存空间,将所述内存访问指令对应的寄存器值压栈;
将所述内存访问指令对应的地址和长度保存于所述内存访问指令对应的传参寄存器中;
所述跳转指令段模板汇编指令序列。
优选的,所述修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,其中,所述指令集具体包括:入参指令、所述内存访问指令和跳转内存访问指令的下一条指令地址指令。
优选的,方法还包括:
停止检测系统内存越界时,所述跳转指令代码段的跳转指令修改为所述内存访问指令。
第二方面,本发明还包括一种检测系统内存越界的装置,装置包括:
至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行第一方面所述的检测系统内存越界的方法。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:
本发明提供的一种检测系统内存越界的方法和装置,检测系统内存越界方法的实时性好,一旦发生内存越界就可以立即发现异常,直接在发生内存越界指令处抛出异常,减少定位时间,并且可以进行定制化的启用或停止,性能影响小,能够跟随正常版本一起启动,不需要重新编译版本,不受编程语言编译器版本和处理器框架的限制。
附图说明
图1是本实施例一中检测系统内存越界的方法的流程示意图;
图2是本实施例一中检测系统内存越界的方法中跳转流程示意图;
图3是本实施例一中检测系统内存越界的方法中跳转代码段的流程示意图;
图4是本实施例二中检测系统内存越界的装置示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
在本发明中,除非另有明确的规定和限定,第一特征在第二特征之“上”或之“下”可以包括第一和第二特征直接接触,也可以包括第一和第二特征不是直接接触而是通过它们之间的另外的特征接触。而且,第一特征在第二特征“之上”、“上方”和“上面”包括第一特征在第二特征正上方和斜上方,或仅仅表示第一特征水平高度高于第二特征。第一特征在第二特征“之下”、“下方”和“下面”包括第一特征在第二特征正下方和斜下方,或仅仅表示第一特征水平高度小于第二特征。
实施例一:
本实施例一提供一种检测系统内存越界的方法,如图1所示,方法包括以下步骤:
S101:申请内存,查寻内存检测函数的地址,同时生成跳转指令代码段模板并记录内存间隔的地址。
程序启动时,申请内存区域用于存储跳转代码段,并查寻到内存检测函数的地址,同时生成若干跳转指令代码段模板。不同的处理器架构对应的跳转指令代码段模板也不一样,但是用于存储跳转代码段的内存区域一般不会超过200字节。
将即将访问内存的地址和长度保存到传参寄存器中。检测函数用C语言编辑的函数,检测函数的主要功能是查找当前访问的内存地址是否在记录下内存间隔块地址中。C语言编辑的检测函数最终编译成一段汇编指令,程序启动时会把这段汇编指令加载到一个内存地址中存放,这个内存地址由操作系统随机分配,因此需要查寻检测函数的内存地址,后续指令跳转到检测函数的内存地址上执行内存检测功能。内存地址管理算法常见方法有链表,hash表,位图等,还有asan的影子内存算法等等。查询函数地址可以通过遍历库中符号,查看符号名是否所查询的函数名的方式寻找。调用内存检测函数后,内存检测函数查找当前访问的内存地址是否属于内存间隔地址,如果是内存间隔地址,则抛出异常,程序异常终止,如果不是内存间隔地址,则继续执行指令。
跳转指令代码段模板依靠汇编语言生成,用来完成功能的汇编指令序列。
S102:检测系统内存越界时,若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集。
跳转指令代码段模板与程序中的内存访问指令类型具有对应关系,内存访问指令类型分为立即数寻址类指令、寄存器寻址类指令和基址加变址寻址类指令,跳转指令代码段模板也对应的分为立即数寻址类模板、寄存器寻址类模板和基址加变址寻址类模板,只不过不同的处理器架构对应的跳转指令代码段模板也不一样。
检测系统内存越界的从函数入口开始逐条解析程序中的函数指令,判断程序中的函数指令是否是内存访问指令,如果不是内存访问指令,继续解析下一条指令或者下个函数的指令;如果是内存访问指令,则跳转到与内存访问指令对应的跳转指令代码段模板,并修改由跳转指令代码段模板生成的跳转指令代码段中的指令集,同时将修改后的跳转指令代码段保存在S101申请的内存中。
S103:修改后的所述跳转指令代码段调用所述内存检测函数,所述内存检测函数判断所述内存访问指令即将访问的内存地址是否属于内存间隔地址,若属于,则内存越界。
程序运行到原内存访问指令(已经替换成了跳转指令)时,会跳转到修改后的跳转指令代码段中,跳转指令代码段保存当前代码的上下文并调用内存检测函数,内存检测函数根据内存间隔存储算法找到原内存访问指令即将访问的内存地址是否为间隔地址,如果是间隔地址则抛出异常,判断存在内存越界,程序停止运行;如果原内存访问指令即将访问的内存地址不是间隔地址,则恢复已保存的代码上下文,执行原内存访问指令并跳转原内存访问指令的下一条指令继续执行。
本实施例一中,为了适应程序所在的处理器框架,以便将立即数寻址类指令中的立即数赋值传递给对应的传参寄存器,结合本发明实施例,还存在一种优选的实现方案,具体的,如图2所示,检测方法包括:
步骤S201:若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集。
步骤S202:判断内存访问指令的类型。
若所述内存访问指令为立即数寻址类指令时,进行步骤S203,将所述内存访问指令中的立即数作为源赋值传递给处理器框架对应的传参寄存器,根据所述内存访问指令修改所述跳转指令代码段中的传参指令。
立即数寻址是直接访问内存地址中的数据,立即数就是内存访问地址,根据内存访问地址修改跳转指令代码段中的传参指令,将立即数作为源赋值传递给处理器框架对应的传参寄存器。
例如powerpc 32位的模板如下:
addi r1,r1,-64//0:栈上开辟字节空间
stw r3,8(r1) //1:r3寄存器入栈
mflr r3 //2:
stw r3,12(r1) //3:lr入栈
stw r4,16(r1) //4:r4寄存器入栈
stw r5,20(r1) //5:r5寄存器入栈
stw r0,24(r1) //6:r0入栈
stw r6,28(r1) //7:r6入栈
stw r7,32(r1) //8:r6入栈
stw r8,36(r1) //9:r6入栈
stw r9,40(r1) //10:r6入栈
stw r10,44(r1) //11:r6入栈
stw r11,48(r1) //12:r11入栈
addi r3,r0,0 //13:将rA存入r3,用于传递基址,这指令后续需要修改
addi r4,r0,0 //14:将rB存入r4,用于传递变址,这指令后续需要修改
li r5,0 //15:将d存入r5,用于传递偏移,这指令后续需要修改
bl memcheckfunc//16:调用内存检测函数,生成模块的之前查询函数地址
lwz r3,12(r1) //17:
mtlr r3 //18:恢复lr
lwz r3,8(r1) //19:恢复r3
lwz r4,16(r1) //20:恢复r4
lwz r5,20(r1) //21:恢复r5
lwz r0,24(r1) //21:恢复r0
lwz r6,28(r1) //23:恢复r6
lwz r7,32(r1) //24:恢复r7
lwz r8,36(r1) //25:恢复r8
lwz r9,40(r1) //26:恢复r9
lwz r10,44(r1) //27:恢复r10
lwz r11,48(r1) //28:恢复r11
addi r1,r1,64 //29:恢复栈
nop //30:源指令,这指令后续需要修改
bl //31:跳转到原指令下一条接着执行,这指令后续需要修改
根据程序所在的处理器框架选择对应的传参寄存器,例如powerpc平台的r3-r10都是传参寄存器,arm平台的r0-r3为传参寄存器,X86_64平台的rdi,rsi,rdx,rcx,r8,r9为传参寄存器,参数按照寄存器的顺序约定,如powerpc上第一个参数r3,第二个是r4,以此类推。以powerpc平台的为例,传入的有三个参数,r3用于传递基址,r4用于传递变址,r5用于传递偏移,对于立即数寻址类指令,将立即数赋值作为源赋值给r3寄存器,r4寄存器和r5寄存器赋值则为0。
例如32位powerpc cpu架构下指令stw r31,(0x1234),该指令是将0x1234内存单元中的值写入到寄存器r31中,那么内存检测函数的入参就是0x1234。修改过程就是把0x1234赋值给基址传参寄存器,addi r3,r0,0指令修改为li r3 0x1234;addi r4,r0,0指令修改为li r4,0;addi r5,r0,0修改指令修改为li r5,0。li是操作立即数的指令,将立即数值存放到寄存器中,addi是将寄存器的值取出来与立即数相加的结果存放到寄存器中。
本实施例一中,为了适应程序所在的处理器框架,以便将寄存器寻址类指令中的基址寄存器和变址寄存器的地址之和作为赋值传递给对应的传参寄存器,结合本发明实施例,还存在一种优选的实现方案,具体的,如图2所示,所述若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,方法包括:
若所述内存访问指令为寄存器寻址类指令时,进行步骤S204,获取与处理器框架对应的寄存器,将所述寄存器中存在的访问内存地址作为第一内存访问地址。
将所述第一内存访问地址作为源赋值传递给处理器框架对应的传参寄存器,根据所述第一内存访问指令修改所述跳转指令代码段中的传参指令。
三类寻址方式包括立即数寻址类指令、寄存器寻址类指令和基址加变址寻址类指令,都可以用有效地址=基址+变址+偏移这个公式来计算,立即数寻址就是基址为立即数,变址和偏移都为0;寄存器寻址就是基址为寄存器,变址和偏移都为0;基址加变址寻址,就是基址为寄存器,变址为寄存器,偏移为0。
与处理器框架对应的传参寄存器是用于计算内存访问地址,把修改后的内存访问地址传递给内存检测函数来检测系统是否存在内存越界。
例如32位powerpc cpu架构下指令stw r31,8(r14),该指令中寄存器r14中存储的是一个内存地址,该指令的作用是把该内存地址编译8字节所对应地址值写到寄存器r31中,那么内存检测函数的入参就是寄存器r14。修改过程就是把r14赋值给基址传参寄存器,把偏移8字节赋值给偏移传参寄存器,addi r3,r0,0指令修改为addi r3,r14,0;addi r4,r0,0指令修改为li r4,0;li r5,0指令修改为li r5,8。
本实施例一中,为了适应程序所在的处理器框架,以便将基址加变址寻址类指令中的基址寄存器和变址寄存器的地址之和作为赋值传递给对应的传参寄存器,结合本发明实施例,还存在一种优选的实现方案,具体的,如图2所示,所述将所述内存访问指令修改为对应所述跳转指令代码段模板中跳转指令代码段的指令集。
若所述内存访问指令为基址加变址寻址类指令时,进行步骤S205,获取与处理器框架对应的基址寄存器和变址寄存器。
将所述基址寄存器和所述变址寄存器的地址之和作为第二内存访问地址,并将所述基址寄存器和所述变址寄存器的地址之和作为源赋值传递给处理器框架对应的传参寄存器。
根据所述第二内存访问指令修改所述跳转指令代码段中的传参指令。
例如32位powerpc cpu架构下指令stw r31,r14,r15,该指令是将r14寄存器中的值作为一个基础内存地址,加上寄存器r15中的值,得到一个内存地址,然后在写该内存地址中的数据到寄存器r31中,那么内存检测函数的入参就是寄存器r14的值加上寄存器r15的值。修改过程就是把r14赋值给基址传参寄存器,r15赋值给变址传参寄存器,addi r3,r0,0指令修改为addi r3,r14,0;addi r4,r0,0修改为addi r4,r15,0;li r5,0不修改。
本实施例一中,为了在不存在系统内存越界的情况下继续执行原指令,结合本发明实施例,还存在一种优选的实现方案,具体的,如图2所示,跳转指令代码段中的传参指令修改后,进行步骤S206,所述跳转指令代码段的结尾处为所述内存访问指令和跳转到所述内存访问指令下一条指令的跳转指令。
在图2的步骤S206中跳转指令代码段的结尾处需要两个指令,即内存访问指令和跳转指令,内存访问指令是为了执行原来的内存访问,跳转指针是因为从原来的代码段跳转到跳转指令代码段,若跳转指令代码段执行完,需要跳转到原代码段继续执行,因为内存访问指令已经执行,所以要跳转到内存访问指令下一条指令。
本实施例一中,为了在内存检测功能执行完后保证程序能够继续执行原逻辑和功能,结合本发明实施例,还存在一种优选的实现方案,具体的,方法还包括:
所述跳转指令代码段保存所述内存访问指令的上下文,若所述内存检测函数判断所述内存间隔块的地址不属于内存间隔地址,所述跳转指令代码段恢复所述内存访问指令的上下文,继续执行所述内存访问指令。
内存访问指令的上下文是指内存访问指令对应的寄存器值,保存内存访问指令的上下文,就是把内存访问指令对应的寄存器的值全部存在栈上。
把寄存器存放在栈上,可以待内存检测功能执行完成后把存放在栈上的寄存器恢复到相应的寄存器,这样函数继续执行,不改变原来函数的逻辑和功能。
在跳转代码段程序中,内存访问指令被替换成跳转指令后,如图3所示,进行的步骤有:
S301:保存内存访问指令的上下文,转向S302。
跳转代码段主要完成如下功能:保存内存访问指令的上下文并调用内存检测函数。
S302:检查内存访问地址是否属于间隔地址。若是,跳转至S304;若不是,跳转至S303。
内存检测函数根据内存间隔存储算法找到当前访问的内存地址是否为间隔地址。
S303:执行原指令。
内存检测函数检查访问地址不属于间隔地址,则恢复保存的内存访问指令的上下文,执行原内存指令并跳转原指令的下一条指令继续执行。
S304:程序异常终止。
如果是间隔地址则抛出异常,程序停止运行。
结合本发明实施例,还存在一种优选的实现方案,具体的,所述储存跳转指令代码段,查寻内存检测函数的地址,同时生成跳转指令代码段模板并记录内存间隔的地址,具体方法包括:
跳转指令代码段的栈上开辟内存空间,将所述内存访问指令对应的寄存器值压栈。
栈指针偏移预设长度实现栈上申请内存,栈上开辟内存空间,保存上下文,把当前的寄存器值压栈。将访问内存的地址和长度保存到传参寄存器中。
将所述内存访问指令对应的地址和长度保存于所述内存访问指令对应的传参寄存器中。
所述跳转指令段模板汇编指令序列,跳转指令段模板是使用汇编语言编写的汇编代码。跳转指令代码段具有5部分功能,包括:
1、保存上下文,把当前的寄存器值压栈;
2、计算出访问内存地址,并将访问内存的地址和长度保存到传参寄存器中;
3、调用内存检测函数进行内存属性检测;
4、恢复上下文,将栈上保存的寄存器值恢复到相应的寄存器;
5、执行原内存访问指令,跳转到原内存访问指令地址的下一条指令。
本实施例一中,结合本发明实施例,还存在一种优选的实现方案,具体的,所述检测系统内存越界时,所述修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,其中,所述指令集具体包括:入参指令、保留所述内存访问指令和跳转内存访问指令的下一条指令地址指令。
本实施例一中,为了定制化启用或停止系统内存越界的检测方法,结合本发明实施例,还存在一种优选的实现方案,具体的,所述检测系统内存越界时,若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,方法还包括:
停止检测系统内存越界时,所述跳转指令代码段的跳转指令修改为所述内存访问指令。
若不需要内存检测功能时,则将内存跳转指令修改为原内存访问指令,功能关闭。也可以在功能激活之前预先设定代码范围,程序启动后,可以获得指定函数开始地址和结束地址,分析指令的时候限制只分析这段范围内的指令是否为内存访问指令,模块或者动态库也是类似的,能够获得相应的开始地址和结束地址。
实施例二:
本实施例二提供一种检测系统内存越界的装置,所述装置包括:
至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行实施例一中任一所述的检测系统内存越界的方法。
如图4所示,是本发明实施例的检测系统内存越界的装置示意图。本实施例的检测系统内存越界的装置包括一个或多个处理器21以及存储器22。其中,图4中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图4中以通过总线连接为例。
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例一中的检测系统内存越界的方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行检测系统内存越界的方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例一中的检测系统内存越界的方法,例如,执行以上描述的图1至图3所示的各个步骤。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种检测系统内存越界的方法,其特征在于,方法包括:
申请内存,查寻内存检测函数的地址,同时生成跳转指令代码段模板并记录内存间隔的地址;
检测系统内存越界时,若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集;
修改后的所述跳转指令代码段调用所述内存检测函数,所述内存检测函数判断所述内存访问指令即将访问的内存地址是否属于内存间隔地址,若属于,则内存越界。
2.如权利要求1所述的检测系统内存越界的方法,其特征在于,所述若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,方法包括:
若所述内存访问指令为立即数寻址类指令时,将所述内存访问指令中的立即数作为源赋值传递给处理器框架对应的传参寄存器,根据所述内存访问指令修改所述跳转指令代码段中的传参指令。
3.如权利要求1所述的检测系统内存越界的方法,其特征在于,所述若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,方法还包括:
若所述内存访问指令为寄存器寻址类指令,获取与处理器框架对应的寄存器,将所述寄存器中存在的访问内存地址作为第一内存访问地址;
将所述第一内存访问地址作为源赋值传递给处理器框架对应的传参寄存器,根据所述第一内存访问指令修改所述跳转指令代码段中的传参指令。
4.如权利要求1所述的检测系统内存越界的方法,其特征在于,所述若遇到程序中的内存访问指令,则跳转到与所述内存访问指令对应的所述跳转指令代码段模板,并修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,方法还包括:
若所述内存访问指令为基址加变址寻址类指令时,获取与处理器框架对应的基址寄存器和变址寄存器;
将所述基址寄存器和所述变址寄存器的地址之和作为第二内存访问地址,并将所述基址寄存器和所述变址寄存器的地址之和作为源赋值传递给处理器框架对应的传参寄存器;
根据所述第二内存访问指令修改所述跳转指令代码段中的传参指令。
5.如权利要求1所述检测系统内存越界的方法,其特征在于,所述跳转指令代码段的结尾处为所述内存访问指令和跳转到所述内存访问指令下一条指令的跳转指令。
6.如权利要求5所述检测系统内存越界的方法,其特征在于,方法还包括:
所述跳转指令代码段保存所述内存访问指令的上下文,若所述内存检测函数判断所述内存间隔块的地址不属于内存间隔地址,所述跳转指令代码段恢复所述内存访问指令的上下文,继续执行所述内存访问指令。
7.如权利要求1所述检测系统内存越界的方法,其特征在于,所述储存跳转指令代码段,查寻内存检测函数的地址,同时生成跳转指令代码段模板并记录内存间隔的地址,具体方法包括:
跳转指令代码段在栈上开辟内存空间,将所述内存访问指令对应的寄存器值压栈;
将所述内存访问指令对应的地址和长度保存于所述内存访问指令对应的传参寄存器中;
所述跳转指令段模板汇编指令序列。
8.如权利要求1所述检测系统内存越界的方法,其特征在于,所述修改由所述跳转指令代码段模板生成的跳转指令代码段中的指令集,其中,所述指令集具体包括:入参指令、所述内存访问指令和跳转内存访问指令的下一条指令地址指令。
9.如权利要求1至8任一所述检测系统内存越界的方法,其特征在于,方法还包括:
停止检测系统内存越界时,所述跳转指令代码段的跳转指令修改为所述内存访问指令。
10.一种检测系统内存越界的装置,其特征在于,装置包括:
至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行权利要求1-9任一所述的检测系统内存越界的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210246000.4A CN114625646A (zh) | 2022-03-14 | 2022-03-14 | 一种检测系统内存越界的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210246000.4A CN114625646A (zh) | 2022-03-14 | 2022-03-14 | 一种检测系统内存越界的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114625646A true CN114625646A (zh) | 2022-06-14 |
Family
ID=81902734
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210246000.4A Pending CN114625646A (zh) | 2022-03-14 | 2022-03-14 | 一种检测系统内存越界的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114625646A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115422554A (zh) * | 2022-10-25 | 2022-12-02 | 支付宝(杭州)信息技术有限公司 | 请求处理方法、编译方法和可信计算系统 |
-
2022
- 2022-03-14 CN CN202210246000.4A patent/CN114625646A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115422554A (zh) * | 2022-10-25 | 2022-12-02 | 支付宝(杭州)信息技术有限公司 | 请求处理方法、编译方法和可信计算系统 |
CN115422554B (zh) * | 2022-10-25 | 2023-03-24 | 支付宝(杭州)信息技术有限公司 | 请求处理方法、编译方法和可信计算系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10242043B2 (en) | Software security via control flow integrity checking | |
CN108090346B (zh) | 一种基于数据流监控的代码复用攻击防御方法及系统 | |
CN1258702C (zh) | 为不同的指令集结构所编写的固件之间进行通信的方法 | |
CN108132890B (zh) | 存储芯片的垃圾回收方法、装置、设备及存储介质 | |
CN102200911A (zh) | 变量闭包 | |
US7624384B2 (en) | Apparatus, system, and method of dynamic binary translation with translation reuse | |
CN112015491B (zh) | 实现函数跳转的方法、装置及计算机存储介质 | |
US10311233B2 (en) | Generic unpacking of program binaries | |
Zhao et al. | Haepg: An automatic multi-hop exploitation generation framework | |
CN114625646A (zh) | 一种检测系统内存越界的方法和装置 | |
CN114968282A (zh) | 一种异常处理执行的优化方法和系统 | |
CN110471832B (zh) | 程序运行的处理方法、装置及计算机可读存储介质 | |
JP2001147837A (ja) | プログラムトレース装置及び記憶媒体 | |
CN111931191A (zh) | Linux平台二进制软件堆溢漏洞动态检测方法及系统 | |
CN106354624B (zh) | 一种自动化测试方法和装置 | |
KR101851330B1 (ko) | 코드 재사용 공격 탐지 장치 및 그 방법 | |
CN101650688B (zh) | 一种访问vm_io地址空间的方法和用户态调试器 | |
CN115309499A (zh) | 虚拟机中数组处理方法、装置、电子设备及可读存储介质 | |
CN103164290A (zh) | 应用内存管理方法和装置 | |
CN117331741A (zh) | 数据校验方法、处理器及电子设备 | |
CN106897588B (zh) | 一种标签函数的处理方法及装置 | |
CN114527963A (zh) | C++二进制文件中的类继承关系识别方法及电子装置 | |
Ling et al. | GIANTSAN: Efficient Memory Sanitization with Segment Folding | |
CN113312082A (zh) | 一种二进制文件中混合在指令中的数据的识别方法及装置 | |
US20130283244A1 (en) | Debugging Extensible Markup Language |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |