CN104536810A - 一种基于栈的异常检测方法和装置 - Google Patents

一种基于栈的异常检测方法和装置 Download PDF

Info

Publication number
CN104536810A
CN104536810A CN201410797374.0A CN201410797374A CN104536810A CN 104536810 A CN104536810 A CN 104536810A CN 201410797374 A CN201410797374 A CN 201410797374A CN 104536810 A CN104536810 A CN 104536810A
Authority
CN
China
Prior art keywords
stack
identification information
stack top
top element
business object
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.)
Granted
Application number
CN201410797374.0A
Other languages
English (en)
Other versions
CN104536810B (zh
Inventor
张皓秋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Qihoo Technology Co Ltd
Original Assignee
Beijing Qihoo Technology Co Ltd
Qizhi Software Beijing Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Qihoo Technology Co Ltd, Qizhi Software Beijing Co Ltd filed Critical Beijing Qihoo Technology Co Ltd
Priority to CN201410797374.0A priority Critical patent/CN104536810B/zh
Publication of CN104536810A publication Critical patent/CN104536810A/zh
Priority to PCT/CN2015/095453 priority patent/WO2016095672A1/zh
Application granted granted Critical
Publication of CN104536810B publication Critical patent/CN104536810B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明实施例提供了一种基于栈的异常检测方法和装置,所述方法包括:生成标识信息;在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;检测所述栈顶元素与所述标识信息是否相同;以及当所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。本发明实施例基于栈传递参数的原理,实现调用第二业务对象实时的异常检测,提高了检测栈异常的速度和准确率,同时提高了异常定位的精确度。并且,可以直观的在栈中看到崩溃时的参数以让后续开发人员进行崩溃分析,找到栈崩溃原因,提高开发效率。

Description

一种基于栈的异常检测方法和装置
技术领域
本发明涉及计算机技术领域,特别是涉及一种基于栈的异常检测方法方法和一种基于栈的异常检测装置。
背景技术
栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。
人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底。向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称为出栈或退栈,它是把栈顶元素删除掉,使其下面的相邻元素成为新的栈顶元素。
栈中存储着函数的局部变量等信息,在编译完成后,局部变量的位置是固定的,但是在调用其他业务对象时需要将参数压入栈(push),这会破坏顺序,所以在调用完毕后需要将压入栈的数据再弹出(pop)以恢复栈空间的顺序,否则因为读取变量是读取固定位置,导致读取的值不正确,此时就认为变量被破坏了。
若当前业务对象需要调用其他用户制作的业务对象,大多数情况下业务对象与业务对象之间是通过栈空间来交换数据的,将参数压入栈顶,然后调用函数,对方在内部从栈顶拿出参数。
由于读取的是固定位置,因此如果栈空间出现问题,可能操作某局部变量的时候操作到意外的值,如果该局部变量是个函数指针,甚至会导致执行意外的代码。
如果栈空间出现问题,当时并不会崩溃,而是当其他业务对象操作被破坏的局部变量时可能导致崩溃,难以定位出错的位置。比如向一个指针变量指向的地址写入数据,但是该变量被破坏,导致尝试向未知区域写入数据,此时可能因为写入不可写的地址而崩溃。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种基于栈的异常检测方法和相应的一种基于栈的异常检测装置。
依据本发明的一个方面,提供了一种基于栈的异常检测方法,包括:
生成标识信息;
在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;
检测所述栈顶元素与所述标识信息是否相同;以及
当所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
可选地,所述方法还包括:
当所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
可选地,所述方法还包括:
生成所述栈出现异常的提示信息;
或者,
使用调试接口输出异常信息。
可选地,所述生成标识信息的步骤包括:
在第一时间针对标识对象生成第一信息;
将所述第一信息写入特征变量中;
在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间不同;
将所述第二信息写入全局变量中;以及
根据所述特征变量和所述全局变量生成所述标识信息。
可选地,所述根据所述特征变量和所述全局变量生成所述标识信息的步骤进一步包括:
将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
将所述结果写入全局变量中,以获得标识信息。
可选地,所述第二业务对象调用在栈中一个或多个参数的操作进一步包括:
读取在栈中的所述一个或多个参数;以及
进行堆栈平衡处理。
可选地,所述提取当前位于栈顶的栈顶元素的步骤进一步包括:
对当前位于栈顶的栈顶元素进行出栈操作;以及
将出栈之后的栈顶元素写入局部变量。
可选地,所述标识信息存储在全局变量中,以及所述检测所述栈顶元素与所述标识信息是否相同的步骤进一步包括:
判断所述局部变量与所述全局变量是否相同;以及
若是,则判断所述栈顶元素与所述标识信息相同,否则,则判断所述栈顶元素与所述标识信息不同。
根据本发明的另一方面,提供了一种基于栈的异常检测装置,包括:
第一生成模块,适于生成标识信息;
压入模块,适于在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
提取模块,适于当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;
检测模块,适于检测所述栈顶元素与所述标识信息是否相同;以及
异常判断模块,适于在所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
可选地,所述装置还包括:
正常判断模块,适于在所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
可选地,所述装置还包括:
第二生成模块,适于生成所述栈出现异常的提示信息;
或者,
输出模块,适于使用调试接口输出异常信息。
可选地,所述第一生成模块还适于:
在第一时间针对标识对象生成第一信息;
将所述第一信息写入特征变量中;
在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间不同;
将所述第二信息写入全局变量中;以及
根据所述特征变量和所述全局变量生成所述标识信息。
可选地,所述第一生成模块还适于:
将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
将所述结果写入全局变量中,以获得标识信息。
可选地,在所述第二业务对象调用在栈中一个或多个参数的过程中,所述第二业务对象适于:
读取在栈中的所述一个或多个参数;以及
进行堆栈平衡处理。
可选地,所述提取模块还适于:
对当前位于栈顶的栈顶元素进行出栈操作;以及
将出栈之后的栈顶元素写入局部变量。
可选地,所述标识信息存储在全局变量中,以及所述检测模块还适于:
判断所述局部变量与所述全局变量是否相同;以及
若是,则判断所述栈顶元素与所述标识信息相同,否则,则判断所述栈顶元素与所述标识信息不同。
本发明实施例在第一业务对象将一个或多个参数压入栈之前,将标识信息压入栈,当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素,检测所述栈顶元素与所述标识信息是否相同,若相异时,则判断栈出现异常,基于栈传递参数的原理,实现调用第二业务对象实时的异常检测,提高了检测栈异常的速度和准确率,同时提高了异常定位的精确度。并且,可以直观的在栈中看到崩溃时的参数以让后续开发人员进行崩溃分析,找到栈崩溃原因,提高开发效率。
本发明实施例在不同时间对同一标识对象生成第一信息、第二信息,并按位进行异或操作,生成标识信息,大大提高了标识信息的复杂度,大大减少标识信息与在先其他数据重合的几率,进而减少了后续异常检测误判的几率,进一步提高了异常检测的判断准确率。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1为根据本发明一个实施例的一种基于栈的异常检测方法实施例的步骤流程示意图;以及
图2为根据本发明一个实施例的一种基于栈的异常检测装置实施例的方块示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
参照图1,示出了根据本发明一个实施例的一种基于栈的异常检测方法实施例的步骤流程图,具体可以包括如下步骤:
步骤101,生成标识信息;
在实际应用中,第一业务对象调用第二业务对象时,一般通过栈传递第二业务对象执行其内部逻辑所需的一个或多个参数。则第一业务对象可以称为调用者,第二业务对象可以称为被调用者。
其中,第一业务对象、第二业务对象可以包括函数、程序等等。
在本发明实施例中,若第一业务对象发起第二业务对象的调用,则可以生成标识信息cookie,该标识信息cookie可以为具有唯一性任意信息。
在本发明的一种可选实施例中,步骤101可以包括如下子步骤:
子步骤S11,在第一时间针对标识对象生成第一信息;
子步骤S12,将所述第一信息写入特征变量中;
子步骤S13,在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间不同;
子步骤S14,将所述第二信息写入全局变量中;以及
子步骤S15,根据所述特征变量和所述全局变量生成所述标识信息。
本发明实施例在不同时间对同一标识对象生成第一信息、第二信息,并按位进行异或操作,生成标识信息,大大提高了标识信息的复杂度,大大减少标识信息与在先其他数据重合的几率,进而减少了后续异常检测误判的几率,进一步提高了异常检测的判断准确率。
为使本领域技术人员更好地理解本发明实施例,以下通过具体示例来说明本发明实施例中标识信息的生成方法。
在第一业务对象编译时(第一时间),通过GetTickCount函数等方式获取系统(标识对象)从开机到现在的毫秒数,写入特征变量_st_safecall_cookie中。
然后在第一业务对象运行时(第二时间),再次获取系统(标识对象)从开机到现在的毫秒数,写入全局变量_SafeCall_cookie中。
基于特征变量_st_safecall_cookie和全局变量_SafeCall_cookie计算生存标识信息。在本发明实施例的一种可选示例中,子步骤S15进一步可以包括如下子步骤:
子步骤S151,将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
子步骤S152,将所述结果写入全局变量中,以获得标识信息。
将全局变量_SafeCall_cookie与特征变量_st_safecall_cookie按位进行异或操作,并将异或结果再次存入全局变量_SafeCall_cookie中,以异或结果作为标识信息cookie。
其中,按位异或运算可以由按位异或运算符“^”实现,按位异或运算符“^”是双目运算符,其功能是参与运算的两数(如全局变量_SafeCall_cookie与特征变量_st_safecall_cookie)各对应的二进位相异或,当两对应的二进位相异时,结果为1,相同时,结果为0。
例如,9^5可写成算式为00001001^00000101,结果为00001100。
当然,上述按位异或运算生成标识信息的方式只是作为示例,在实施本发明实施例时,可以根据实际情况设置其他生成标识信息的方式,例如,按位与或运算、按照指定的函数式计算等等,本发明实施例对此不加以限制。
此外,上述根据第一信息和第二信息生成标识信息的方式也只是作为示例,在实施本发明实施例时,可以根据实际情况设置其他生成标识信息的方式,例如,直接设置标识信息等,该标识信息具有唯一性即可,本发明实施例对此不加以限制。
步骤102,在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
在具体实现时,第一个压入栈的可以是标识信息cookie,然后是第一业务对象提供的一个或多个参数。
在具体实现中,可以在每个对外部第二业务对象的调用之前执行以下语句:
__asm{
Push_SafeCall_cookie
}
以使用push操作将存储有标识信息cookie的全局变量_SafeCall_cookie压入栈顶。
需要说明的是,该一个或多个参数中,第一个进栈的参数是第一业务对象中调用完第二业务对象后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是其他第二业务对象所需要的参数。
具体而言,第一业务对象可以使用call指令调用第二业务对象,并把call指令的下一条指令的地址当成返回地址压入栈中(这个压栈操作隐含在call指令中)。
第一业务对象可以把第二业务对象所需要的参数按照与第二业务对象的形参顺序相反的顺序压入栈中,即从右向左依次把被第二业务对象所需要的参数压入栈。
则标识信息与一个或多个参数在栈中的局部结构可以如下表所示:
表1
数据
an A
an-1 B
an-2 C
an-3 返回地址
an-4 SafeCall_cookie
…… ……
a2 ……
a1 ……
其中,an为栈顶元素,a1为栈底元素,A、B、C、返回地址为第一业务对象提供的参数,SafeCall_cookie为存储有标识信息cookie的全局变量。
步骤103,当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;
对于栈的逻辑结构,假设一个栈中的元素为an,an-1,..,a2,a1,可以称a1为栈底元素,an为栈顶元素,即栈中的元素按a1,a2,..,an-1,an的次序进栈。
一般情况下,出栈的元素都是栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出(Last In First Out)表,简称为LIFO表。
在本发明的一种可选实施例中,所述第二业务对象调用在栈中一个或多个参数的操作可以包括:
子步骤S21,读取在栈中的所述一个或多个参数;
第二业务对象在栈中读取所需要的参数(即出栈),按照该参数执行内部的逻辑,然后栈顶指针指向返回地址,也就是第一业务对象中的下一条指令,第一业务对象由该点继续运行。
一般情况下,第二业务对象从栈中获取参数,此时栈中的参数并不会被出栈,而是等到进行堆栈平衡时候,才会从栈中处理掉。
子步骤S22,进行堆栈平衡处理。
第一业务对象把参数压入栈,然后调用第二业务对象,在完成后,由于堆栈中先前压入的参数不再有用,第一业务对象或者第二业务对象中有一方把堆栈指针修正到调用前的状态,这就叫堆栈的平衡。
而究竟由第一业务对象还第二业务对象来修正堆栈可以预先约定(称为调用约定),不然就会产生错误的结果。
在实际应用中,各种语言默认的调用约定是不同的。例如,C类型是在第一业务对象在使用call指令完成后,自行用add esp指令把栈空间清除,而PASCAL和StdCall的是由第二业务对象用ret指令来实现的(ret指令后面加一个操作数表示在ret后把堆栈指针esp加上操作数)。
在本发明的一种可选实施例中,步骤103可以包括如下子步骤:
子步骤S31,对当前位于栈顶的栈顶元素进行出栈操作;
子步骤S32,将出栈之后的栈顶元素写入局部变量。
在实际应用中,可以在第二业务对象调用完成后,执行语句:
__asm{
Pop_loc_Safecall_Cookie
}
以使用pop操作将栈顶元素出栈,并写入局部变量_loc_Safecall_Cookie中。
其中,局部变量_loc_Safecall_Cookie可以是调用外部第二业务对象的第一业务对象的局部变量。
局部变量的应用示例可以如下:
第一业务对象{
Int I=0;//声明并定义整数变量I,初始化值为0
第二业务对象();//调用第二业务对象
}
第一业务对象调用第二业务对象,I则是第一业务对象的局部变量。
步骤104,检测所述栈顶元素与所述标识信息是否相同;
本发明实施例中,可以通过对比栈顶元素与标识信息,检测调用第二业务对象过程中是否出现异常。
在本发明的一种可选实施例中,步骤104可以包括如下子步骤:
子步骤S41,判断所述局部变量与所述全局变量是否相同;若是,则执行子步骤S42,若否,则执行子步骤S43;
子步骤S42,判断所述栈顶元素与所述标识信息相同;
子步骤S43,判断所述栈顶元素与所述标识信息不同。
堆栈平衡之后,在正常情况下,栈空间是与传递参数前一致,因为标识信息cookie其实不是传递给第二业务对象的参数,所以不会在堆栈平衡中处理掉,标识信息cookie位于栈顶。
则正常情况下,第二业务对象调用完成后,栈中的局部结构可以如下表所示:
表2
数据
an SafeCall_cookie
an-1 ……
an-2 ……
an-3 ……
an-4
…… ……
a2 ……
a1 ……
其中,an为栈顶元素,a1为栈底元素,SafeCall_cookie为存储有标识信息cookie的全局变量。
在正常情况下,写入局部变量_loc_Safecall_Cookie的栈顶元素an为在先写入的全局变量SafeCall_cookie,则局部变量_loc_Safecall_Cookie与全局变量SafeCall_cookie相同。
堆栈平衡之后,在异常情况下,栈空间与传递参数前并不一致,位于栈顶的是其他数据,而并非标识信息cookie。
则在异常情况下,第二业务对象调用完成后,在栈中的局部结构可以如下表所示:
表3
数据
an C
an-1 返回地址
an-2 SafeCall_cookie
an-3 ……
an-4 ……
…… ……
a2 ……
a1 ……
其中,an为栈顶元素,a1为栈底元素,C、返回地址为第一业务对象提供的参数,SafeCall_cookie为存储有标识信息cookie的全局变量。
在异常情况下,写入局部变量_loc_Safecall_Cookie的栈顶元素an为其他数据,例如表3中的参数C,并非在先写入的全局变量SafeCall_cookie,则局部变量_loc_Safecall_Cookie与全局变量SafeCall_cookie相异。
步骤105,当所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
若栈顶元素与标识信息相异,如局部变量_loc_Safecall_Cookie与全局变量SafeCall_cookie相异,则可以认为栈被破坏,出现异常。
本发明实施例在第一业务对象将一个或多个参数压入栈之前,将标识信息压入栈,当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素,检测所述栈顶元素与所述标识信息是否相同,若相异时,则判断栈出现异常,基于栈传递参数的原理,实现调用第二业务对象实时的异常检测,提高了检测栈异常的速度和准确率,同时提高了异常定位的精确度。并且,可以直观的在栈中看到崩溃时的参数以让后续开发人员进行崩溃分析,找到栈崩溃原因,提高开发效率。
在本发明的一种可选实施例中,还可以包括如下步骤:
步骤106,生成所述栈出现异常的提示信息;
在本发明实施例中,若检测到栈出现异常,则可以提示开发者或者用户。
例如,弹出提示框“调用xxx函数后发现栈空间异常”。
或者,
步骤107,使用调试接口输出异常信息。
在本发明实施例中,若检测到栈出现异常,则可以使用调试接口输出与异常有关的信息,例如,第一业务对象的函数入口地址、第二业务对象的函数入口地址、时间等等。
在本发明的一种可选实施例中,还可以包括如下步骤:
步骤108,当所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
若栈顶元素与标识信息相同,如局部变量_loc_Safecall_Cookie与全局变量SafeCall_cookie相同,则可以认为栈运行正常。
对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
参照图2,示出了根据本发明一个实施例的一种基于栈的异常检测装置实施例的结构框图,具体可以包括如下模块:
第一生成模块201,适于生成标识信息;
压入模块202,适于在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
提取模块203,适于当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;
检测模块204,适于检测所述栈顶元素与所述标识信息是否相同;以及
异常判断模块205,适于在所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
在本发明的一种可选实施例中,还可以包括如下模块:
正常判断模块,适于在所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
在本发明的一种可选实施例中,还可以包括如下模块:
第二生成模块,适于生成所述栈出现异常的提示信息;
或者,
输出模块,适于使用调试接口输出异常信息。
在本发明的一种可选实施例中,所述第一生成模块201还可以适于:
在第一时间针对标识对象生成第一信息;
将所述第一信息写入特征变量中;
在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间相异;
将所述第二信息写入全局变量中;以及
根据所述特征变量和所述全局变量生成所述标识信息。
在本发明实施例的一种可选示例中,所述第一生成模块201还可以适于:
将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
将所述结果写入全局变量中,以获得标识信息。
在本发明的一种可选实施例中,在所述第二业务对象调用在栈中一个或多个参数的过程中,所述第二业务对象适于:
读取在栈中的所述一个或多个参数;以及
进行堆栈平衡处理。
在本发明的一种可选实施例中,所述提取模块203还可以适于:
对当前位于栈顶的栈顶元素进行出栈操作;以及
将出栈之后的栈顶元素写入局部变量。
在本发明的一种可选实施例中,所述标识信息可以存储在全局变量中,以及所述检测模块204还可以适于:
判断所述局部变量与所述全局变量是否相同;以及
若是,则判断所述栈顶元素与所述标识信息相同,否则,则判断所述栈顶元素与所述标识信息不同。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的基于栈的异常检测设备中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”或“包括“不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明实施例公开了A1、一种基于栈的异常检测方法,包括:
生成标识信息;
在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;
检测所述栈顶元素与所述标识信息是否相同;以及
当所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
A2、如A1所述的方法,还包括:
当所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
A3、如A1所述的方法,还包括:
生成所述栈出现异常的提示信息;
或者,
使用调试接口输出异常信息。
A4、如A1所述的方法,所述生成标识信息的步骤包括:
在第一时间针对标识对象生成第一信息;
将所述第一信息写入特征变量中;
在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间不同;
将所述第二信息写入全局变量中;以及
根据所述特征变量和所述全局变量生成所述标识信息。
A5、如A4所述的方法,所述根据所述特征变量和所述全局变量生成所述标识信息的步骤进一步包括:
将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
将所述结果写入全局变量中,获得标识信息。
A6、如A1或A2或A3或A4或A5所述的方法,所述第二业务对象调用在栈中一个或多个参数的操作包括:
读取在栈中的所述一个或多个参数;以及
进行堆栈平衡处理。
A7、如A1或A2或A3或A4或A5所述的方法,所述提取当前位于栈顶的栈顶元素的步骤包括:
对当前位于栈顶的栈顶元素进行出栈操作;以及
将出栈之后的栈顶元素写入局部变量。
A8、如A7所述的方法,所述标识信息存储在全局变量中,以及所述检测所述栈顶元素与所述标识信息是否相同的步骤包括:
判断所述局部变量与所述全局变量是否相同;以及
若是,则判断所述栈顶元素与所述标识信息相同,否则,则判断所述栈顶元素与所述标识信息不同。
本发明实施例还公开了B9、一种基于栈的异常检测装置,包括:
第一生成模块,适于生成标识信息;
压入模块,适于在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
提取模块,适于当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;
检测模块,适于检测所述栈顶元素与所述标识信息是否相同;以及
异常判断模块,适于在所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
B10、如B9所述的装置,还包括:
正常判断模块,适于在所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
B11、如B9所述的装置,还包括:
第二生成模块,适于生成所述栈出现异常的提示信息;
或者,
输出模块,适于使用调试接口输出异常信息。
B12、如B9所述的装置,所述第一生成模块还适于:
在第一时间针对标识对象生成第一信息;
将所述第一信息写入特征变量中;
在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间不同;
将所述第二信息写入全局变量中;以及
根据所述特征变量和所述全局变量生成所述标识信息。
B13、如B12所述的装置,所述第一生成模块还适于:
将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
将所述结果写入全局变量中,以获得标识信息。
B14、如B9或B10或B11或B12或B13所述的装置,在所述第二业务对象调用在栈中一个或多个参数的过程中,所述第二业务对象适于:
读取在栈中的所述一个或多个参数;以及
进行堆栈平衡处理。
B15、如B9或B10或B11或B12或B13所述的装置,所述提取模块还适于:
对当前位于栈顶的栈顶元素进行出栈操作;以及
将出栈之后的栈顶元素写入局部变量。
B16、如B15所述的装置,所述标识信息存储在全局变量中,以及所述检测模块还适于:
判断所述局部变量与所述全局变量是否相同;以及
若是,则判断所述栈顶元素与所述标识信息相同,否则,则判断所述栈顶元素与所述标识信息不同。

Claims (10)

1.一种基于栈的异常检测方法,包括:
生成标识信息;
在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;
检测所述栈顶元素与所述标识信息是否相同;以及
当所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
2.如权利要求1所述的方法,其特征在于,还包括:
当所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
3.如权利要求1所述的方法,其特征在于,还包括:
生成所述栈出现异常的提示信息;
或者,
使用调试接口输出异常信息。
4.如权利要求1所述的方法,其特征在于,所述生成标识信息的步骤包括:
在第一时间针对标识对象生成第一信息;
将所述第一信息写入特征变量中;
在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间不同;
将所述第二信息写入全局变量中;以及
根据所述特征变量和所述全局变量生成所述标识信息。
5.如权利要求4所述的方法,其特征在于,所述根据所述特征变量和所述全局变量生成所述标识信息的步骤进一步包括:
将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
将所述结果写入全局变量中,以获得标识信息。
6.如权利要求1或2或3或4或5所述的方法,其特征在于,所述第二业务对象调用在栈中一个或多个参数的操作进一步包括:
读取在栈中的所述一个或多个参数;以及
进行堆栈平衡处理。
7.如权利要求1或2或3或4或5所述的方法,其特征在于,所述提取当前位于栈顶的栈顶元素的步骤进一步包括:
对当前位于栈顶的栈顶元素进行出栈操作;以及
将出栈之后的栈顶元素写入局部变量。
8.如权利要求7所述的方法,其特征在于,所述标识信息存储在全局变量中,以及所述检测所述栈顶元素与所述标识信息是否相同的步骤进一步包括:
判断所述局部变量与所述全局变量是否相同;以及
若是,则判断所述栈顶元素与所述标识信息相同,否则,则判断所述栈顶元素与所述标识信息不同。
9.一种基于栈的异常检测装置,包括:
第一生成模块,适于生成标识信息;
压入模块,适于在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
提取模块,适于当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素;
检测模块,适于检测所述栈顶元素与所述标识信息是否相同;以及
异常判断模块,适于在所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
10.如权利要求9所述的装置,其特征在于,还包括:
正常判断模块,适于在所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
CN201410797374.0A 2014-12-18 2014-12-18 一种基于栈的异常检测方法和装置 Active CN104536810B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201410797374.0A CN104536810B (zh) 2014-12-18 2014-12-18 一种基于栈的异常检测方法和装置
PCT/CN2015/095453 WO2016095672A1 (zh) 2014-12-18 2015-11-24 一种基于栈的异常检测方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410797374.0A CN104536810B (zh) 2014-12-18 2014-12-18 一种基于栈的异常检测方法和装置

Publications (2)

Publication Number Publication Date
CN104536810A true CN104536810A (zh) 2015-04-22
CN104536810B CN104536810B (zh) 2018-05-11

Family

ID=52852342

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410797374.0A Active CN104536810B (zh) 2014-12-18 2014-12-18 一种基于栈的异常检测方法和装置

Country Status (2)

Country Link
CN (1) CN104536810B (zh)
WO (1) WO2016095672A1 (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105700851A (zh) * 2016-01-08 2016-06-22 大唐微电子技术有限公司 一种实现压栈和弹栈的方法和装置
WO2016095672A1 (zh) * 2014-12-18 2016-06-23 北京奇虎科技有限公司 一种基于栈的异常检测方法和装置
WO2017215439A1 (zh) * 2016-06-16 2017-12-21 中兴通讯股份有限公司 一种变量信息提取方法、装置及计算机存储介质
CN110007955A (zh) * 2019-03-08 2019-07-12 浙江大学 一种指令集模拟器译码模块代码的压缩方法
CN110442504A (zh) * 2019-08-02 2019-11-12 中国工商银行股份有限公司 基于调用栈分析的性能测试方法和装置

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110555053B (zh) * 2018-06-01 2023-01-17 百度在线网络技术(北京)有限公司 用于输出信息的方法和装置
CN111597093B (zh) * 2019-02-20 2024-04-16 阿里巴巴集团控股有限公司 一种异常处理方法、装置及其设备
CN111443902B (zh) * 2020-03-20 2023-09-08 杭州有赞科技有限公司 函数调用树生成方法、系统、计算机设备及可读存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101241464A (zh) * 2007-02-05 2008-08-13 中兴通讯股份有限公司 一种检测堆栈帧破坏的方法
CN101290596A (zh) * 2008-05-23 2008-10-22 中兴通讯股份有限公司 一种任务堆栈溢出的实时检测方法及装置
US7979685B1 (en) * 2007-11-27 2011-07-12 Oracle America, Inc. Multiple instruction execution mode resource-constrained device
CN102629231A (zh) * 2012-04-24 2012-08-08 迈普通信技术股份有限公司 一种检测任务堆栈的方法
CN102681866A (zh) * 2011-11-22 2012-09-19 飞天诚信科技股份有限公司 一种运行Java程序的方法和装置

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7181733B2 (en) * 2003-01-16 2007-02-20 Sun Microsystems, Inc. Method and apparatus for detecting an overflow condition in a kernel stack during operating system development
CN101183331B (zh) * 2007-12-12 2010-12-08 上海华为技术有限公司 一种任务栈溢出检测方法、装置及计算机系统
CN104536810B (zh) * 2014-12-18 2018-05-11 北京奇虎科技有限公司 一种基于栈的异常检测方法和装置

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101241464A (zh) * 2007-02-05 2008-08-13 中兴通讯股份有限公司 一种检测堆栈帧破坏的方法
US7979685B1 (en) * 2007-11-27 2011-07-12 Oracle America, Inc. Multiple instruction execution mode resource-constrained device
CN101290596A (zh) * 2008-05-23 2008-10-22 中兴通讯股份有限公司 一种任务堆栈溢出的实时检测方法及装置
CN102681866A (zh) * 2011-11-22 2012-09-19 飞天诚信科技股份有限公司 一种运行Java程序的方法和装置
CN102629231A (zh) * 2012-04-24 2012-08-08 迈普通信技术股份有限公司 一种检测任务堆栈的方法

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2016095672A1 (zh) * 2014-12-18 2016-06-23 北京奇虎科技有限公司 一种基于栈的异常检测方法和装置
CN105700851A (zh) * 2016-01-08 2016-06-22 大唐微电子技术有限公司 一种实现压栈和弹栈的方法和装置
CN105700851B (zh) * 2016-01-08 2018-06-01 大唐微电子技术有限公司 一种实现压栈和弹栈的方法和装置
WO2017215439A1 (zh) * 2016-06-16 2017-12-21 中兴通讯股份有限公司 一种变量信息提取方法、装置及计算机存储介质
CN110007955A (zh) * 2019-03-08 2019-07-12 浙江大学 一种指令集模拟器译码模块代码的压缩方法
CN110442504A (zh) * 2019-08-02 2019-11-12 中国工商银行股份有限公司 基于调用栈分析的性能测试方法和装置

Also Published As

Publication number Publication date
CN104536810B (zh) 2018-05-11
WO2016095672A1 (zh) 2016-06-23

Similar Documents

Publication Publication Date Title
CN104536810A (zh) 一种基于栈的异常检测方法和装置
US10235141B2 (en) Method and system for providing source code suggestion to a user in real-time
JP6198939B2 (ja) ドライバをロードする方法及び組み込みデバイス
KR101699981B1 (ko) 외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화
CN107992307B (zh) 一种函数编译方法及装置
CN111090433B (zh) 一种数据处理的方法、装置和存储介质
US20110314459A1 (en) Compiler with user-defined type inference rules
CN110825386B (zh) 代码的编译方法和装置、存储介质
US20150286355A1 (en) Crawling for extracting a model of a gui-based application
CN111615688A (zh) 一种断言验证代码绑定方法及装置
US11347500B2 (en) Software code converter for resolving conflicts during code development
CN111104158A (zh) 一种软件打包的方法、装置、计算机设备及存储介质
CN116166236A (zh) 代码推荐方法、装置、计算机设备及存储介质
CN114144764A (zh) 使用影子栈的栈跟踪
US20180196669A1 (en) Reduced save and restore instructions for call-clobbered registers
CN104376126A (zh) 在Linux驱动中绑定内核符号的方法及装置
US11782685B2 (en) Software code vectorization converter
US20200175029A1 (en) Method and system for optimizing validations carried out for input data at a data warehouse
US8566813B2 (en) Method and system generating execution file system device
CN102945342B (zh) 进程识别方法、装置和终端设备
CN102930200B (zh) 进程识别方法、装置和终端设备
CN114020278B (zh) 数据处理方法、装置、设备及存储介质
CN113031956A (zh) 程序编译方法和装置以及程序运行方法和装置
US10671397B2 (en) Reduced save and restore instructions for call-clobbered registers
CN110908896A (zh) 一种基于决策树的测试方法及装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20220714

Address after: Room 801, 8th floor, No. 104, floors 1-19, building 2, yard 6, Jiuxianqiao Road, Chaoyang District, Beijing 100015

Patentee after: BEIJING QIHOO TECHNOLOGY Co.,Ltd.

Address before: 100088 room 112, block D, 28 new street, new street, Xicheng District, Beijing (Desheng Park)

Patentee before: BEIJING QIHOO TECHNOLOGY Co.,Ltd.

Patentee before: Qizhi software (Beijing) Co.,Ltd.