一種實現(xiàn)壓棧和彈棧的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001 ]本發(fā)明涉及堆棧技術(shù),尤指一種實現(xiàn)壓棧和彈棧的方法和裝置。
【背景技術(shù)】
[0002]堆棧是一種將數(shù)據(jù)按序排列的數(shù)據(jù)結(jié)構(gòu),主要用于存放函數(shù)的參數(shù)值、或局部變量的值等。數(shù)據(jù)通過壓棧操作存儲數(shù)據(jù),通過彈棧操作讀取數(shù)據(jù),保證數(shù)據(jù)的先進后出原則。
[0003]現(xiàn)有的實現(xiàn)壓桟和彈桟的方法大致包括:接收到壓桟指令pushReference時,將壓桟指令push Reference中的對象引用按序?qū)懭氲綏C中,接收到彈桟指令pop Reference時,按照先進后出的原則從棧中讀取對象引用。
[0004]接收到壓桟指令push short(或壓桟指令push int)時,將壓桟指令push short中的數(shù)據(jù)按序?qū)懭氲綏C中,接收到彈桟指令pop short(或彈桟指令pop int)時,按照先進后出的原則從棧中讀取數(shù)據(jù)。
[0005]push short和pop short一般成對使用,push Reference和pop Reference一般成對使用,在JAVA虛擬機中存在_bspush、_sspush等命令可以通過簡單的處理直接調(diào)用pushshort進行壓桟,而push Reference和pop Reference為內(nèi)部指令,一般在系統(tǒng)進行對象傳遞或?qū)ο髣?chuàng)建等過程中由系統(tǒng)內(nèi)部使用。
[0006]現(xiàn)有的實現(xiàn)壓桟和彈桟的方法中,由于push short和push Reference在進行壓桟和彈桟的過程相同,因此,攻擊者往往使用push short代替push Reference來壓入某一個對象引用,從而對對象引用對應(yīng)的對象的內(nèi)容進行操作,容易造成系統(tǒng)數(shù)據(jù)的泄露,安全性較低。
【發(fā)明內(nèi)容】
[0007]為了解決上述問題,本發(fā)明提出了一種實現(xiàn)壓棧和彈棧的方法和裝置,能夠提高安全性。
[0008]為了達到上述目的,本發(fā)明提出了一種實現(xiàn)壓棧和彈棧的方法,包括:
[0009]接收到壓桟指令push Reference時,根據(jù)壓桟指令push Reference中的第一對象引用計算第一校驗值,對第一校驗值和第一對象引用進行合并,將合并后的數(shù)據(jù)按序?qū)懭氲綏V校?br>[00?0]接收到彈桟指令pop Reference時,按照先進后出的原則從桟中讀取數(shù)據(jù),獲取讀取的數(shù)據(jù)中的第二校驗值和第二對象引用,根據(jù)獲得的第二對象引用計算第三校驗值,判斷出計算得到的第三校驗值和獲得的第二校驗值相同,返回獲得的第二對象引用。
[0011 ]優(yōu)選地,當判斷出所述第三校驗值和所述第二校驗值不相同時,該方法還包括:拋出異常。
[0012]優(yōu)選地,當接收到壓桟指令push short或push int時,該方法還包括:
[0013I將接收到的壓桟指令push short或push int中的數(shù)據(jù)按序?qū)懭氲剿鰲C中。[OOM]優(yōu)選地,所述根據(jù)壓桟指令push Reference中的第一對象引用計算第一校驗值包括:
[0015]將所述第一對象引用進行按位取反得到所述第一校驗值;
[0016]所述根據(jù)獲得的第二對象引用計算第三校驗值包括:
[0017]將所述第二對象引用進行按位取反得到所述第三校驗值。
[0018]優(yōu)選地,所述根據(jù)壓桟指令pushReference中的第一對象引用計算第一校驗值包括:
[0019]將所述第一對象引用按位與預設(shè)值進行預設(shè)操作得到所述第一校驗值;
[0020]所述根據(jù)獲得的第二對象引用計算第三校驗值包括:
[0021]將所述第二對象引用按位與預設(shè)值進行預設(shè)操作得到所述第三校驗值。
[0022]優(yōu)選地,
[0023]所述對第一校驗值和第一對象引用進行合并包括:將所述第一校驗值置于所述第一對象引用之前或之后;
[0024]所述獲取讀取的數(shù)據(jù)中的第二校驗值和第二對象引用包括:
[0025]獲取所述讀取的數(shù)據(jù)的前M位得到所述第二校驗值,獲取所述讀取的數(shù)據(jù)的后N位得到所述第二對象引用;或者,
[0026]獲取所述讀取的數(shù)據(jù)的后M位得到所述第二校驗值,獲取所述讀取的數(shù)據(jù)的前N位得到所述第二對象引用;
[0027]其中,M為所述第二校驗值的位數(shù),N為所述第二對象引用的位數(shù)。
[0028]本發(fā)明還提出了一種實現(xiàn)壓棧和彈棧的裝置,至少包括:
[0029]接收模塊,用于接收到壓桟指令pushReference時,向處理模塊發(fā)送壓桟指令push Reference;接收到彈桟指令pop Reference時,向處理模塊發(fā)送通知消息;
[0030]處理模塊,用于接收到壓桟指令push Reference,根據(jù)壓桟指令push Reference中的第一對象引用計算第一校驗值,對第一校驗值和第一對象引用進行合并,將合并后的數(shù)據(jù)按序?qū)懭氲綏V?;接收到通知消息,按照先進后出的原則從棧中讀取數(shù)據(jù),獲取讀取的數(shù)據(jù)中的第二校驗值和第二對象引用,根據(jù)獲得的第二對象引用計算第三校驗值,判斷出計算得到的第三校驗值和獲得的第二校驗值相同,返回獲得的第二對象引用。
[0031]優(yōu)選地,所述處理模塊還用于:
[0032]判斷出所述第三校驗值和所述第二校驗值不相同,拋出異常。
[0033]優(yōu)選地,所述接收模塊還用于:
[0034]當接收到壓桟指令push short或push int時,向所述處理模塊發(fā)送壓桟指令pushshort或push int;
[0035]所述處理模塊還用于:
[0036]接收到所述壓桟指令push short或push int,將所述壓桟指令push short或pushint中的數(shù)據(jù)按序?qū)懭氲剿鰲V小?br>[0037]優(yōu)選地,所述處理模塊具體用于:
[0038]接收到所述壓桟指令pushReference,將所述第一對象引用進行按位取反得到所述第一校驗值,對所述第一校驗值和所述第一對象引用進行合并,將所述合并后的數(shù)據(jù)按序?qū)懭氲綏V?;接收到所述通知消息,按照先進后出的原則從所述棧中讀取數(shù)據(jù),獲取所述讀取的數(shù)據(jù)中的第二校驗值和第二對象引用,將所述第二對象引用進行按位取反得到所述第三校驗值,判斷出計算得到的第三校驗值和獲得的第二校驗值相同,返回獲得的第二對象引用。
[0039]優(yōu)選地,所述處理模塊具體用于:
[°04°]接收到所述壓桟指令push Reference,將所述第一對象引用按位與預設(shè)值進行預設(shè)操作得到所述第一校驗值,對所述第一校驗值和所述第一對象引用進行合并,將所述合并后的數(shù)據(jù)按序?qū)懭氲綏V?;接收到所述通知消息,按照先進后出的原則從所述棧中讀取數(shù)據(jù),獲取所述讀取的數(shù)據(jù)中的第二校驗值和第二對象引用,將所述第二對象引用按位與預設(shè)值進行預設(shè)操作得到所述第三校驗值,判斷出計算得到的第三校驗值和獲得的第二校驗值相同,返回獲得的第二對象引用。
[0041 ]優(yōu)選地,所述處理模塊具體用于:
[0042]接收到所述壓桟指令push Reference,根據(jù)所述壓桟指令push Reference中的第一對象引用計算所述第一校驗值,將所述第一校驗值置于所述第一對象引用之前或之后,將所述合并后的數(shù)據(jù)按序?qū)懭氲綏V?;接收到所述通知消息,按照先進后出的原則從所述棧中讀取數(shù)據(jù);
[0043]獲取所述讀取的數(shù)據(jù)的前M位得到所述第二校驗值,獲取所述讀取的數(shù)據(jù)的后N位得到所述第二對象引用;或者,獲取所述讀取的數(shù)據(jù)的后M位得到所述第二校驗值,獲取所述讀取的數(shù)據(jù)的前