两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

由虛擬機(jī)執(zhí)行的中間編程代碼的安全化的方法、計(jì)算機(jī)程序和裝置的制作方法

文檔序號:6445253閱讀:178來源:國知局
專利名稱:由虛擬機(jī)執(zhí)行的中間編程代碼的安全化的方法、計(jì)算機(jī)程序和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及以中間編程語言編碼的軟件應(yīng)用的執(zhí)行,更特別地,本發(fā)明涉及用于由虛擬機(jī)執(zhí)行的中間編程代碼的安全化的方法、計(jì)算機(jī)程序和裝置。
背景技術(shù)
由于可用來執(zhí)行軟件應(yīng)用的不同的硬件配置,因而經(jīng)常使用ー種稱為中間編程語言的特別的編程語言。它允許開發(fā)者獨(dú)立于應(yīng)在其上執(zhí)行應(yīng)用的硬件體系結(jié)構(gòu),借助高級編程語言來編寫這些應(yīng)用。對由開發(fā)者生成的符合這些高級語言的文件進(jìn)行編譯(獨(dú)立于特定的硬件平臺),以產(chǎn)生基于中間編程語言的應(yīng)用文件。因而,以虛擬機(jī)的名稱已知的專用于特定硬件平臺的特定軟件層,允許基于使用中間編程語言的應(yīng)用文件執(zhí)行這些應(yīng)用。 舉例來說,ー個(gè)用Java (Java是商標(biāo))編程語言編寫的應(yīng)用可被編譯成Java偽代碼(英文術(shù)語稱為bytecode (字節(jié)碼)),也就是以ー種由Java虛擬機(jī)在具有不同硬件特征的平臺上可執(zhí)行的中間編程語言編譯。Java虛擬機(jī)對于每個(gè)硬件平臺是特定的,而使用中間編程語言的應(yīng)用的代碼對于這些不同的平臺是共同的。但存在適于執(zhí)行應(yīng)用的硬件平臺類型的多種類型的虛擬機(jī),而虛擬機(jī)應(yīng)該符合給定的規(guī)格以允許執(zhí)行用中間編程語言編碼的應(yīng)用程序。一般地,這些虛擬機(jī)以其較完全或較不完全的指令集區(qū)分。因此,例如,存在ー些以Java Card的名稱已知的用于諸如微電路卡的硬件平臺的特殊的Java虛擬機(jī)。圖I示意地說明用于生成可在微電路卡用的虛擬機(jī)上執(zhí)行的文件的方法100的步驟。這里針指的應(yīng)用是ー種Java類型應(yīng)用。如圖所示,用Java語言編寫的、也就是以高級語言編寫的源文件105在編譯器110中編譯,以便產(chǎn)生以名稱Class類型文件已知的中間編程語言文件115。這些文件符合虛擬機(jī)標(biāo)準(zhǔn)。因而這些文件115在轉(zhuǎn)換器120中進(jìn)行轉(zhuǎn)換,以使這些文件符合特定的虛擬機(jī)、這里是Java Card。標(biāo)號125的轉(zhuǎn)換文件在這里是Cap類型。由轉(zhuǎn)換器120進(jìn)行的轉(zhuǎn)換旨在簡化中間編程語言的指令,以便文件115可以由簡化的虛擬機(jī)執(zhí)行。這樣的轉(zhuǎn)換尤其旨在消除某些類型的變量,特別是b00l6en (布爾)類型的變量。換句話說,Java格式的源代碼指令文件這里借助Java編譯器被編譯為Class格式的偽指令文件。這些Class文件是可由許多Java虛擬機(jī)執(zhí)行的,但不能由沒有包含整套Java指令集的Java Card虛擬機(jī)執(zhí)行。因此,這些Class文件利用Java Card轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換,以便獲得可由Java Card虛擬機(jī)執(zhí)行的Cap格式文件。為執(zhí)行轉(zhuǎn)換或未轉(zhuǎn)換的中間編程語言編寫的應(yīng)用,虛擬機(jī)配備專門的指令集和執(zhí)行堆棧。但是,盡管虛擬機(jī)對應(yīng)用的執(zhí)行具有一定安全級別,但由虛擬機(jī)、特別是Java Card執(zhí)行的Java應(yīng)用易受攻擊,特別是錯(cuò)誤注入攻擊。這種類型的攻擊在于當(dāng)執(zhí)行應(yīng)用時(shí)注入錯(cuò)誤以改變計(jì)算所涉及的值或迫使執(zhí)行該應(yīng)用的某些例行程序或分支指令。
為防備這種類型的攻擊,某些應(yīng)用的代碼是冗余的以在其執(zhí)行過程中進(jìn)行檢查。盡管這樣的解決方案可以提高應(yīng)用執(zhí)行的安全性,但是它要求大量的資源。為彌補(bǔ)這個(gè)缺點(diǎn),專利申請US 2009/0165149提出一種在設(shè)有用于解釋中間代碼的執(zhí)行虛擬機(jī)的便攜式數(shù)字設(shè)備上執(zhí)行以中間編程代碼編譯的應(yīng)用的方法,其包括安全執(zhí)行模式的應(yīng)用步驟,在該模式中通過虛擬機(jī)對中間代碼的解釋包括下列步驟-對于被操作以執(zhí)行代碼定義的邏輯和/或算木運(yùn)算的每個(gè)代碼數(shù)據(jù),通過預(yù)定函數(shù)生成與所述代碼數(shù)據(jù)相關(guān)的檢查數(shù)據(jù);和-與所述運(yùn)算的執(zhí)行相并行地執(zhí)行檢查操作,所述檢查操作通過所述預(yù)定函數(shù)與代碼定義的所述運(yùn)算相關(guān)并且作用于所述檢查數(shù)據(jù)。但是,這樣的解決方案需要對所用的虛擬機(jī)作出重大改變。

發(fā)明內(nèi)容

本發(fā)明允許解決至少ー個(gè)前述問題。因此,本發(fā)明g在提出一種用于計(jì)算機(jī)的由虛擬機(jī)執(zhí)行的中間編程代碼的安全化的方法,該方法包括下列步驟-從所述中間編程代碼接收多個(gè)偽指令;-轉(zhuǎn)換所述多個(gè)偽指令,所述轉(zhuǎn)換包括插入至少ー個(gè)偽指令的插入步驟,所述至少ー個(gè)偽指令與所述多個(gè)偽指令中的至少ー個(gè)偽指令的執(zhí)行的控制函數(shù)相關(guān);和-生成偽代碼,所生成的所述偽代碼包括被轉(zhuǎn)換的所述多個(gè)偽指令。因此,按照本發(fā)明的方法允許使偽代碼的執(zhí)行安全,而不需要改變相應(yīng)的源代碼。另外,該方法可以在中間編程代碼的轉(zhuǎn)換步驟中實(shí)施,以便其實(shí)現(xiàn)對于用戶是透明的。按照ー個(gè)特別的實(shí)施方式,所述插入步驟包括插入代表用于所述虛擬機(jī)的命令的、例如Java定制組件形式的偽指令的步驟。因此,生成的偽代碼能以安全的方式由適合的虛擬機(jī)執(zhí)行,但也是在標(biāo)準(zhǔn)的虛擬機(jī)中可執(zhí)行的。例如,用于所述虛擬機(jī)的所述命令旨在檢驗(yàn)所述虛擬機(jī)的執(zhí)行堆棧,以便驗(yàn)證所述虛擬機(jī)的所述執(zhí)行堆棧是空的。通過檢驗(yàn)該執(zhí)行堆棧的狀態(tài),可以驗(yàn)證ー個(gè)或多個(gè)功能已被良好執(zhí)行。仍按照ー個(gè)特定的實(shí)施方式,所述轉(zhuǎn)換步驟對于每個(gè)所接收的偽指令包括下列步驟-若所述偽指令針對至少ー第一預(yù)定值的預(yù)定處理,則刪除所述偽指令并插入針對用于至少ー第二預(yù)定值的所述預(yù)定處理的偽指令,所述至少一第二預(yù)定值不同于所述至少ー第一預(yù)定值;和-若所述偽指令針對所述至少一第一預(yù)定值與另ー值的比較,則刪除所述偽指令并插入針對所述至少一第二預(yù)定值與所述另ー值比較的偽指令。于是,按照本發(fā)明的方法允許用ー些較難理解的任意值改變預(yù)定值、特別是可容易被識別的布爾值。仍按照ー個(gè)特定的實(shí)施方式,針對至少ー第一預(yù)定值的預(yù)定處理的所述偽指令旨在對局部變量進(jìn)行初始化或賦值,所述局部變量的值在初始化或賦值步驟執(zhí)行之后等于所
述第一預(yù)定值。該方法優(yōu)選還包括定義或計(jì)算所述至少一第二預(yù)定值的步驟。
該方法有利地還包括分析所述多個(gè)偽指令的至少ー組的分析步驟,作為對所述分析步驟的響應(yīng)而進(jìn)行刪除針對至少ー第一預(yù)定值的預(yù)定處理的所述偽指令的步驟和插入針對用于至少一第二預(yù)定值的所述預(yù)定處理的所述偽指令的步驟。因此,可識別變量類型和可只根據(jù)其類型改變這些變量的處理指令。特別是,可只改變處理布爾類型變量的函數(shù)。按照ー個(gè)特定的實(shí)施方式,所述方法還包括代碼編譯的預(yù)先步驟,所述代碼編譯的預(yù)先步驟的結(jié)果包括所述多個(gè)偽指令。本發(fā)明還g在提出一種計(jì)算機(jī)程序,其包括當(dāng)所述計(jì)算機(jī)程序在計(jì)算機(jī)上執(zhí)行時(shí)適于實(shí)施前述方法的每個(gè)步驟的指令;ー種裝置,其包括適于實(shí)施前述方法的每個(gè)步驟的部件;以及ー種微電路卡,它包括通過上述方法獲得的偽指令。該計(jì)算機(jī)程序、該裝置和該微電路卡帶來的優(yōu)點(diǎn)與上述優(yōu)點(diǎn)相類似。


將從下文參照附圖、以非限制性例子進(jìn)行的詳細(xì)描述中顯示出本發(fā)明的其他的優(yōu)點(diǎn)、目標(biāo)和特征,附圖中-圖I示意性說明用于生成能由微電路卡用的虛擬機(jī)執(zhí)行的文件的方法的步驟;-圖2示意性說明按照本發(fā)明轉(zhuǎn)換出自源代碼編譯的偽指令的算法實(shí)例的步驟;-圖3說明按照本發(fā)明對出自源代碼編譯的偽指令進(jìn)行分析以確定要進(jìn)行的轉(zhuǎn)換的步驟的實(shí)例;和-圖4說明適于實(shí)現(xiàn)本發(fā)明的某些步驟的硬件結(jié)構(gòu)實(shí)例。
具體實(shí)施例方式本發(fā)明一般g在當(dāng)轉(zhuǎn)換時(shí)改變以中間編程語言編寫的應(yīng)用的代碼的至少一部分,以插入允許提高該應(yīng)用的執(zhí)行安全性的至少ー個(gè)偽指令。這樣的插入可以在轉(zhuǎn)換本身期間或者在該轉(zhuǎn)換之前或之后的ー步驟期間實(shí)現(xiàn)。因此,按照本發(fā)明,允許提高應(yīng)用的執(zhí)行安全性的至少ー個(gè)偽指令,可被插入到該應(yīng)用的中間代碼文件(其使用中間編程語言)、例如Class類型文件中。可選地或以補(bǔ)充的方式,允許提高應(yīng)用的執(zhí)行安全性的至少ー個(gè)偽指令可被插入到該應(yīng)用的轉(zhuǎn)換的中間代碼文件例如Cap類型文件中。首先觀察到,可賦予給數(shù)據(jù)或變量的布爾(bool6en)類型在Java源文件中是特別的,因?yàn)殛P(guān)于這種類型的信息在編譯階段期間“遺失”。事實(shí)上,布爾類型的信息在Java文件中等于真或假。但在編譯階段之后,這些值被為零或壹的整數(shù)值代替。因此,例如,Java源程序表達(dá)式“ boolean myBoolean = faux (假)”在它的編譯過程中被表達(dá)式“iconst_0”和下ー表達(dá)式“istore_l”代替,按照表達(dá)式“iconst_0”,零值被放置在虛擬機(jī)的執(zhí)行堆棧上,而下ー表達(dá)式“istorej”用于把虛擬機(jī)執(zhí)行堆棧的上一值存入第一局部變量中。局部變量這里對應(yīng)于非易失存儲器的寄存器的一域(champ)。同樣,Java源程序表達(dá)式“boolean myResult = vrai (真)”在它的編譯過程中被表達(dá)式“ iconst_l ”和下一個(gè)表達(dá)式“ istore_2”代替,根據(jù)表達(dá)式“ iconst_l ”,數(shù)值壹被放置在虛擬機(jī)的執(zhí)行堆棧上,而下ー個(gè)表達(dá)式“ istore_2”用于把虛擬機(jī)執(zhí)行堆棧的上ー值存入另ー局部變量中。因此,變量myBoolean和myResult的布爾特性消失,而替以整數(shù)值零和壹。
Java源文件中的布爾類型典型地用于進(jìn)行條件測試,條件測試一般借助if函數(shù)實(shí)現(xiàn)。在編譯過程中,這些函數(shù)被特定的偽指令或字節(jié)碼代替,特定的偽指令或字節(jié)碼將執(zhí)行堆棧上存在的值與零值進(jìn)行比較。因此,例如,偽指令ifeq將執(zhí)行堆棧上存在的元素與零值進(jìn)行比較和向源自該比較的代碼進(jìn)行跳變(saut)。附錄中給出的表I表示其源代碼是用Java語言編寫的函數(shù)的編譯的簡化實(shí)例。第一列表示該函數(shù)的Java指令,這些指令能編寫在Java源文件中,而第二列表示相應(yīng)的偽指令,也就是對應(yīng)Class類型的文件的內(nèi)容,第三列代表關(guān)于偽指令的索引(index)。如所說明的,第一 Java指令g在把變量myBoolean初始化為假值。該指令的編譯結(jié)果包括偽指令“ icone_0 ”和用以在數(shù)值零被放到執(zhí)行堆棧上之后將其儲存在第一局部變量中的“istore_l”。該第一指令后接著用來把變量myResult初始化為真值的第二指令。又一次,該指令的編譯結(jié)果包括偽指令“iconSt_l”和用于在數(shù)值壹已被放在執(zhí)行堆棧上后將其存入第二局部變量中的“ istore_2”。

這里,這些敘述Java指令后跟隨著一個(gè)在于測試變量myBoolean的Java測試指令。該Java測試指令的編譯結(jié)果引出偽指令“iload_l”和“ifeq9”,它們g在把第一局部變量的值放在執(zhí)行堆棧上,和若該執(zhí)行堆棧的值等于壹則進(jìn)行到具有索引9的偽指令的跳變,也就是說,若測試結(jié)果為假,則跳變至待執(zhí)行的第一偽指令上。如果沒有跳變,下一 Java指令就在于把真值賦予變量myResult。該表達(dá)式的編譯結(jié)果引出偽指令“iconst_l”和用于在數(shù)值壹已被放在執(zhí)行堆棧上之后將其存入第二局部變量中的“ istore_2”。由于當(dāng)前面測試結(jié)果為真時(shí)沒有要執(zhí)行的其他指令,因而下ー步驟在于跳變至具有索引11的偽指令上,也就是說跳變至當(dāng)前面測試結(jié)果為假時(shí)要執(zhí)行的偽指令后的第一指令。當(dāng)前面測試結(jié)果為假吋,如果沒有跳變,下一 Java指令在于把假值賦予變量myResult。該表達(dá)式的編譯結(jié)果引出偽指令“iconSt_0”和用于在零值已放在執(zhí)行堆棧上之后將其存入第二局部變量中的“ istore_2”。因此,如該例中所說明的,對帶真值的布爾類型變量的測試被編譯成對帶零的變量的值的測試。在Java指令的編譯吋,與真值或假值的比較測試消失。因而,可改變Java虛擬機(jī)執(zhí)行堆棧上的值的通過錯(cuò)誤注入的攻擊技木,可被用于改變測試結(jié)果并因此引起全套Java代碼的執(zhí)行或引起本來不應(yīng)被執(zhí)行的某些部分的執(zhí)行。在這里觀察到,如果在上述實(shí)例中對布爾值進(jìn)行測試,則當(dāng)測試針對具有數(shù)值零和壹的整數(shù)時(shí),錯(cuò)誤式攻擊的危險(xiǎn)是等同的。為了使需要對中間編程語言代碼(偽代碼)進(jìn)行轉(zhuǎn)換的虛擬機(jī)所執(zhí)行的Java應(yīng)用中的測試安全化,本發(fā)明按照第一實(shí)施方式包括改變用來進(jìn)行測試的值以便它們不能再被找到和因而不能容易被改變的步驟。換句話說,這里,本發(fā)明g在通過把特殊內(nèi)部值、尤其是不同于零和壹的值賦予給真值和假值、零和壹或者Java源文件的可容易識別的所有其他值,來使布爾類型變量安全化。這個(gè)改變有利地實(shí)施在偽指令的轉(zhuǎn)換步驟過程中,以便充實(shí)虛擬機(jī)例如機(jī)載JavaCard虛擬機(jī)的指令集,本發(fā)明的實(shí)施不需要改變Java源代碼。用來執(zhí)行它們的虛擬機(jī)被改變,以提供如下文所描述的新功能。附錄中給出的表2表示在表I中示出的編譯偽代碼的轉(zhuǎn)換的簡化實(shí)例。第一列表示可出現(xiàn)在Java Class類型文件中的Java偽指令,而第二列表示改變之后的對應(yīng)偽指令,第三列表示關(guān)于這些偽指令的索引。一般地,在此明白的是,該轉(zhuǎn)換g在把有關(guān)整數(shù)類型數(shù)據(jù)的偽指令轉(zhuǎn)換為有關(guān)short (短整數(shù))類型數(shù)據(jù)的偽指令。因此,例如,g在把放在執(zhí)行堆棧上的值以整數(shù)形式存儲到第一局部變量中的偽指令istore_l被偽指令sstore_l代替,偽指令sstore_l旨在把執(zhí)行堆棧上的值以short形式存儲到第一局部變量中。同樣,g在把以整數(shù)形式存儲在第一局部變量中的值放在執(zhí)行堆棧上的偽指令iload_l被偽指令sload_l代替,偽指令sload_l g在把以short形式存儲在第一局部變量中的值放在執(zhí)行堆棧上。自然地,也可以使用其它轉(zhuǎn)換。如表2上說明的,偽指令iconst_0被刪除并插入偽指令sconst_false以代替它。 偽指令sconst_false宮在把第一預(yù)定值放在執(zhí)行堆棧上。該值表示狀態(tài)假,這里這涉及一個(gè)short類型的數(shù)。該值可以是常量和適于所述應(yīng)用,或者該值可以是隨機(jī)值,隨機(jī)值例如在所述應(yīng)用起動時(shí)確定??蛇x擇地,該值可以是適于虛擬機(jī)的常量,或者是隨機(jī)值,隨機(jī)值例如在虛擬機(jī)起動時(shí)確定。同樣,偽指令iconst_l被刪除而為代替它插入偽指令sconst_true。偽指令sconst_true g在把第二預(yù)定值放在執(zhí)行堆棧上。該值表示狀態(tài)真。又一次,在這里這涉及ー個(gè)short類型的數(shù),它可以是適合該應(yīng)用的常量、在例如該應(yīng)用起動時(shí)確定的隨機(jī)值、或是與虛擬機(jī)相關(guān)的值。另外,偽指令ifeq被刪除并插入偽指令ifBeq以代替它。偽指令ifBeqg在把在執(zhí)行堆棧上存在的值與表示狀態(tài)真的第二預(yù)定值進(jìn)行比較。在表2表示的實(shí)例中,如果在執(zhí)行堆棧上的值不等于第二預(yù)定值(代表狀態(tài)真的預(yù)定值),則該測試沒有得到證實(shí)并且要執(zhí)行的下ー偽指令是具有索引9的偽指令。在相反的情況下,跟在比較偽指令后的偽指令被執(zhí)行??蛇x擇地,位于執(zhí)行堆棧上的值可以與布爾狀態(tài)的兩個(gè)值進(jìn)行比較。因此,偽指令ifBeq把存在于執(zhí)行堆棧上的值與代表狀態(tài)真的第二預(yù)定值加以比較。若測試被證實(shí),則要執(zhí)行的下ー偽指令是其索引跟隨在偽指令ifBeq的索引(這里是6)后的偽指令。若測試未被證實(shí),則偽指令ifBeq把執(zhí)行堆棧上存在的值與代表狀態(tài)假的第一預(yù)定值比較。若該測試得到證實(shí),則要執(zhí)行的下ー偽指令是其索引被指定(在這里是9)的偽指令。若測試未被證實(shí),則執(zhí)行異常例行程序。這尤其可以涉及一種對抗手段,其例如在于使微控制器不起作用(例如以已知的方式,通過在非易失存儲器中寫入一個(gè)在以后執(zhí)行時(shí)由控制器驗(yàn)證的值)。偽指令sconst_false和sconst_true對應(yīng)于不同于零和壹的內(nèi)部值。因此,難以為正確地執(zhí)行比較而改變這些值。換句話說,對于通過注入錯(cuò)誤的攻擊,難以改變執(zhí)行堆棧上的變量的值,因?yàn)檫@些值不再是零或壹,而是內(nèi)部值。附錄中示出的表3表示按照參照表2給出的實(shí)例轉(zhuǎn)換偽代碼用的改變表的ー個(gè)實(shí)例。第一列在這里表示由編譯步驟所獲得的偽指令,而第二列包括在改變之后相應(yīng)的偽指令。圖2示意性說明按照本發(fā)明轉(zhuǎn)換出自源代碼編譯的偽指令用的算法實(shí)例的步驟。
第一步驟(步驟200)在此在于接收要轉(zhuǎn)換的偽指令。要轉(zhuǎn)換的偽指令例如來自由Java源文件105的編譯所獲得的文件115。在下ー步驟中,偽指令索引i初始化為零(步驟205)。因此進(jìn)行測試,以確定是否存在與索引i對應(yīng)的偽指令(步驟210)。若存在對應(yīng)于該索引i的偽指令,則進(jìn)行第二測試,以確定是否對應(yīng)該索引i的偽指令是易于使布爾值介入的預(yù)定指令(步驟215)。這樣的偽指令尤其是如下的指令,-iconst_0和sconst_0,它們_在把(分別以整數(shù)和short形式編碼的)數(shù)值零放置在執(zhí)行堆棧上;-iconst_l和sconst_l,它們_在把(分別以整數(shù)和short形式編碼的)數(shù)值壹放置在執(zhí)行堆棧上;和-ifeq,其g在驗(yàn)證是否執(zhí)行堆棧上存在的值對應(yīng)狀態(tài)真或假,也就是說,是否該 值等于壹或不等于壹。在肯定的情況下,測試進(jìn)行,以確定這些布爾狀態(tài)是否已被定義(步驟220)。若這些布爾狀態(tài)未被定義,則將它們定義(步驟225)。這樣的定義可以尤其在于常量的定義,也就是把ー個(gè)預(yù)定值賦予給ー個(gè)具有預(yù)定名稱的常量(例如,false = 35和true = 65)。這樣的定義還可以在于借助標(biāo)準(zhǔn)函數(shù)(例如,false = random(127)和true=random (127),其中random (η)是返回介于O到η之間的隨機(jī)數(shù)的函數(shù))計(jì)算值,尤其是計(jì)算隨機(jī)值。如前面指出的,布爾狀態(tài)可以由所述虛擬機(jī)定義。在這種情況下,步驟220和225不是必需的。在布爾狀態(tài)被定義之后、當(dāng)布爾狀態(tài)已被預(yù)先定義時(shí)或者當(dāng)布爾狀態(tài)由所述虛擬機(jī)確定時(shí),對應(yīng)索引i的偽指令被刪除并插入新的偽指令以代替它(步驟230)。這個(gè)步驟在于例如在轉(zhuǎn)換表中,識別ー偽指令,該偽指令針對的處理類似于對應(yīng)索引i的偽指令所執(zhí)行的處理,其是關(guān)于預(yù)定的布爾狀態(tài)、也就是關(guān)于不同于零和壹的值進(jìn)行的。作為說明,偽指令iconst_0和sconst_0可被刪除,并且可插入偽指令sconst_false以代替它們。如前面指出的,偽指令sconst_false旨在把變量false的值(在這里以short形式編碼)放在執(zhí)行堆棧上。以類似的方式,偽指令iconst_l和sconst_l可以被刪除,并且可插入偽指令sconst_true以代替它們。偽指令sconst_true _在把變量true的值(在這里以short形式編碼)放在執(zhí)行堆棧上。同樣地,偽指令ifeq可以被刪除,并可插入偽指令ifBeq以代替它,偽指令ifBeq g在驗(yàn)證是否執(zhí)行堆棧上存在的值對應(yīng)或不對應(yīng)于狀態(tài)真,也就是說,是否該值等于或不等于變量true的值。若對應(yīng)索引i的偽指令不是使布爾值介入的預(yù)定指令,則該對應(yīng)索引i的偽指令以標(biāo)準(zhǔn)的方式進(jìn)行轉(zhuǎn)換(步驟235),例如借助轉(zhuǎn)換表進(jìn)行轉(zhuǎn)換。在對應(yīng)于索引i的偽指令被轉(zhuǎn)換(步驟230或235)之后,索引i加一(步驟240),算法返回步驟210,在步驟210進(jìn)行測試,以確定是否存在對應(yīng)索引i的待轉(zhuǎn)換的偽指令。若不存在對應(yīng)于索引i的偽指令(步驟210),則所有偽指令已被轉(zhuǎn)換。所得的文件,這里是Cap類型的文件125,可以在包括適當(dāng)虛擬機(jī)、這里也就是Java Card虛擬機(jī)的裝置尤其是微電路卡中使用。如前面指出的,用來執(zhí)行應(yīng)用以實(shí)現(xiàn)本發(fā)明的虛擬機(jī)的指令集已被改變。添加了布爾狀態(tài)比較類型函數(shù),例如,先前描述的ifBeq函數(shù)。這樣的函數(shù)允許把在執(zhí)行堆棧上存在的值與對應(yīng)于布爾狀態(tài)真或假的預(yù)定值進(jìn)行比較。布爾狀態(tài)的值可以由所執(zhí)行的應(yīng)用或由虛擬機(jī)確定。以有利的方式,由虛擬機(jī)在其起動時(shí)將一狀態(tài)賦予給每個(gè)布爾狀態(tài),以避免如果這些狀態(tài)未被所述應(yīng)用定義而發(fā)生錯(cuò)誤。如前面指出的,布爾狀態(tài)的值可以是預(yù)定的常量,或者可以是當(dāng)虛擬機(jī)起動時(shí)由虛擬機(jī)確定的或當(dāng)應(yīng)用被執(zhí)行時(shí)確定的隨機(jī)值。這些狀態(tài)是按照(所述應(yīng)用所使用的)預(yù)定名稱、例如真和假定義的。若布爾狀態(tài)的值是預(yù)定的常量,則其以標(biāo)準(zhǔn)方式表示,否則借助于標(biāo)準(zhǔn)函數(shù)加以計(jì)算。還觀察到的是,按照上述實(shí)施方式,g在把數(shù)值零和壹放在執(zhí)行堆棧上的偽指令被旨在把(對應(yīng)布爾狀態(tài)的)預(yù)定值放在執(zhí)行堆棧上的偽指令代替。這樣的再分配在應(yīng)用執(zhí)行時(shí)可能出現(xiàn)問題,因?yàn)檫@樣的再分配無區(qū)別地針對布爾類型的值和其他類型例如整數(shù)類型的值。因此,例如,計(jì)數(shù)器可被初始化在零值,接著隨著計(jì)算進(jìn)行而增加,以便按照計(jì)數(shù)器的值停止所述計(jì)算。因此,與這樣的計(jì)數(shù)器相關(guān)聯(lián)的變量不應(yīng)被視為布爾類型??梢詫?shí)行多個(gè)解決方案來避免這樣的問題。

按照第一解決方案,改變執(zhí)行偽指令的虛擬機(jī),以檢測不合理的再分配。為此,(通過執(zhí)行應(yīng)用的虛擬機(jī))進(jìn)行測試,以檢測應(yīng)由虛擬機(jī)按照所執(zhí)行的偽指令進(jìn)行的算木運(yùn)算。若這些算術(shù)運(yùn)算的操作數(shù)是預(yù)先初始化為對應(yīng)一布爾狀態(tài)的預(yù)定值的變量,則進(jìn)行測試,以把該操作數(shù)的值與布爾狀態(tài)的值進(jìn)行比較。若該操作數(shù)的值等于一布爾狀態(tài)的值,則該操作數(shù)的值被再初始化,以便取對應(yīng)該布爾狀態(tài)值的數(shù)值零或壹(按照前面的實(shí)例,若該布爾狀態(tài)的值為35,則取零,而若該布爾狀態(tài)的值為65,則取壹)。反之,若該操作數(shù)的值不等于ー個(gè)布爾狀態(tài)的值,則該操作數(shù)的值不被改變。因此,(根據(jù)來自源代碼編譯的偽指令)應(yīng)被初始化為零或壹的所有變量,按照經(jīng)過轉(zhuǎn)換的偽指令,被初始化為對應(yīng)布爾狀態(tài)的預(yù)定值,接著,若涉及用于算術(shù)運(yùn)算的變量,則它們的值被虛擬機(jī)再初始化為零或壹。按照第二解決方案,對出自源代碼編譯的偽指令在其轉(zhuǎn)換時(shí)進(jìn)行分析。因此,對于每個(gè)應(yīng)被初始化為零或壹的變量進(jìn)行指令分析,以確定是否該變量以后被用在至少ー個(gè)算術(shù)運(yùn)算例如増量中,還是被用在邏輯運(yùn)算例如與等于零或壹的確定值的比較中。若該變量被用在一算木運(yùn)算中,則與其初始化相關(guān)的偽指令不被改變。在相反的情況下,若該變量被用在一算木運(yùn)算中,則與其初始化相關(guān)的偽指令被轉(zhuǎn)換,以便把該變量初始化為對應(yīng)于一個(gè)布爾狀態(tài)的預(yù)定值。圖3示出按照本發(fā)明對出自源代碼編譯的偽指令進(jìn)行分析以確定要執(zhí)行的轉(zhuǎn)換的這類分析步驟的ー個(gè)實(shí)例。參照圖3描述的步驟例如是在參照圖2描述的步驟230的過程中實(shí)行的。在這里,第一步驟g在確定對應(yīng)索引i的偽指令是否是針對變量初始化或給變量賦值的指令(步驟300),也就是說,例如,偽指令iconst_x,該偽指令后跟隨用于把值x儲存在變量I中的偽指令istore_y。這個(gè)步驟是在參照圖2描述的步驟220或步驟225之后執(zhí)行的。在肯定的情況下,代表有關(guān)待轉(zhuǎn)換偽指令的索引的變量j被初始化為變量i的值(步驟305)。因此進(jìn)行測試,以確定是否存在對應(yīng)索引j的偽指令(步驟310)。若存在對應(yīng)索引j的偽指令,則進(jìn)行測試,以確定是否該對應(yīng)索引j的偽指令針對ー算木運(yùn)算以及是否該運(yùn)算的操作數(shù)是被對應(yīng)索引i的偽指令初始化或者賦值的變量(步驟315)。在否定的情況下,進(jìn)行測試,以確定是否該對應(yīng)索引j的偽指令針對邏輯運(yùn)算以及是否該運(yùn)算的操作數(shù)是被對應(yīng)索引i的偽指令初始化或賦值的變量(步驟320)。在肯定的情況下,該對應(yīng)索引j的偽指令如上所述按照本發(fā)明進(jìn)行轉(zhuǎn)換(步驟325)。該步驟后跟隨著參照圖2描述的步驟240。若該對應(yīng)索引j的偽指令不針對邏輯運(yùn)算(步驟320),則索引j增ー(步驟330),以及又一次執(zhí)行步驟310,以便如果存在下ー偽指令則處理該下ー偽指令。若該對應(yīng)索引j的偽指令針對算木運(yùn)算,以及如果該運(yùn)算的操作數(shù)是被對應(yīng)索引i的偽指令初始化或賦值的變量(步驟315),或者如果不存在對應(yīng)索引j的偽指令,則該對應(yīng)索引i的偽指令以標(biāo)準(zhǔn)的方式被轉(zhuǎn)換(參照圖2描述的步驟235)。因此,參照圖3描述的步驟允許區(qū)分開用于邏輯運(yùn)算的變量和用于算術(shù)運(yùn)算的變 量,并因而能適應(yīng)偽指令的轉(zhuǎn)換,以便提高應(yīng)用執(zhí)行的安全性而不干擾其運(yùn)行。以類似的方式,如前所述的本發(fā)明可以按照在專利申請W02005/008451中描述的方法來實(shí)施以使應(yīng)用的執(zhí)行安全化。按照該專利申請的教導(dǎo),預(yù)定值被放在執(zhí)行堆棧上。接著,在其執(zhí)行應(yīng)該受到控制的ー組指令執(zhí)行后,將執(zhí)行堆棧上存在的值與預(yù)先放置在執(zhí)行堆棧上的預(yù)定值比較。該比較允許檢測該組指令的執(zhí)行的異常。用來控制指令組執(zhí)行的預(yù)定值有利地根據(jù)本發(fā)明被改變。按照可獨(dú)立實(shí)施或可與前述實(shí)施方式結(jié)合實(shí)施的另ー實(shí)施方式,中間編程語言代碼的偽指令集在其轉(zhuǎn)換時(shí)被改變,以便加入一個(gè)或多個(gè)允許獨(dú)立于初始集的偽指令來控制函數(shù)執(zhí)行的偽指令。這里提到的是,根據(jù)Java Card規(guī)范,可對于解釋這些文件的偽指令的虛擬機(jī)將ー些偽指令添加到Cap類型文件的偽指令中。這些偽指令不是作為對所執(zhí)行應(yīng)用的指令而是作為控制命令由虛擬機(jī)處理。這些偽指令借助于預(yù)定的標(biāo)識符(或者英語術(shù)語tag)被識別并形成稱為定制組件(custom components)的實(shí)體。因此,定制組件的數(shù)據(jù)域(英語術(shù)語中稱為info item)可以用來向虛擬機(jī)傳送旨在控制ー些函數(shù)或ー些函數(shù)組執(zhí)行的偽指令。因此,按照該第二實(shí)施方式,ー些偽指令被加入Cap類型文件的偽指令中,以便控制函數(shù)的執(zhí)行,例如,如專利申請WO 2005/008451中所描述的由括弧系統(tǒng)定義的函數(shù)的執(zhí)行。這些偽指令可以尤其g在驗(yàn)證在函數(shù)執(zhí)行之后執(zhí)行堆棧處在等候狀態(tài)。作為說明,這樣的偽指令能以定制組件的數(shù)據(jù)域中的數(shù)據(jù)的形式被引入Cap類型文件中,以便控制在所考慮的文件中由括弧系統(tǒng)定義的各種函數(shù)的執(zhí)行。它們可以命令虛擬機(jī)驗(yàn)證在每個(gè)函數(shù)執(zhí)行之后執(zhí)行堆棧是空的。為此,該虛擬機(jī)可以驗(yàn)證執(zhí)行堆棧的高地址等于執(zhí)行堆棧的低地址。在這里觀察到,這樣的實(shí)施方式允許由標(biāo)準(zhǔn)虛擬機(jī)執(zhí)行Cap類型文件的偽指令,以定制組件的數(shù)據(jù)域中的數(shù)據(jù)的形式插入的偽指令因此被忽略。圖4示出適于實(shí)現(xiàn)本發(fā)明某些步驟、特別是參照圖2和3描述的步驟的裝置400的硬件結(jié)構(gòu)實(shí)例。裝置400例如是計(jì)算機(jī)或電腦。在這里裝置包括通信總線405,以下器件連接到該通信總線-ー個(gè)或多個(gè)中央處理單元或微處理器410(CPU);
-只讀存儲器415(ROM,英語術(shù)語Read Only Memory的首字母縮略詞),其可以包括運(yùn)行本發(fā)明所需要的程序(prog、piOgl和prog2(程序、程序I和程序2));-讀寫存儲器或高速緩沖存儲器420(RAM,英語術(shù)語Random Access Memory的首字母縮略詞),其包括適于記錄在上述程序執(zhí)行過程中創(chuàng)建和改變的變量和參數(shù)的寄存器;和-通信接ロ450,其適于傳送和接收數(shù)據(jù)。裝置400還優(yōu)選地配有硬盤435,其可以包括上述程序以及按照本發(fā)明已處理或待處理的信息;和存儲卡的讀卡器440,其適于接收存儲卡445并在存儲卡中讀取或向儲存卡中寫入根據(jù)本發(fā)明已處理或待處理的數(shù)據(jù)。通信總線允許包括在裝置400中或與該裝置相連接的不同元件之間的通信和協(xié)同運(yùn)轉(zhuǎn)??偩€的表示不是限制性的,尤其地,中央處理單元能直接地或通過裝置400的其他元件傳送指令給裝置400的各個(gè)元件。允許該可編程裝置實(shí)施按照本發(fā)明的方法的每個(gè)程序的可執(zhí)行代碼可以被儲存,例如被儲存在硬盤435中或只讀存儲器415中。按照ー個(gè)變型,存儲卡445可以包含按照本發(fā)明的信息、尤其是待處理信息,以及包含上述程序的可執(zhí)行代碼,該可執(zhí)行代碼一旦被裝置400讀出便被存入硬盤435中。按照另ー個(gè)變型,按照本發(fā)明的程序的可執(zhí)行代碼和待處理信息可以借助接ロ450至少部分地被接收,以便以與上述方式相同的方式被儲存。以更一般的方式,按照本發(fā)明的所述程序以及待處理信息可以在被執(zhí)行之前裝載入裝置400的儲存部件之一中。中央?yún)g元410將控制和引導(dǎo)按照本發(fā)明的所述程序的軟件代碼的ー些部分或指令的執(zhí)行,所述指令是存儲在硬盤435中或只讀存儲器415中甚至或上述其他儲存元件中的指令。通電時(shí),存入非易失存儲器例如硬盤435或只讀存儲器415中的所述程序被轉(zhuǎn)移至讀寫存儲器420中以及用于存儲實(shí)施本發(fā)明所需要的變量和參數(shù)的寄存器中,讀寫存儲器因此包含按照本發(fā)明的所述程序的執(zhí)行代碼。自然地,為了滿足特定的需求,本發(fā)明技術(shù)領(lǐng)域中的技術(shù)人員能將改變應(yīng)用于前述的說明中。特別地,盡管本發(fā)明出于示意說明和清楚的考慮而特別地參照J(rèn)ava編程語言進(jìn)行描述,但本發(fā)明可以用其他類型的編程語言來實(shí)施。附錄
權(quán)利要求
1.用于計(jì)算機(jī)的由虛擬機(jī)執(zhí)行的中間編程代碼的安全化的方法,該方法的特征在于,其包括下列步驟; -從所述中間編程代碼接收(200)多個(gè)偽指令; -轉(zhuǎn)換(230,235)所述多個(gè)偽指令,所述轉(zhuǎn)換包括插入至少一個(gè)偽指令的插入步驟,所述至少一個(gè)偽指令與所述多個(gè)偽指令中的至少一個(gè)偽指令的執(zhí)行的控制函數(shù)相關(guān);和 -生成偽代碼,所生成的所述偽代碼包括被轉(zhuǎn)換的所述多個(gè)偽指令。
2.按照權(quán)利要求I所述的方法,其特征在于,所述插入步驟包括插入代表用于所述虛擬機(jī)的控制命令的偽指令的步驟。
3.按照權(quán)利要求2所述的方法,其特征在于,用于所述虛擬機(jī)的所述控制命令旨在檢驗(yàn)所述虛擬機(jī)的執(zhí)行堆棧,以驗(yàn)證所述虛擬機(jī)的執(zhí)行堆棧是空的。
4.按照權(quán)利要求I所述的方法,其特征在于,轉(zhuǎn)換步驟對于每個(gè)所接收的所述偽指令包括以下步驟 -若所述偽指令針對至少一第一預(yù)定值的預(yù)定處理,則刪除所述偽指令并插入(230)針對用于至少一第二預(yù)定值的所述預(yù)定處理的偽指令,所述至少一第二預(yù)定值不同于所述至少一第一預(yù)定值;和 -若所述偽指令針對所述至少一第一預(yù)定值與另一值的比較,則刪除所述偽指令并插A (230)針對所述至少一第二預(yù)定值與所述另一值比較的偽指令。
5.按照權(quán)利要求4所述的方法,其特征在于,針對至少一第一預(yù)定值的預(yù)定處理的所述偽指令旨在對局部變量進(jìn)行初始化或賦值,所述局部變量的值在初始化或賦值步驟執(zhí)行之后等于所述第一預(yù)定值。
6.按照權(quán)利要求4或5所述的方法,其特征在于,所述方法還包括定義(225)或計(jì)算所述至少一第二預(yù)定值的步驟。
7.按照權(quán)利要求4至6中任一項(xiàng)所述的方法,其特征在于,所述方法還包括分析所述多個(gè)偽指令的至少一組的分析步驟(315,320),作為對所述分析步驟的響應(yīng)而進(jìn)行刪除針對至少一第一預(yù)定值的預(yù)定處理的所述偽指令的步驟和插入針對用于至少一第二預(yù)定值的所述預(yù)定處理的所述偽指令的步驟。
8.按照上述權(quán)利要求中任一項(xiàng)所述的方法,其特征在于,所述方法還包括代碼編譯(110)的預(yù)先步驟,所述代碼編譯的預(yù)先步驟的結(jié)果包括所述多個(gè)偽指令。
9.計(jì)算機(jī)程序,其包括當(dāng)所述計(jì)算機(jī)程序在計(jì)算機(jī)上執(zhí)行時(shí)適于實(shí)施按照上述權(quán)利要求中任一項(xiàng)所述的方法的每個(gè)步驟的指令。
10.裝置,其包括適于實(shí)施按照權(quán)利要求I至8中任一項(xiàng)所述的方法的每個(gè)步驟的部件。
11.微電路卡,其包括通過按照權(quán)利要求I至8中任一項(xiàng)所述的方法獲得的偽指令。
全文摘要
本發(fā)明尤其旨在由虛擬機(jī)執(zhí)行的中間編程代碼的安全化。從所述中間編程代碼接收(200)多個(gè)偽指令后,對所述多個(gè)偽指令進(jìn)行轉(zhuǎn)換(230,235),所述轉(zhuǎn)換包括插入至少一個(gè)偽指令的步驟,所述至少一個(gè)偽指令與所述多個(gè)偽指令中的至少一個(gè)偽指令的執(zhí)行的控制函數(shù)相關(guān)。下一步驟旨在生成偽代碼,所生成的偽代碼包括被轉(zhuǎn)換的所述多個(gè)偽指令。
文檔編號G06F9/455GK102681838SQ201110463290
公開日2012年9月19日 申請日期2011年11月10日 優(yōu)先權(quán)日2010年11月10日
發(fā)明者H·格勒內(nèi)什, O·尚蕾 申請人:歐貝特技術(shù)公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
嘉黎县| 修水县| 沙洋县| 成安县| 监利县| 密山市| 沙坪坝区| 涿州市| 来安县| 嵩明县| 乌拉特中旗| 南充市| 山西省| 泰顺县| 古田县| 灵宝市| 西充县| 都昌县| 清水河县| 延寿县| 长泰县| 青田县| 嘉兴市| 乌鲁木齐市| 江阴市| 大安市| 商河县| 砀山县| 乌恰县| 金阳县| 龙山县| 临泉县| 汉源县| 光泽县| 泸州市| 曲阜市| 芜湖市| 鲜城| 清新县| 开封县| 永定县|