操作可以順序執(zhí)行或并行執(zhí)行(例如使用并行處理器或多線程環(huán)境)。如圖1所示,所述方法可以包括:
[0030]S1:在Java卡的指令系統(tǒng)中增設(shè)InvokeNative指令。
[0031]在現(xiàn)有的Java卡的指令系統(tǒng)中,用于調(diào)用本地方法的指令與調(diào)用靜態(tài)方法的指令是相同的,均為InvokeStatic。利用InvokeStatic指令實現(xiàn)本地方法調(diào)用需要經(jīng)歷復(fù)雜的定位過程。因此,在本發(fā)明實施例中,可以在Java卡的指令系統(tǒng)中增設(shè)InvokeNative指令,該InvokeNative指令專門用于實現(xiàn)本地方法的調(diào)用。需要說明的是,此處的InvokeNative指令的名稱還可以換為其它在Java卡的指令系統(tǒng)中未出現(xiàn)過的指令名稱,本發(fā)明對該專門用于實現(xiàn)本地方法調(diào)用的指令的名稱并不做限定,InvokeNative只是為了描述方便而采用的其中一個指令名稱。
[0032]在Java卡的指令系統(tǒng)中增設(shè)了 InvokeNative指令后,為了方便管理該指令以及將該指令與其它指令相區(qū)分,在本發(fā)明一優(yōu)選實施例中,可以為所述InvokeNative指令分配唯一標(biāo)識。所述唯一標(biāo)識可以作為所述InvokeNative指令的指令代碼,例如在具體應(yīng)用中,該唯一標(biāo)識可以為185。當(dāng)然,該唯一標(biāo)識還可以為其它未被使用過的指令代碼。同樣地,本發(fā)明實施例對所述唯一標(biāo)識的具體表現(xiàn)形式并不加限定,其可以是唯一的數(shù)字代碼,同樣也可以為唯一的字符串代碼。
[0033]S2:在所述Java卡與應(yīng)用進(jìn)行代碼連接時,分析InvokeStatic指令調(diào)用的方法對應(yīng)的方法類型。
[0034]在Java卡的指令系統(tǒng)中增設(shè)了專門用于實現(xiàn)本地方法調(diào)用的InvokeNative指令后,由于該InvokeNative指令并不是Java系統(tǒng)中的標(biāo)準(zhǔn)指令,而是后期擴(kuò)展的指令,Java卡中的應(yīng)用并不知曉該指令的存在。因此,本發(fā)明實施例需要為增設(shè)的InvokeNative指令分配具體的本地方法的索引,才能夠使得InvokeNative指令能夠正常得被Java卡中的應(yīng)用進(jìn)行使用。具體地,本發(fā)明實施例可以在所述Java卡與應(yīng)用進(jìn)行代碼連接時,分析InvokeStatic指令調(diào)用的方法對應(yīng)的方法類型。在具體實施場景中,一個應(yīng)用往往是被下載到Java卡上而被執(zhí)行。應(yīng)用往往可以通過兩種途徑被下載到所述Java卡上,一種是通過Java卡外連接轉(zhuǎn)換應(yīng)用,通過掩膜的方法將應(yīng)用預(yù)置到Java卡的ROM中。這種方法中,所述Java卡與應(yīng)用進(jìn)行代碼連接是在Java卡的外部進(jìn)行的。另一種是將應(yīng)用下載到EEPR0M中,這種方法中,所述Java卡與應(yīng)用進(jìn)行代碼連接是在Java卡內(nèi)進(jìn)行的。
[0035]無論是哪種下載途徑,在應(yīng)用進(jìn)入到Java卡內(nèi)時,均需要與Java卡進(jìn)行代碼連接,這樣才能保證下載的應(yīng)用能夠在Java卡上正常地運(yùn)行。在所述Java卡與應(yīng)用進(jìn)行代碼連接時,可以對InvokeStatic指令進(jìn)行處理,以區(qū)分出其調(diào)用的是普通的靜態(tài)方法還是本地方法。具體地,在本發(fā)明一優(yōu)選實施例中,可以提取InvokeStatic指令調(diào)用的方法對應(yīng)的Java代碼區(qū)中的第一個字節(jié)。InvokeStatic指令在調(diào)用方法時,往往先獲取該方法的標(biāo)識,然后根據(jù)該標(biāo)識再定位出該方法對應(yīng)的代碼位置。該方法對應(yīng)的Java代碼區(qū)中的第一個字節(jié)可以記載該方法所屬的方法類型,所述方法類型例如可以是本地方法或者普通的靜態(tài)方法。本發(fā)明實施例提取出所述第一個字節(jié)后,便可以根據(jù)該第一個字節(jié),判斷出所述InvokeStatic指令調(diào)用的方法對應(yīng)的方法類型。這樣,在應(yīng)用與Java卡進(jìn)行代碼連接的階段,便可以確定出InvokeStatic指令調(diào)用的方法是本地方法還是普通的靜態(tài)方法。
[0036]S3:當(dāng)分析的所述方法類型為本地方法時,將所述本地方法的調(diào)用指令修改為所述InvokeNative指令,并將所述本地方法的索引保存至所述InvokeNative指令中。
[0037]本發(fā)明實施例在對InvokeStatic指令調(diào)用的方法進(jìn)行判斷后,可以對方法類型為本地方法的情況進(jìn)行進(jìn)一步的處理。具體地,當(dāng)分析的所述方法類型為本地方法時,可以將所述本地方法的調(diào)用指令修改為所述InvokeNative指令,并將所述本地方法的索引保存至所述InvokeNative指令中。由于Java系統(tǒng)中對于本地方法默認(rèn)的調(diào)用指令是InvokeStatic指令,那么本發(fā)明在分析得出本地方法后,可以將該本地方法默認(rèn)的調(diào)用指令修改為InvokeNative指令。這樣,當(dāng)需要調(diào)用本地方法時,便會直接利用InvokeNative指令進(jìn)行調(diào)用。
[0038]在本發(fā)明實施例中,在InvokeNative指令調(diào)用本地方法時,為了避免出現(xiàn)一系列的定位過程,可以直接將所述本地方法的索引保存至所述InvokeNative指令中,這樣當(dāng)InvokeNative指令獲取到本地方法的標(biāo)識后,可以根據(jù)該標(biāo)識直接從代碼區(qū)取出與之關(guān)聯(lián)的索引,根據(jù)取出的該索引便可以直接跳轉(zhuǎn)到對應(yīng)的本地方法的執(zhí)行過程,從而避免了復(fù)雜的定位過程。
[0039]在本發(fā)明一優(yōu)選實施例中,在將本地方法的調(diào)用指令修改為所述InvokeNative指令,并將所述本地方法的索引保存至所述InvokeNative指令中之后,可以將所述本地方法的代碼從Java代碼區(qū)中去除,以避免對本地方法的代碼進(jìn)行重復(fù)存儲,從而能夠減小整個系統(tǒng)的代碼大小。
[0040]在本發(fā)明另一優(yōu)選實施例中,為了保證本地方法不被非法的攻擊者直接調(diào)用,可以當(dāng)所述本地方法通過所述InvokeNative指令被調(diào)用時,審核調(diào)用者的權(quán)限。具體地,本發(fā)明實施例可以查詢調(diào)用者所在的包(package),并提取所述調(diào)用者的包標(biāo)識。所述包標(biāo)識可以與Java系統(tǒng)中的各個包一一對應(yīng),以區(qū)分不同包之間的差別。通過包標(biāo)識可以唯一地確定出與其相關(guān)聯(lián)的包。在提取出調(diào)用者的包標(biāo)識后,便可以將提取的所述包標(biāo)識與預(yù)存的包標(biāo)識進(jìn)行比對。所述預(yù)存的包標(biāo)識可以是在Java卡出廠時錄入該Java卡中,所述預(yù)存的包標(biāo)識中可以存在多個包標(biāo)識,這些包標(biāo)識對應(yīng)的包均是合法的,來自于這些合法包中的調(diào)用者也相應(yīng)地是合法的。這樣,便可以通過調(diào)用者對應(yīng)的包標(biāo)識,從而辨別調(diào)用者的身份是否合法。通過比對提取的所述包標(biāo)識與預(yù)存的包標(biāo)識,從而可以確定所述調(diào)用者的權(quán)限。具體地,當(dāng)所述提取的所述包標(biāo)識存在于所述預(yù)存的包標(biāo)識中時,便可以認(rèn)為與該包標(biāo)識對應(yīng)的調(diào)用者是合法的,具備調(diào)用的權(quán)限,從而可以確定所述本地方法能夠被調(diào)用;相反地,當(dāng)提取的所述包標(biāo)識不存在于所述預(yù)存的包標(biāo)識中時,則可以確定所述本地方法不能夠被調(diào)用。通過對調(diào)用者的身份進(jìn)行識別,從而能夠確定調(diào)用者的權(quán)限,以保證本地方法的調(diào)用權(quán)限限制在Java卡的內(nèi)部包中,避免了外部非法的攻擊者直接調(diào)用本地方法。
[0041]從上述表述可以發(fā)現(xiàn),本發(fā)明實施例提供的一種在Java卡中實現(xiàn)本地方法調(diào)用的方法,通過增設(shè)專用于本地方法調(diào)用的InvokeNative指令,并且將本地方法的調(diào)用指令修改為所述InvokeNative指令以及將本地方法的索引直接保存至所述InvokeNative指令中,從而可以省去了復(fù)雜的定位過程,大大加快了本地方法調(diào)用的過程。進(jìn)一步地,本發(fā)明實施例還通過權(quán)限審核的方法,將本地方法的調(diào)用權(quán)限限制于Java卡的內(nèi)部包中,保證了本地方法調(diào)用的安全性。
[0042]本發(fā)明實施例還提供一種在Java卡中實現(xiàn)本地方法調(diào)用的裝置。圖2為本發(fā)明實施例提供的一種在Java卡中實現(xiàn)本地方法調(diào)用的裝置功能模塊圖。如圖2所示,所述裝置可以包括:
[0043]指令增設(shè)單元100,用于在Java卡的指令系統(tǒng)中增設(shè)InvokeNative指令;
[0044]方法類型分析單元200,用于在所述Java卡與應(yīng)用進(jìn)行代碼連接時,分析InvokeStatic指令調(diào)用的方法對應(yīng)的方法類型;
[0045]處理單元300,