一种实现压栈和弹栈的方法和装置的制造方法

文档序号:9921833阅读:534来源:国知局
一种实现压栈和弹栈的方法和装置的制造方法
【技术领域】
[0001 ]本发明涉及堆栈技术,尤指一种实现压栈和弹栈的方法和装置。
【背景技术】
[0002]堆栈是一种将数据按序排列的数据结构,主要用于存放函数的参数值、或局部变量的值等。数据通过压栈操作存储数据,通过弹栈操作读取数据,保证数据的先进后出原则。
[0003]现有的实现压桟和弹桟的方法大致包括:接收到压桟指令pushReference时,将压桟指令push Reference中的对象引用按序写入到桟中,接收到弹桟指令pop Reference时,按照先进后出的原则从栈中读取对象引用。
[0004]接收到压桟指令push short(或压桟指令push int)时,将压桟指令push short中的数据按序写入到桟中,接收到弹桟指令pop short(或弹桟指令pop int)时,按照先进后出的原则从栈中读取数据。
[0005]push short和pop short一般成对使用,push Reference和pop Reference一般成对使用,在JAVA虚拟机中存在_bspush、_sspush等命令可以通过简单的处理直接调用pushshort进行压桟,而push Reference和pop Reference为内部指令,一般在系统进行对象传递或对象创建等过程中由系统内部使用。
[0006]现有的实现压桟和弹桟的方法中,由于push short和push Reference在进行压桟和弹桟的过程相同,因此,攻击者往往使用push short代替push Reference来压入某一个对象引用,从而对对象引用对应的对象的内容进行操作,容易造成系统数据的泄露,安全性较低。

【发明内容】

[0007]为了解决上述问题,本发明提出了一种实现压栈和弹栈的方法和装置,能够提高安全性。
[0008]为了达到上述目的,本发明提出了一种实现压栈和弹栈的方法,包括:
[0009]接收到压桟指令push Reference时,根据压桟指令push Reference中的第一对象引用计算第一校验值,对第一校验值和第一对象引用进行合并,将合并后的数据按序写入到栈中;
[00?0]接收到弹桟指令pop Reference时,按照先进后出的原则从桟中读取数据,获取读取的数据中的第二校验值和第二对象引用,根据获得的第二对象引用计算第三校验值,判断出计算得到的第三校验值和获得的第二校验值相同,返回获得的第二对象引用。
[0011 ]优选地,当判断出所述第三校验值和所述第二校验值不相同时,该方法还包括:抛出异常。
[0012]优选地,当接收到压桟指令push short或push int时,该方法还包括:
[0013I将接收到的压桟指令push short或push int中的数据按序写入到所述桟中。[OOM]优选地,所述根据压桟指令push Reference中的第一对象引用计算第一校验值包括:
[0015]将所述第一对象引用进行按位取反得到所述第一校验值;
[0016]所述根据获得的第二对象引用计算第三校验值包括:
[0017]将所述第二对象引用进行按位取反得到所述第三校验值。
[0018]优选地,所述根据压桟指令pushReference中的第一对象引用计算第一校验值包括:
[0019]将所述第一对象引用按位与预设值进行预设操作得到所述第一校验值;
[0020]所述根据获得的第二对象引用计算第三校验值包括:
[0021]将所述第二对象引用按位与预设值进行预设操作得到所述第三校验值。
[0022]优选地,
[0023]所述对第一校验值和第一对象引用进行合并包括:将所述第一校验值置于所述第一对象引用之前或之后;
[0024]所述获取读取的数据中的第二校验值和第二对象引用包括:
[0025]获取所述读取的数据的前M位得到所述第二校验值,获取所述读取的数据的后N位得到所述第二对象引用;或者,
[0026]获取所述读取的数据的后M位得到所述第二校验值,获取所述读取的数据的前N位得到所述第二对象引用;
[0027]其中,M为所述第二校验值的位数,N为所述第二对象引用的位数。
[0028]本发明还提出了一种实现压栈和弹栈的装置,至少包括:
[0029]接收模块,用于接收到压桟指令pushReference时,向处理模块发送压桟指令push Reference;接收到弹桟指令pop Reference时,向处理模块发送通知消息;
[0030]处理模块,用于接收到压桟指令push Reference,根据压桟指令push Reference中的第一对象引用计算第一校验值,对第一校验值和第一对象引用进行合并,将合并后的数据按序写入到栈中;接收到通知消息,按照先进后出的原则从栈中读取数据,获取读取的数据中的第二校验值和第二对象引用,根据获得的第二对象引用计算第三校验值,判断出计算得到的第三校验值和获得的第二校验值相同,返回获得的第二对象引用。
[0031]优选地,所述处理模块还用于:
[0032]判断出所述第三校验值和所述第二校验值不相同,抛出异常。
[0033]优选地,所述接收模块还用于:
[0034]当接收到压桟指令push short或push int时,向所述处理模块发送压桟指令pushshort或push int;
[0035]所述处理模块还用于:
[0036]接收到所述压桟指令push short或push int,将所述压桟指令push short或pushint中的数据按序写入到所述栈中。
[0037]优选地,所述处理模块具体用于:
[0038]接收到所述压桟指令pushReference,将所述第一对象引用进行按位取反得到所述第一校验值,对所述第一校验值和所述第一对象引用进行合并,将所述合并后的数据按序写入到栈中;接收到所述通知消息,按照先进后出的原则从所述栈中读取数据,获取所述读取的数据中的第二校验值和第二对象引用,将所述第二对象引用进行按位取反得到所述第三校验值,判断出计算得到的第三校验值和获得的第二校验值相同,返回获得的第二对象引用。
[0039]优选地,所述处理模块具体用于:
[°04°]接收到所述压桟指令push Reference,将所述第一对象引用按位与预设值进行预设操作得到所述第一校验值,对所述第一校验值和所述第一对象引用进行合并,将所述合并后的数据按序写入到栈中;接收到所述通知消息,按照先进后出的原则从所述栈中读取数据,获取所述读取的数据中的第二校验值和第二对象引用,将所述第二对象引用按位与预设值进行预设操作得到所述第三校验值,判断出计算得到的第三校验值和获得的第二校验值相同,返回获得的第二对象引用。
[0041 ]优选地,所述处理模块具体用于:
[0042]接收到所述压桟指令push Reference,根据所述压桟指令push Reference中的第一对象引用计算所述第一校验值,将所述第一校验值置于所述第一对象引用之前或之后,将所述合并后的数据按序写入到栈中;接收到所述通知消息,按照先进后出的原则从所述栈中读取数据;
[0043]获取所述读取的数据的前M位得到所述第二校验值,获取所述读取的数据的后N位得到所述第二对象引用;或者,获取所述读取的数据的后M位得到所述第二校验值,获取所述读取的数据的前
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1