一種文件加固方法及裝置的制造方法
【專利摘要】本發(fā)明公開(kāi)了一種文件加固方法及裝置,所述的方法包括:預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè);在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù);依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。通過(guò)對(duì)目標(biāo)可執(zhí)行文件的加固,防止目標(biāo)可執(zhí)行文件被逆向,保護(hù)目標(biāo)可執(zhí)行文件的安全。
【專利說(shuō)明】
一種文件加固方法及裝置
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及加固技術(shù)領(lǐng)域,具體涉及一種文件加固方法及裝置。
【背景技術(shù)】
[0002]安卓平臺(tái)發(fā)展迅速,已經(jīng)逐漸成為了移動(dòng)終端的最普及的操作系統(tǒng),與其他終端操作系統(tǒng)相比,開(kāi)放式的安卓系統(tǒng)為應(yīng)用開(kāi)發(fā)者提供了更多的功能接口,這些功能接口在提高了系統(tǒng)的可擴(kuò)展性,但同時(shí)也為惡意軟件提供了便利。針對(duì)安卓系統(tǒng)的木馬等惡意軟件可以通過(guò)偽裝的方式保存在安卓安裝包中,騙取用戶安裝并授予一定的權(quán)限,之后通過(guò)濫用權(quán)限在后臺(tái)執(zhí)行一些特定行為,包括竊取用戶隱私、騙取資費(fèi)等行為;不僅如此,對(duì)于一些正常的安卓系統(tǒng)應(yīng)用,也存在通過(guò)非法拷貝、逆向工程、反編譯、調(diào)試、破解、二次打包、內(nèi)存截取等手段來(lái)威脅安卓系統(tǒng)的安全,不僅危害了使用者,也給正常應(yīng)用開(kāi)發(fā)者造成嚴(yán)重的損害。
【發(fā)明內(nèi)容】
[0003]鑒于上述問(wèn)題,提出了本發(fā)明以便提供一種克服上述問(wèn)題或者至少部分地解決上述問(wèn)題的文件加固的方法和相應(yīng)的文件加固裝置。
[0004]依據(jù)本發(fā)明的一個(gè)方面,提供了一種文件加固方法,包括:預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè);在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù);依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。
[0005]可選的,所述預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè),包括:預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ);將目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù);在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè)。
[0006]可選的,所述預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ),包括:將所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)存,或,對(duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換后存儲(chǔ)。
[0007]可選的,在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù),包括:在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí)調(diào)用對(duì)應(yīng)的庫(kù)文件,所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0008]可選的,依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,包括:通過(guò)所述注冊(cè)的本地函數(shù)查找對(duì)應(yīng)的目標(biāo)函數(shù);采用所述預(yù)設(shè)的解釋器依次獲取所述目標(biāo)函數(shù)中的各指令;所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行。
[0009]可選的,所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行的方式包括以下至少一種:所述預(yù)設(shè)的解釋器對(duì)第一類指令進(jìn)行執(zhí)行;所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行;其中,所述第一類指令包括運(yùn)算指令和/或跳轉(zhuǎn)指令,所述第二類指令包括方法調(diào)用指令和/或異常指令。
[0010]可選的,所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行,包括:在執(zhí)行方法調(diào)用指令時(shí),所述預(yù)設(shè)的解釋器從虛擬的寄存器中獲取方法調(diào)用指令對(duì)應(yīng)方法調(diào)用值;依據(jù)所述方法調(diào)用值,采用本地接口對(duì)相應(yīng)的方法進(jìn)行調(diào)用。
[0011 ]可選的,所述通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,包括:通過(guò)所述預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)對(duì)應(yīng)轉(zhuǎn)化的指令進(jìn)行解釋,獲取所述轉(zhuǎn)化的指令對(duì)應(yīng)的指令,執(zhí)行所述指令。
[0012]根據(jù)本發(fā)明的另一個(gè)方面,提供了一種文件加固裝置,包括:預(yù)置模塊,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè);庫(kù)文件調(diào)用模塊,用于在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù);指令解釋模塊,用于依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。
[0013]可選的,所述預(yù)置模塊,包括:存儲(chǔ)子模塊,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ);轉(zhuǎn)換子模塊,用于將目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù);注冊(cè)子模塊,用于在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè)。
[0014]可選的,所述存儲(chǔ)子模塊,用于將所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)存,或,對(duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換后存儲(chǔ)。
[0015]可選的,所述庫(kù)文件調(diào)用模塊,用于在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí)調(diào)用對(duì)應(yīng)的庫(kù)文件,所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0016]可選的,所述指令解釋模塊,包括:查找子模塊,用于通過(guò)所述注冊(cè)的本地函數(shù)查找對(duì)應(yīng)的目標(biāo)函數(shù);指令獲取子模塊,用于采用所述預(yù)設(shè)的解釋器依次獲取所述目標(biāo)函數(shù)中的各指令;解釋執(zhí)行子模塊,用于執(zhí)行所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行。
[0017]可選的,所述解釋執(zhí)行子模塊,用于所述預(yù)設(shè)的解釋器對(duì)第一類指令進(jìn)行執(zhí)行;所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行;其中,所述第一類指令包括運(yùn)算指令和/或跳轉(zhuǎn)指令,所述第二類指令包括方法調(diào)用指令和/或異常指令。
[0018]可選的,所述解釋執(zhí)行子模塊,用于在執(zhí)行方法調(diào)用指令時(shí),所述預(yù)設(shè)的解釋器從虛擬的寄存器中獲取方法調(diào)用指令對(duì)應(yīng)方法調(diào)用值;依據(jù)所述方法調(diào)用值,采用本地接口對(duì)相應(yīng)的方法進(jìn)行調(diào)用。
[0019]可選的,所述指令解釋模塊,用于通過(guò)所述預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)對(duì)應(yīng)轉(zhuǎn)化的指令進(jìn)行解釋,獲取所述轉(zhuǎn)化的指令對(duì)應(yīng)的指令,執(zhí)行所述指令。
[0020]根據(jù)本發(fā)明的一種文件加固方法及裝置,可以預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè),從而變更目標(biāo)函數(shù)的執(zhí)行過(guò)程,在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù),依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,通過(guò)對(duì)目標(biāo)可執(zhí)行文件的加固,防止目標(biāo)可執(zhí)行文件被逆向,保護(hù)目標(biāo)可執(zhí)行文件的安全。
[0021]上述說(shuō)明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說(shuō)明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的【具體實(shí)施方式】。
【附圖說(shuō)明】
[0022]通過(guò)閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
[0023]圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的文件加固方法的步驟流程圖;
[0024]圖2示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的文件加固方法的步驟流程圖;
[0025]圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的文件加固裝置的結(jié)構(gòu)框圖;
[0026]圖4示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的文件加固裝置的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0027]下面將參照附圖更詳細(xì)地描述本公開(kāi)的示例性實(shí)施例。雖然附圖中顯示了本公開(kāi)的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開(kāi)而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開(kāi),并且能夠?qū)⒈竟_(kāi)的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0028]實(shí)施例一
[0029]參照?qǐng)D1,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的文件加固方法的步驟流程圖。
[0030]步驟102,預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè)。
[0031 ]以安卓系統(tǒng)為例,APK(Android Package ,Android安裝包)中包括dex(DalvikVMexecutes)文件,是Android Dalvik執(zhí)行程序,即Android平臺(tái)上可執(zhí)行文件的類型,后綴為.dex。若dex文件的執(zhí)行過(guò)程如函數(shù)等被逆向,則會(huì)影響對(duì)應(yīng)應(yīng)用以及系統(tǒng)的安全。因此本發(fā)明實(shí)施例提出一種針對(duì)dex文件件的加固方法,以防止dex文件被逆向,保護(hù)文件、應(yīng)用以及系統(tǒng)的安全。
[0032]針對(duì)目標(biāo)可執(zhí)行文件如dex文件中的目標(biāo)函數(shù),對(duì)該目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化,然后在庫(kù)文件中注冊(cè)轉(zhuǎn)化的函數(shù)。其中,庫(kù)文件可以是動(dòng)態(tài)鏈接庫(kù)文件,如.SO文件。其中,SO文件是指Iinux下的庫(kù)文件,后綴為.SO,因此得名。SO文件是ELF格式的動(dòng)態(tài)鏈接庫(kù)文件,so文件在程序運(yùn)行需要的時(shí)候才動(dòng)態(tài)加載到程序中,以支持程序的運(yùn)行。
[0033]例如對(duì)Dex文件中的OnCreate函數(shù),將該OnCreate函數(shù)轉(zhuǎn)化成native函數(shù),然后在so文件中注冊(cè)該native函數(shù),從而能夠通過(guò)庫(kù)文件調(diào)用該目標(biāo)函數(shù)。通過(guò)對(duì)目標(biāo)函數(shù)的轉(zhuǎn)換,防止目標(biāo)函數(shù)執(zhí)行過(guò)程被獲知,從而防止目標(biāo)函數(shù)被逆向,保護(hù)文件、應(yīng)用以及系統(tǒng)的安全。
[0034]步驟104,在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0035]步驟106,依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。
[0036]當(dāng)系統(tǒng)執(zhí)行該目標(biāo)可執(zhí)行文件時(shí)會(huì)調(diào)用對(duì)應(yīng)的目標(biāo)函數(shù),即在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),先獲取庫(kù)文件,依據(jù)該庫(kù)文件確定注冊(cè)的本地函數(shù),然后采用該本地函數(shù)確定目標(biāo)函數(shù)。
[0037]本發(fā)明實(shí)施例中,預(yù)先配置了解釋器(Interpreter),該解釋器用于對(duì)目標(biāo)可執(zhí)行文件中函數(shù)的指令(opcode)進(jìn)行解釋。因此可以采用解釋器對(duì)目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋來(lái)執(zhí)行該指令。通過(guò)預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)中的指令進(jìn)行解釋執(zhí)行,從而其他線程無(wú)法獲知該執(zhí)行過(guò)程,使得目標(biāo)函數(shù)不被逆向。
[0038]綜上,預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè),從而變更目標(biāo)函數(shù)的執(zhí)行過(guò)程,在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù),依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,通過(guò)對(duì)目標(biāo)可執(zhí)行文件的加固,防止目標(biāo)可執(zhí)行文件被逆向,保護(hù)目標(biāo)可執(zhí)行文件的安全。
[0039]實(shí)施例二
[0040]本發(fā)明實(shí)施例中可以應(yīng)用于安卓系統(tǒng)中,以對(duì)dex文件進(jìn)行加固防護(hù)為例,假設(shè)庫(kù)文件為so文件,目標(biāo)函數(shù)為OnCreate函數(shù),本地函數(shù)為native函數(shù)。結(jié)合該示例論述文件加固方法的步驟流程。
[0041]參照?qǐng)D2,示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的文件加固方法的步驟流程圖。
[0042]步驟202,預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ)。
[0043]步驟204,將目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù)。
[0044]步驟206,在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè)。
[0045]本發(fā)明實(shí)施例對(duì)待保護(hù)的目標(biāo)可執(zhí)行文件,可以預(yù)先對(duì)其目標(biāo)函數(shù)進(jìn)行存儲(chǔ),從而在后續(xù)執(zhí)行時(shí)外部無(wú)法破解其執(zhí)行過(guò)程,保護(hù)文件安全。其中,預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ),包括:將所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)存,或,對(duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換后存儲(chǔ)??梢詫?duì)目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)存,即將目標(biāo)函數(shù)中各指令轉(zhuǎn)存到其他位置,從而在調(diào)用時(shí)從轉(zhuǎn)存的位置獲取該指令以執(zhí)行?;蛘撸瑢?duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換后存儲(chǔ),即保留目標(biāo)函數(shù)中各指令的原始存儲(chǔ)位置,而對(duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換確定轉(zhuǎn)化的指令,然后對(duì)轉(zhuǎn)化的指令進(jìn)行存儲(chǔ),從而后續(xù)執(zhí)行指令時(shí)通過(guò)轉(zhuǎn)化的指令查找原始的指令,即通過(guò)指令的等效替換保護(hù)文件的安全。
[0046]對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ)后,將目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù),在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè),從而通過(guò)庫(kù)文件查找目標(biāo)函數(shù)。例如,對(duì)dex文件的OnCreate函數(shù)中各指令opcode進(jìn)行存儲(chǔ),然后將OnCreate函數(shù)轉(zhuǎn)化成native函數(shù),再在so文件中注冊(cè)native函數(shù)。
[0047]步驟208,在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí)調(diào)用對(duì)應(yīng)的庫(kù)文件,所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0048]在系統(tǒng)執(zhí)行目標(biāo)可執(zhí)行文件時(shí)會(huì)調(diào)用目標(biāo)函數(shù),則系統(tǒng)會(huì)調(diào)用對(duì)應(yīng)的庫(kù)文件,通過(guò)庫(kù)文件中注冊(cè)的函數(shù)確定目標(biāo)函數(shù)對(duì)應(yīng)注冊(cè)的本地函數(shù)。例如每次系統(tǒng)執(zhí)行dex文件時(shí),在調(diào)用OnCreate函數(shù)時(shí)會(huì)調(diào)用so文件里的注冊(cè)函數(shù),通過(guò)注冊(cè)函數(shù)確定native函數(shù)。
[0049]步驟210,通過(guò)所述注冊(cè)的本地函數(shù)查找對(duì)應(yīng)的目標(biāo)函數(shù)。
[0050]步驟212,采用所述預(yù)設(shè)的解釋器依次獲取所述目標(biāo)函數(shù)中的各指令。
[0051 ]步驟214,所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行。
[0052]采用注冊(cè)的本地函數(shù)查找對(duì)應(yīng)的目標(biāo)函數(shù),然后采用預(yù)設(shè)的解釋器執(zhí)行該目標(biāo)函數(shù),即依次獲取目標(biāo)函數(shù)中各指令,然后預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行。
[0053]本發(fā)明一個(gè)可選實(shí)施例中,所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行的方式包括以下至少一種:所述預(yù)設(shè)的解釋器對(duì)第一類指令進(jìn)行執(zhí)行;所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行。
[0054]其中,所述第一類指令包括運(yùn)算指令和/或跳轉(zhuǎn)指令。預(yù)算指令包括執(zhí)行運(yùn)算的指令,如加減乘除等運(yùn)算;跳轉(zhuǎn)指令包括執(zhí)行跳轉(zhuǎn)的指令,例如通過(guò)該指令跳轉(zhuǎn)到其他指令。對(duì)于第一類指令,解釋器可以自行執(zhí)行該對(duì)于第一類指令,即執(zhí)行指令的加減乘除等運(yùn)算或者跳轉(zhuǎn)等。
[0055]所述第二類指令包括方法調(diào)用指令和/或異常指令。方法調(diào)用指令包括調(diào)用函數(shù)方法的指令;異常指令包括執(zhí)行異常拋出的指令。對(duì)于第二類指令,預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行,例如,通過(guò)env(—個(gè)外部命令)反射的方式執(zhí)行第二類指令,即通過(guò)調(diào)用JNI(Java Native Interface,Java本地接口)執(zhí)行第二類指令。
[0056]其中,所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行方法調(diào)用,包括:在執(zhí)行方法調(diào)用指令時(shí),所述預(yù)設(shè)的解釋器從虛擬的寄存器中獲取方法調(diào)用指令對(duì)應(yīng)方法調(diào)用值;依據(jù)所述方法調(diào)用值,采用本地接口對(duì)相應(yīng)的方法進(jìn)行調(diào)用。
[0057]本實(shí)施例中采用預(yù)設(shè)的解釋器接管目標(biāo)函數(shù)中指令的執(zhí)行過(guò)程,包括對(duì)寄存器的讀寫,因此可以預(yù)先模擬寄存器并配置寄存器列表,在執(zhí)行方法調(diào)用指令時(shí),預(yù)設(shè)的解釋器從虛擬的寄存器中中獲取方法調(diào)用指令對(duì)應(yīng)方法調(diào)用值,然后依據(jù)該方法調(diào)用值確定調(diào)用的方法,采用本地接口對(duì)相應(yīng)的方法進(jìn)行調(diào)用。
[0058]其中,安卓系統(tǒng)通常會(huì)采用專門的虛擬機(jī)執(zhí)行指令,而本實(shí)施例為了防止外部獲取函數(shù)的指令執(zhí)行過(guò)程,預(yù)先對(duì)指令進(jìn)行存儲(chǔ)以及轉(zhuǎn)化,從而在執(zhí)行目標(biāo)函數(shù)是采用非系統(tǒng)的預(yù)設(shè)解釋器執(zhí)行。例如采用預(yù)設(shè)的interpreter取出每條opcode,然后一條一條執(zhí)行,其中,普通的加減乘除運(yùn)算指令以及跳轉(zhuǎn)指令等采用interpreter直接執(zhí)行,指令包括方法調(diào)用、拋出異常等指令時(shí),可以采用env反射的方式去對(duì)每個(gè)opcode執(zhí)行方法調(diào)用以及異常拋出,即采用JNI調(diào)用方式,如call method、getfield等類的操作和方法執(zhí)行調(diào)用,即將指令采用GNI解釋,從而虛擬執(zhí)行該opcode。其中,對(duì)于涉及寄存器操作的方法調(diào)用,由于預(yù)先虛擬了寄存器,則interpreter可以執(zhí)行寄存器的存、放,則調(diào)用方法即從虛擬的寄存器中取對(duì)應(yīng)值來(lái)調(diào)用方法。從而按照OnCreate函數(shù)的指令執(zhí)行順序采用interpreter將整個(gè)opcode執(zhí)行一遍,相當(dāng)于OnCreate函數(shù)的執(zhí)行拋出系統(tǒng)調(diào)用,從而外部無(wú)法獲知函數(shù)如何執(zhí)行,從而無(wú)法逆向保護(hù)系統(tǒng)安全。
[0059]本發(fā)明一個(gè)可選實(shí)施例中,若預(yù)先對(duì)指令轉(zhuǎn)化后存儲(chǔ),則所述通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,包括:通過(guò)所述預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)對(duì)應(yīng)轉(zhuǎn)化的指令進(jìn)行解釋,獲取所述轉(zhuǎn)化的指令對(duì)應(yīng)的指令,執(zhí)行所述指令。通過(guò)所述預(yù)設(shè)的解釋器獲取轉(zhuǎn)化的指令,然后對(duì)轉(zhuǎn)化的指令進(jìn)行解釋獲取對(duì)應(yīng)原始的指令,然后執(zhí)行該指令,其中,依據(jù)該指令的具體類型確定預(yù)設(shè)的解釋器對(duì)指令的指令方式,即該指令可以為第一類指令,也可以為第二類指令,具體執(zhí)行方式與上述類似,因此不再贅述。
[0000]本發(fā)明實(shí)施例中,opcode指令涉及JAVA調(diào)用,因此interpreter可以將其翻譯成對(duì)應(yīng)的JAVA調(diào)用。
[0061]從而通過(guò)對(duì)目標(biāo)函數(shù)的轉(zhuǎn)化以及庫(kù)文件中注冊(cè),變更目標(biāo)函數(shù)的執(zhí)行流程,并且不采用系統(tǒng)自帶的虛擬機(jī),而是采用預(yù)設(shè)的解釋器對(duì)指令進(jìn)行解釋,從而外部無(wú)法獲知函數(shù)執(zhí)行過(guò)程,即無(wú)法對(duì)函數(shù)的指令進(jìn)行逆向,保護(hù)系統(tǒng)安全。
[0062]此外,還可以對(duì)指令進(jìn)行等效替換,從而通過(guò)自設(shè)的解釋器對(duì)指令進(jìn)行解釋,防止函數(shù)被逆向。從而對(duì)dex設(shè)置VMP殼,即執(zhí)行文件加固。
[0063]實(shí)施例三
[0064]在上述實(shí)施例的基礎(chǔ)上,本實(shí)施例還提供了一種文件加固裝置。
[0065]參照?qǐng)D3,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的文件加固裝置的結(jié)構(gòu)框圖。
[0066]預(yù)置模塊302,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè)。
[0067]庫(kù)文件調(diào)用模塊304,用于在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0068]指令解釋模塊306,用于依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。
[0069]針對(duì)目標(biāo)可執(zhí)行文件如dex文件中的目標(biāo)函數(shù),對(duì)該目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化,然后再庫(kù)文件中注冊(cè)轉(zhuǎn)化的函數(shù)。其中,庫(kù)文件可以是動(dòng)態(tài)鏈接庫(kù)文件,如.SO文件。其中,SO文件是指Iinux下的庫(kù)文件,后綴為.SO,因此得名。SO文件是ELF格式的動(dòng)態(tài)鏈接庫(kù)文件,so文件在程序運(yùn)行需要的時(shí)候才動(dòng)態(tài)加載到程序中,以支持程序的運(yùn)行。例如對(duì)Dex文件中的OnCreate函數(shù),將該OnCreate函數(shù)轉(zhuǎn)化成native函數(shù),然后在so文件中注冊(cè)該native函數(shù),從而能夠通過(guò)庫(kù)文件調(diào)用該目標(biāo)函數(shù)。通過(guò)對(duì)目標(biāo)函數(shù)的轉(zhuǎn)換,防止目標(biāo)函數(shù)執(zhí)行過(guò)程被獲知,從而防止目標(biāo)函數(shù)被逆向,保護(hù)文件、應(yīng)用以及系統(tǒng)的安全。
[0070]當(dāng)系統(tǒng)執(zhí)行該目標(biāo)可執(zhí)行文件時(shí)會(huì)調(diào)用對(duì)應(yīng)的目標(biāo)函數(shù),即在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),先獲取庫(kù)文件,依據(jù)該庫(kù)文件確定注冊(cè)的本地函數(shù),然后采用該本地函數(shù)確定目標(biāo)函數(shù)。本發(fā)明實(shí)施例中,預(yù)先配置了解釋器(Interpreter),該解釋器用于對(duì)目標(biāo)可執(zhí)行文件中函數(shù)的指令(opcode)進(jìn)行解釋。因此可以采用解釋器對(duì)目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋來(lái)執(zhí)行該指令。通過(guò)預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)中的指令進(jìn)行解釋執(zhí)行,從而其他線程無(wú)法獲知該執(zhí)行過(guò)程,使得目標(biāo)函數(shù)不被逆向。
[0071 ]綜上,預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè),從而變更目標(biāo)函數(shù)的執(zhí)行過(guò)程,在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù),依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,通過(guò)對(duì)目標(biāo)可執(zhí)行文件的加固,防止目標(biāo)可執(zhí)行文件被逆向,保護(hù)目標(biāo)可執(zhí)行文件的安全。
[0072]參照?qǐng)D4,示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的文件加固裝置的結(jié)構(gòu)框圖。
[0073]預(yù)置模塊302,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè)。
[0074]庫(kù)文件調(diào)用模塊304,用于在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0075]指令解釋模塊306,用于依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。
[0076]其中,所述預(yù)置模塊302,包括:
[0077]存儲(chǔ)子模塊3022,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ)。
[0078]轉(zhuǎn)換子模塊3024,用于將目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù)。
[0079]注冊(cè)子模塊3026,用于在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè)。
[0080]優(yōu)選的,所述存儲(chǔ)子模塊3022,用于將所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)存,或,對(duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換后存儲(chǔ)。
[0081]其中,所述庫(kù)文件調(diào)用模塊,用于在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí)調(diào)用對(duì)應(yīng)的庫(kù)文件,所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0082]所述指令解釋模塊306,包括:
[0083]查找子模塊3062,用于通過(guò)所述注冊(cè)的本地函數(shù)查找對(duì)應(yīng)的目標(biāo)函數(shù)。
[0084]指令獲取子模塊3064,用于采用所述預(yù)設(shè)的解釋器依次獲取所述目標(biāo)函數(shù)中的各指令。
[0085]解釋執(zhí)行子模塊3066,用于執(zhí)行所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行。
[0086]所述解釋執(zhí)行子模塊3066,用于所述預(yù)設(shè)的解釋器對(duì)第一類指令進(jìn)行執(zhí)行;所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行;其中,所述第一類指令包括運(yùn)算指令和/或跳轉(zhuǎn)指令,所述第二類指令包括方法調(diào)用指令和/或異常指令。
[0087]進(jìn)一步的,所述解釋執(zhí)行子模塊,用于在執(zhí)行方法調(diào)用指令時(shí),所述預(yù)設(shè)的解釋器從虛擬的寄存器中獲取方法調(diào)用指令對(duì)應(yīng)方法調(diào)用值;依據(jù)所述方法調(diào)用值,采用本地接口對(duì)相應(yīng)的方法進(jìn)行調(diào)用。
[0088]所述指令解釋模塊,用于通過(guò)所述預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)對(duì)應(yīng)轉(zhuǎn)化的指令進(jìn)行解釋,獲取所述轉(zhuǎn)化的指令對(duì)應(yīng)的指令,執(zhí)行所述指令。
[0089]其中,安卓系統(tǒng)通常會(huì)采用專門的虛擬機(jī)執(zhí)行指令,而本實(shí)施例為了防止外部獲取函數(shù)的指令執(zhí)行過(guò)程,預(yù)先對(duì)指令進(jìn)行存儲(chǔ)以及轉(zhuǎn)化,從而在執(zhí)行目標(biāo)函數(shù)是采用非系統(tǒng)的預(yù)設(shè)解釋器執(zhí)行。例如采用預(yù)設(shè)的interpreter取出每條opcode,然后一條一條執(zhí)行,其中,普通的加減乘除運(yùn)算指令以及跳轉(zhuǎn)指令等采用interpreter直接執(zhí)行,指令包括方法調(diào)用、拋出異常等指令時(shí),可以采用env反射的方式去對(duì)每個(gè)opcode執(zhí)行方法調(diào)用以及異常拋出,即采用JNI調(diào)用方式,如call method、getfield等類的操作和方法執(zhí)行調(diào)用,即將指令采用GNI解釋,從而虛擬執(zhí)行該opcode。其中,對(duì)于涉及寄存器操作的方法調(diào)用,由于預(yù)先虛擬了寄存器,則interpreter可以執(zhí)行寄存器的存、放,則調(diào)用方法即從虛擬的寄存器中取對(duì)應(yīng)值來(lái)調(diào)用方法。從而按照OnCreate函數(shù)的指令執(zhí)行順序采用interpreter將整個(gè)opcode執(zhí)行一遍,相當(dāng)于OnCreate函數(shù)的執(zhí)行拋出系統(tǒng)調(diào)用,從而外部無(wú)法獲知函數(shù)如何執(zhí)行,從而無(wú)法逆向保護(hù)系統(tǒng)安全。
[0090]本發(fā)明一個(gè)可選實(shí)施例中,若預(yù)先對(duì)指令轉(zhuǎn)化后存儲(chǔ),則所述通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,包括:通過(guò)所述預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)對(duì)應(yīng)轉(zhuǎn)化的指令進(jìn)行解釋,獲取所述轉(zhuǎn)化的指令對(duì)應(yīng)的指令,執(zhí)行所述指令。通過(guò)所述預(yù)設(shè)的解釋器獲取轉(zhuǎn)化的指令,然后對(duì)轉(zhuǎn)化的指令進(jìn)行解釋獲取對(duì)應(yīng)原始的指令,然后執(zhí)行該指令,其中,依據(jù)該指令的具體類型確定預(yù)設(shè)的解釋器對(duì)指令的指令方式,即該指令可以為第一類指令,也可以為第二類指令,具體執(zhí)行方式與上述類似,因此不再贅述。
[0091 ] 本發(fā)明實(shí)施例中,opcode指令涉及JAVA調(diào)用,因此interpreter可以將其翻譯成對(duì)應(yīng)的JAVA調(diào)用。從而通過(guò)對(duì)目標(biāo)函數(shù)的轉(zhuǎn)化以及庫(kù)文件中注冊(cè),變更目標(biāo)函數(shù)的執(zhí)行流程,并且不采用系統(tǒng)自帶的虛擬機(jī),而是采用預(yù)設(shè)的解釋器對(duì)指令進(jìn)行解釋,從而外部無(wú)法獲知函數(shù)執(zhí)行過(guò)程,即無(wú)法對(duì)函數(shù)的指令進(jìn)行逆向,保護(hù)系統(tǒng)安全。此外,還可以對(duì)指令進(jìn)行等效替換,從而通過(guò)自設(shè)的解釋器對(duì)指令進(jìn)行解釋,防止函數(shù)被逆向。從而對(duì)dex設(shè)置VMP殼,即執(zhí)行文件加固。
[0092]在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見(jiàn)的。此外,本發(fā)明也不針對(duì)任何特定編程語(yǔ)言。應(yīng)當(dāng)明白,可以利用各種編程語(yǔ)言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語(yǔ)言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
[0093]在此處所提供的說(shuō)明書中,說(shuō)明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒(méi)有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說(shuō)明書的理解。
[0094]類似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開(kāi)并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開(kāi)的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說(shuō),如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開(kāi)的單個(gè)實(shí)施例的所有特征。因此,遵循【具體實(shí)施方式】的權(quán)利要求書由此明確地并入該【具體實(shí)施方式】,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
[0095]本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中。可以把實(shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過(guò)程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說(shuō)明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的所有特征以及如此公開(kāi)的任何方法或者設(shè)備的所有過(guò)程或單元進(jìn)行組合。除非另外明確陳述,本說(shuō)明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來(lái)代替。
[0096]此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來(lái)使用。
[0097]本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來(lái)實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的一種文件加固方法和裝置設(shè)備中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
[0098]應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說(shuō)明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來(lái)實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過(guò)同一個(gè)硬件項(xiàng)來(lái)具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
[0099]本發(fā)明公開(kāi)了Al、一種文件加固方法,包括:預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè);在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù);依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。
[0100]A2、如Al所述的方法,其中,所述預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè),包括:預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ);將目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù);在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè)。
[0101 ] A3、如A2所述的方法,其中,所述預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ),包括:將所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)存,或,對(duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換后存儲(chǔ)。
[0102]A4、如Al所述的方法,在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù),包括:在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí)調(diào)用對(duì)應(yīng)的庫(kù)文件,所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0103]A5、如Al所述的方法,依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,包括:通過(guò)所述注冊(cè)的本地函數(shù)查找對(duì)應(yīng)的目標(biāo)函數(shù);采用所述預(yù)設(shè)的解釋器依次獲取所述目標(biāo)函數(shù)中的各指令;所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行。
[0104]A6、如A5所述的方法,所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行的方式包括以下至少一種:所述預(yù)設(shè)的解釋器對(duì)第一類指令進(jìn)行執(zhí)行;所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行;其中,所述第一類指令包括運(yùn)算指令和/或跳轉(zhuǎn)指令,所述第二類指令包括方法調(diào)用指令和/或異常指令。
[0105]A7、如A6所述的方法,所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行,包括:在執(zhí)行方法調(diào)用指令時(shí),所述預(yù)設(shè)的解釋器從虛擬的寄存器中獲取方法調(diào)用指令對(duì)應(yīng)方法調(diào)用值;依據(jù)所述方法調(diào)用值,采用本地接口對(duì)相應(yīng)的方法進(jìn)行調(diào)用。
[0106]AS、如A3所述的方法,所述通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,包括:通過(guò)所述預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)對(duì)應(yīng)轉(zhuǎn)化的指令進(jìn)行解釋,獲取所述轉(zhuǎn)化的指令對(duì)應(yīng)的指令,執(zhí)行所述指令。
[0107]本發(fā)明還公開(kāi)了B9、一種文件加固裝置,包括:預(yù)置模塊,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè);庫(kù)文件調(diào)用模塊,用于在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù);指令解釋模塊,用于依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。
[0108]B10、如B9所述的裝置,所述預(yù)置模塊,包括:存儲(chǔ)子模塊,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ);轉(zhuǎn)換子模塊,用于將目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù);注冊(cè)子模塊,用于在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè)。
[0109]B11、如BlO所述的裝置,所述存儲(chǔ)子模塊,用于將所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)存,或,對(duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換后存儲(chǔ)。
[0110]B12、如B9所述的裝置,所述庫(kù)文件調(diào)用模塊,用于在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí)調(diào)用對(duì)應(yīng)的庫(kù)文件,所述庫(kù)文件確定注冊(cè)的本地函數(shù)。
[0111]B13、如B9所述的裝置,所述指令解釋模塊,包括:查找子模塊,用于通過(guò)所述注冊(cè)的本地函數(shù)查找對(duì)應(yīng)的目標(biāo)函數(shù);指令獲取子模塊,用于采用所述預(yù)設(shè)的解釋器依次獲取所述目標(biāo)函數(shù)中的各指令;解釋執(zhí)行子模塊,用于執(zhí)行所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行。
[0112]B14、如B13所述的裝置,所述解釋執(zhí)行子模塊,用于所述預(yù)設(shè)的解釋器對(duì)第一類指令進(jìn)行執(zhí)行;所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行;其中,所述第一類指令包括運(yùn)算指令和/或跳轉(zhuǎn)指令,所述第二類指令包括方法調(diào)用指令和/或異常指令。
[0113]B15、如B14所述的裝置,所述解釋執(zhí)行子模塊,用于在執(zhí)行方法調(diào)用指令時(shí),所述預(yù)設(shè)的解釋器從虛擬的寄存器中獲取方法調(diào)用指令對(duì)應(yīng)方法調(diào)用值;依據(jù)所述方法調(diào)用值,采用本地接口對(duì)相應(yīng)的方法進(jìn)行調(diào)用。
[0114]B16、如Bll所述的裝置,所述指令解釋模塊,用于通過(guò)所述預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)對(duì)應(yīng)轉(zhuǎn)化的指令進(jìn)行解釋,獲取所述轉(zhuǎn)化的指令對(duì)應(yīng)的指令,執(zhí)行所述指令。
【主權(quán)項(xiàng)】
1.一種文件加固方法,包括: 預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè); 在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù); 依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。2.如權(quán)利要求1所述的方法,其特征在于,所述預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè),包括: 預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ); 將目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù); 在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè)。3.如權(quán)利要求2所述的方法,其特征在于,所述預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ),包括: 將所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)存,或,對(duì)所述目標(biāo)函數(shù)中各指令進(jìn)行轉(zhuǎn)換后存儲(chǔ)。4.如權(quán)利要求1所述的方法,其特征在于,在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù),包括: 在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí)調(diào)用對(duì)應(yīng)的庫(kù)文件,所述庫(kù)文件確定注冊(cè)的本地函數(shù)。5.如權(quán)利要求1所述的方法,其特征在于,依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,包括: 通過(guò)所述注冊(cè)的本地函數(shù)查找對(duì)應(yīng)的目標(biāo)函數(shù); 采用所述預(yù)設(shè)的解釋器依次獲取所述目標(biāo)函數(shù)中的各指令; 所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行。6.如權(quán)利要求5所述的方法,其特征在于,所述預(yù)設(shè)的解釋器分別對(duì)每條指令進(jìn)行解釋執(zhí)行的方式包括以下至少一種: 所述預(yù)設(shè)的解釋器對(duì)第一類指令進(jìn)行執(zhí)行; 所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行; 其中,所述第一類指令包括運(yùn)算指令和/或跳轉(zhuǎn)指令,所述第二類指令包括方法調(diào)用指令和/或異常指令。7.如權(quán)利要求6所述的方法,其特征在于,所述預(yù)設(shè)的解釋器采用本地接口對(duì)第二類指令進(jìn)行執(zhí)行,包括: 在執(zhí)行方法調(diào)用指令時(shí),所述預(yù)設(shè)的解釋器從虛擬的寄存器中獲取方法調(diào)用指令對(duì)應(yīng)方法調(diào)用值; 依據(jù)所述方法調(diào)用值,采用本地接口對(duì)相應(yīng)的方法進(jìn)行調(diào)用。8.如權(quán)利要求3所述的方法,其特征在于,所述通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行,包括: 通過(guò)所述預(yù)設(shè)的解釋器對(duì)目標(biāo)函數(shù)對(duì)應(yīng)轉(zhuǎn)化的指令進(jìn)行解釋,獲取所述轉(zhuǎn)化的指令對(duì)應(yīng)的指令,執(zhí)行所述指令。9.一種文件加固裝置,包括: 預(yù)置模塊,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行轉(zhuǎn)化并在庫(kù)文件中注冊(cè); 庫(kù)文件調(diào)用模塊,用于在系統(tǒng)調(diào)用目標(biāo)函數(shù)時(shí),通過(guò)所述庫(kù)文件確定注冊(cè)的本地函數(shù); 指令解釋模塊,用于依據(jù)所述注冊(cè)的本地函數(shù)確定目標(biāo)函數(shù),通過(guò)預(yù)設(shè)的解釋器對(duì)所述目標(biāo)函數(shù)中的各指令依次進(jìn)行解釋執(zhí)行。10.如權(quán)利要求9所述的裝置,其特征在于,所述預(yù)置模塊,包括: 存儲(chǔ)子模塊,用于預(yù)先對(duì)目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)進(jìn)行存儲(chǔ); 轉(zhuǎn)換子模塊,用于將目標(biāo)可執(zhí)行文件中的目標(biāo)函數(shù)轉(zhuǎn)換成本地函數(shù); 注冊(cè)子模塊,用于在庫(kù)文件中對(duì)本地函數(shù)進(jìn)行注冊(cè)。
【文檔編號(hào)】G06F21/60GK105930735SQ201610258681
【公開(kāi)日】2016年9月7日
【申請(qǐng)日】2016年4月22日
【發(fā)明人】劉敏, 周亞金, 丁昌坤
【申請(qǐng)人】北京奇虎科技有限公司, 奇智軟件(北京)有限公司