本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,具體涉及一種在線補(bǔ)丁激活的方法和裝置。
背景技術(shù):
在操作系統(tǒng)中,跳轉(zhuǎn)指令可以改變程序執(zhí)行流程,例如在線補(bǔ)丁,在線補(bǔ)丁的目的是在不丟失程序舊版本的情況下使用補(bǔ)丁函數(shù)代替程序舊版本中待打補(bǔ)丁的函數(shù),用于修復(fù)程序舊版本的缺陷或增強(qiáng)舊版本的功能。其基本原理是將程序舊版本中待打補(bǔ)丁函數(shù)的入口位置處的指令替換為跳轉(zhuǎn)指令,當(dāng)操作系統(tǒng)執(zhí)行到程序舊版本待打補(bǔ)丁函數(shù)入口時(shí),跳轉(zhuǎn)指令將使得操作系統(tǒng)跳轉(zhuǎn)到補(bǔ)丁函數(shù)入口處,執(zhí)行補(bǔ)丁函數(shù)。
目前,實(shí)現(xiàn)在線補(bǔ)丁激活的方法有很多,其中,一種具體的實(shí)現(xiàn)方法為長(zhǎng)跳轉(zhuǎn)方法,長(zhǎng)跳轉(zhuǎn)方法可以通過(guò)寄存器實(shí)現(xiàn),首先將目標(biāo)地址寫(xiě)入寄存器,然后跳轉(zhuǎn)到寄存器中的目標(biāo)地址執(zhí)行新的指令,但是該長(zhǎng)跳轉(zhuǎn)方法需要多條指令才能完成跳轉(zhuǎn)。
從上可知,使用長(zhǎng)跳轉(zhuǎn)方法實(shí)現(xiàn)在線補(bǔ)丁激活,需要替換程序舊版本待打補(bǔ)丁函數(shù)入口處的多條指令,如果在指令替換時(shí)某些線程正在或?qū)⒁獔?zhí)行這些被替換指令的部分或全部,則可能造成線程執(zhí)行未知指令,引起操作系統(tǒng)異常。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供了一種在線補(bǔ)丁激活的方法和裝置,能夠在激活在線補(bǔ)丁的過(guò)程中提高操作系統(tǒng)的安全性。
本發(fā)明實(shí)施例的第一方面公開(kāi)了一種在線補(bǔ)丁激活的方法,所述方法包括:
定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令;將包含補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表,并獲取所述信息在所述跳轉(zhuǎn)表中的索引;將所述跳轉(zhuǎn)表地址寫(xiě)入寄存器;獲取所述待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,并構(gòu)造一條長(zhǎng)度小于或等于所述待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,所述短指令包含所述寄存器的標(biāo)識(shí)和所述索引;將所述待打補(bǔ)丁函數(shù)的第一條入口指令替換為所述短指令,使得所述待打補(bǔ)丁函數(shù)被調(diào)用時(shí),所述短指令被執(zhí)行,所述補(bǔ)丁函數(shù)被激活。
結(jié)合第一方面,在第一方面的第一種實(shí)現(xiàn)方式中,所述將包含補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表包括:
將所述補(bǔ)丁函數(shù)地址寫(xiě)入跳轉(zhuǎn)表;
獲取所述信息在所述跳轉(zhuǎn)表中的索引包括:
獲取所述補(bǔ)丁函數(shù)地址在所述跳轉(zhuǎn)表中的索引。
結(jié)合第一方面,在第一方面的第二種實(shí)現(xiàn)方式中,所述將包含補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表包括:
將跳轉(zhuǎn)到所述補(bǔ)丁函數(shù)的地址的跳轉(zhuǎn)指令寫(xiě)入跳轉(zhuǎn)表;
獲取所述信息在所述跳轉(zhuǎn)表中的索引包括:
獲取所述跳轉(zhuǎn)指令在所述跳轉(zhuǎn)表中的索引。
結(jié)合第一方面或第一方面的第一種實(shí)現(xiàn)方式或第一方面的第二種實(shí)現(xiàn)方式,在第一方面的第三種實(shí)現(xiàn)方式中,所述跳轉(zhuǎn)表用于存儲(chǔ)至少一條包含補(bǔ)丁函數(shù)地址的信息。
本發(fā)明實(shí)施例的第二方面公開(kāi)了一種在線補(bǔ)丁激活的裝置,所述裝置包括:
定位單元,用于定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令;寫(xiě)入單元,將包含所述補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表,將所述跳轉(zhuǎn)表地址寫(xiě)入寄存器,所述補(bǔ)丁函數(shù)地址是由所述定位單元定位的;獲取單元,用于獲取所述寫(xiě)入單元寫(xiě)入的信息在所述跳轉(zhuǎn)表中的索引;獲取所述定位單元定位的待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度;構(gòu)造單元,用于構(gòu)造一條長(zhǎng)度小于或等于所述待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,所述短指令包含所述寄存器的標(biāo)識(shí)和所述索引,所述待打補(bǔ)丁函數(shù)的第一條入口指令是由所述定位單元定位的;替換單元,用于將所述待打補(bǔ)丁函數(shù)的第一條入口指令替換為所述構(gòu)造單元構(gòu)造的短指令;執(zhí)行單元,用于在所述待打補(bǔ)丁函數(shù)被調(diào)用時(shí),執(zhí)行替換單元替換的短指令,激活所述補(bǔ)丁函數(shù)。
結(jié)合第二方面,在第二方面的第一種實(shí)現(xiàn)方式中,所述寫(xiě)入單元具體用于:
將定位單位定位的所述補(bǔ)丁函數(shù)的地址寫(xiě)入跳轉(zhuǎn)表;
所述獲取單元具體用于:
獲取所述補(bǔ)丁函數(shù)定制在所述跳轉(zhuǎn)表中的索引。
結(jié)合第二方面,在第二方面的第二種實(shí)現(xiàn)方式中,所述寫(xiě)入單元具體用于:
將可以跳轉(zhuǎn)到補(bǔ)丁函數(shù)的地址的跳轉(zhuǎn)指令寫(xiě)入跳轉(zhuǎn)表;
所述獲取單元具體用于:
獲取所述跳轉(zhuǎn)指令定制在所述跳轉(zhuǎn)表中的索引。
從上可知,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的方法和裝置,可以在只替換程序舊版本待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的方法流程圖;
圖2為本發(fā)明另一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的方法流程圖;
圖3為本發(fā)明另一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的方法流程圖;
圖4為本發(fā)明一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的裝置結(jié)構(gòu)圖;
圖5為本發(fā)明另一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的裝置結(jié)構(gòu)圖;
圖6為本發(fā)明另一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的裝置結(jié)構(gòu)圖;
圖7為本發(fā)明另一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的裝置結(jié)構(gòu)圖;
圖8為本發(fā)明另一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的裝置結(jié)構(gòu)圖;
圖9為本發(fā)明另一個(gè)實(shí)施例提供的在線補(bǔ)丁激活的裝置結(jié)構(gòu)圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
圖1描述了本發(fā)明實(shí)施例的一種在線補(bǔ)丁激活的方法,該方法描述的是短指令替換程序中待打補(bǔ)丁函數(shù)入口處第一條指令的過(guò)程,該方法具體包括:
101、定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令。
在線補(bǔ)丁是指程序運(yùn)行中不需要重啟程序而生效的補(bǔ)丁,廣泛應(yīng)用于各類(lèi)軟件。在待打補(bǔ)丁程序運(yùn)行時(shí),在線補(bǔ)丁激活線程定位補(bǔ)丁函數(shù)地址以及該程序中待打補(bǔ)丁函數(shù)的第一條入口指令。其中,在線補(bǔ)丁激活線程可以是程序內(nèi)部的線程,也可以是一個(gè)用于激活補(bǔ)丁的應(yīng)用程序的線程。
102、將包含補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表,并獲取該信息在該跳轉(zhuǎn)表中的索引。
跳轉(zhuǎn)表是在線補(bǔ)丁激活線程在內(nèi)存中開(kāi)辟的一塊空間,可以記錄包含補(bǔ)丁函數(shù)地址的信息。其中,包含補(bǔ)丁函數(shù)地址的信息可以是補(bǔ)丁函數(shù)地址,也可以跳轉(zhuǎn)到補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令。使用跳轉(zhuǎn)表可以實(shí)現(xiàn)多個(gè)補(bǔ)丁函數(shù)同時(shí)激活。
獲取該信息在該跳轉(zhuǎn)表中的索引。將包含補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表后,獲取該信息在該跳轉(zhuǎn)表中的索引或者序號(hào)??梢酝ㄟ^(guò)該序號(hào)或者索引定位該信息在該跳轉(zhuǎn)表中的位置。
103、將該跳轉(zhuǎn)表地址寫(xiě)入寄存器中。
將跳轉(zhuǎn)表地址寫(xiě)入寄存器中,無(wú)論跳轉(zhuǎn)表放置在內(nèi)存中什么位置,都可以通過(guò)訪問(wèn)寄存器,讀取跳轉(zhuǎn)表的地址,再通過(guò)跳轉(zhuǎn)表獲得各個(gè)包含補(bǔ)丁函數(shù)地址的信息。其中,可以將跳轉(zhuǎn)表的首地址寫(xiě)入寄存器中,寄存器可以是基址寄存器。
104、獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,并構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引。
在不同操作系統(tǒng)中,實(shí)現(xiàn)相同功能的指令的長(zhǎng)度也有可能是不同的。獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引。其中,在該短指令被執(zhí)行時(shí),可以獲取寄存器中的跳轉(zhuǎn)表首地址,通過(guò)跳轉(zhuǎn)表的首地址和索引便可以定位補(bǔ)丁函數(shù)入口地址。
在跳轉(zhuǎn)表只有一張的時(shí)候,可以通過(guò)一個(gè)基址寄存器記錄該跳轉(zhuǎn)表的首地址,在短指令中可以寫(xiě)包含補(bǔ)丁函數(shù)地址的信息在跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),就會(huì)去默認(rèn)的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合該信息在該跳轉(zhuǎn)表中的索引就可以定位補(bǔ)丁函數(shù)的入口。其中,跳轉(zhuǎn)表可存儲(chǔ)一定量的包含補(bǔ)丁函數(shù)地址的信息,例如跳轉(zhuǎn)表可以存儲(chǔ)10條該信息,從而使得索引的長(zhǎng)度較短。
在跳轉(zhuǎn)表有多張時(shí),需要通過(guò)多個(gè)基址寄存器來(lái)記錄多張?zhí)D(zhuǎn)表的首地址,在短指令中就需要寫(xiě)入跳轉(zhuǎn)表所對(duì)應(yīng)的基址寄存器和包含補(bǔ)丁函數(shù)地址的信息在該跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),通過(guò)短指令中的記錄的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合包含補(bǔ)丁函數(shù)地址的信息在跳轉(zhuǎn)表中的索引定位補(bǔ)丁函數(shù)入口。
該短指令通過(guò)基址寄存器實(shí)現(xiàn)了長(zhǎng)跳轉(zhuǎn),由于該短指令小于或等于待打補(bǔ)丁函數(shù)入口處第一條指令長(zhǎng)度,可保證順利實(shí)現(xiàn)在線補(bǔ)丁的激活。
105、將該待打補(bǔ)丁函數(shù)的第一條入口指令替換為該短指令,使得該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),該短指令被執(zhí)行,該補(bǔ)丁函數(shù)被激活。
由于程序中待打補(bǔ)丁函數(shù)的入口處有很多條指令,如果要替換多條指令,那么在替換過(guò)程中,可能出現(xiàn)某些需要替換的指令在被某些線程執(zhí)行,則可能造成線程執(zhí)行未知指令,引起操作系統(tǒng)異常。
將程序中待打補(bǔ)丁函數(shù)入口處的第一條指令替換為該短指令,該短指令的長(zhǎng)度不超過(guò)該第一條入口指令的長(zhǎng)度,那么在替換過(guò)程中不會(huì)影響到其他指令,可以保證在線補(bǔ)丁順利激活,也可以保證操作系統(tǒng)安全運(yùn)行。其中,該短指令中的寄存器標(biāo)識(shí)和索引都較短,可以保證該短指令的長(zhǎng)度不超過(guò)該第一條入口指令的長(zhǎng)度。
在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),作為該待打補(bǔ)丁函數(shù)入口處第一條指令的短指令被執(zhí)行,該短指令會(huì)被解析,根據(jù)解析的內(nèi)容去訪問(wèn)默認(rèn)的或者短指令記錄的基址寄存器,獲取該基址寄存器中存儲(chǔ)的跳轉(zhuǎn)表首地址,根據(jù)該跳轉(zhuǎn)表首地址和該短指令中記錄的包含補(bǔ)丁函數(shù)地址的信息在跳轉(zhuǎn)表中的索引,獲得補(bǔ)丁函數(shù)入口地址,跳轉(zhuǎn)到補(bǔ)丁函數(shù)入口,并執(zhí)行函數(shù)補(bǔ)丁,使得補(bǔ)丁函數(shù)被激活。
從上可知,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的方法,可以在只替換程序中待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
圖2描述了本發(fā)明實(shí)施例的一種在線補(bǔ)丁激活的方法,該方法描述的是短指令替換程序中待打補(bǔ)丁函數(shù)入口處第一條指令的過(guò)程,該方法具體包括:
201、定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令。
在線補(bǔ)丁是指程序運(yùn)行中不需要重啟程序而生效的補(bǔ)丁,廣泛應(yīng)用于各類(lèi)軟件。在待打補(bǔ)丁程序運(yùn)行時(shí),在線補(bǔ)丁激活線程定位補(bǔ)丁函數(shù)的地址以及該程序中待打補(bǔ)丁函數(shù)的第一條入口指令。其中,在線補(bǔ)丁激活線程可以是程序內(nèi)部的線程,也可以是一個(gè)用于激活補(bǔ)丁的應(yīng)用程序的線程。
202、將補(bǔ)丁函數(shù)地址寫(xiě)入跳轉(zhuǎn)表,并獲取該補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引。
跳轉(zhuǎn)表是在線補(bǔ)丁激活線程在內(nèi)存中開(kāi)辟的一塊空間,可以記錄補(bǔ)丁函數(shù)地址。使用跳轉(zhuǎn)表可以實(shí)現(xiàn)多個(gè)補(bǔ)丁函數(shù)同時(shí)激活。
獲取該補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引。將該補(bǔ)丁函數(shù)地址寫(xiě)入跳轉(zhuǎn)表后,獲取該補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引或者序號(hào)??梢酝ㄟ^(guò)該序號(hào)或索引定位該補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的位置。
203、將該跳轉(zhuǎn)表地址寫(xiě)入寄存器中。
將跳轉(zhuǎn)表地址寫(xiě)入寄存器中,無(wú)論跳轉(zhuǎn)表放置在內(nèi)存中什么位置,都可以通過(guò)訪問(wèn)寄存器,讀取跳轉(zhuǎn)表的地址,再通過(guò)跳轉(zhuǎn)表獲得各個(gè)補(bǔ)丁函數(shù)地址。其中,可以將跳轉(zhuǎn)表的首地址寫(xiě)入寄存器中,寄存器可以是基址寄存器。
204、獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,并構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引。
在不同操作系統(tǒng)中,實(shí)現(xiàn)相同功能的指令的長(zhǎng)度也有可能是不同的。獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引。其中,在該短指令被執(zhí)行時(shí),可以獲取寄存器中的跳轉(zhuǎn)表首地址,通過(guò)跳轉(zhuǎn)表的首地址和索引便可以定位補(bǔ)丁函數(shù)入口地址。
在跳轉(zhuǎn)表只有一張的時(shí)候,可以通過(guò)一個(gè)基址寄存器記錄該跳轉(zhuǎn)表的首地址,在短指令中可以寫(xiě)補(bǔ)丁函數(shù)地址在跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),就會(huì)去默認(rèn)的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合該索引就可以定位補(bǔ)丁函數(shù)的入口。其中,跳轉(zhuǎn)表可存儲(chǔ)一定量的補(bǔ)丁函數(shù)地址,例如一張?zhí)D(zhuǎn)表可以存儲(chǔ)5條或10條補(bǔ)丁函數(shù)地址,從而使得索引的長(zhǎng)度較短。
在跳轉(zhuǎn)表有多張時(shí),需要通過(guò)多個(gè)基址寄存器來(lái)記錄多張?zhí)D(zhuǎn)表的首地址,在短指令中就需要寫(xiě)入跳轉(zhuǎn)表所對(duì)應(yīng)的基址寄存器和補(bǔ)丁函數(shù)地址該跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),通過(guò)短指令中的記錄的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合補(bǔ)丁函數(shù)地址在跳轉(zhuǎn)表中的索引定位補(bǔ)丁函數(shù)入口。
該短指令通過(guò)基址寄存器實(shí)現(xiàn)了長(zhǎng)跳轉(zhuǎn),由于該短指令小于或等于待打補(bǔ)丁函數(shù)入口處第一條指令長(zhǎng)度,可保證順利實(shí)現(xiàn)在線補(bǔ)丁的激活。
205、將該待打補(bǔ)丁函數(shù)的第一條入口指令替換為該短指令,使得該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),該短指令被執(zhí)行,該補(bǔ)丁函數(shù)被激活。
由于程序中待打補(bǔ)丁函數(shù)的入口處有很多條指令,如果要替換多條指令,那么在替換過(guò)程中,可能出現(xiàn)某些需要替換的指令在被某些線程執(zhí)行,則可能造成線程執(zhí)行未知指令,引起操作系統(tǒng)異常。
將程序中待打補(bǔ)丁函數(shù)入口處的第一條指令替換為該短指令,該短指令的長(zhǎng)度不超過(guò)該第一條入口指令的長(zhǎng)度,那么在替換過(guò)程中不會(huì)影響到其他指令,可以保證在線補(bǔ)丁順利激活,也可以保證操作系統(tǒng)安全運(yùn)行。其中,該短指令中的寄存器標(biāo)識(shí)和索引都較短,可以保證該短指令的長(zhǎng)度不超過(guò)該第一條入口指令的長(zhǎng)度。
在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),作為該待打補(bǔ)丁函數(shù)入口處第一條指令的短指令被執(zhí)行,該短指令會(huì)被解析,根據(jù)解析的內(nèi)容去訪問(wèn)默認(rèn)的或者短指令記錄的基址寄存器,獲取該基址寄存器中存儲(chǔ)的跳轉(zhuǎn)表首地址,根據(jù)該跳轉(zhuǎn)表首地址和該短指令中記錄的補(bǔ)丁函數(shù)地址在跳轉(zhuǎn)表中的索引,獲得補(bǔ)丁函數(shù)入口地址,跳轉(zhuǎn)到補(bǔ)丁函數(shù)入口,并執(zhí)行函數(shù)補(bǔ)丁,使得補(bǔ)丁函數(shù)被激活。
從上可知,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的方法,可以在只替換程序中待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
圖3描述了本發(fā)明實(shí)施例的另一種在線補(bǔ)丁激活的方法,該方法具體包括:
301、定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令。
在線補(bǔ)丁是指程序運(yùn)行中不需要重啟程序而生效的補(bǔ)丁,廣泛應(yīng)用于各類(lèi)軟件。在待打補(bǔ)丁程序的運(yùn)行時(shí),在線補(bǔ)丁激活線程定位補(bǔ)丁函數(shù)的地址以及該程序中待打補(bǔ)丁函數(shù)的第一條入口指令。其中,在線補(bǔ)丁激活線程可以是程序內(nèi)部的線程,也可以是一個(gè)用于激活補(bǔ)丁的應(yīng)用程序的線程。
302、將跳轉(zhuǎn)到補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令寫(xiě)入跳轉(zhuǎn)表,并獲取該跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引。
跳轉(zhuǎn)表是在線補(bǔ)丁激活線程在內(nèi)存中開(kāi)辟的一塊空間,可以存儲(chǔ)跳轉(zhuǎn)到補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令。使用跳轉(zhuǎn)表可以實(shí)現(xiàn)多個(gè)補(bǔ)丁函數(shù)同時(shí)激活。
獲取該跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引。將該跳轉(zhuǎn)指令寫(xiě)入跳轉(zhuǎn)表后,獲取該跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引或者序號(hào)??梢酝ㄟ^(guò)該序號(hào)或索引定位該跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的位置。
303、將該跳轉(zhuǎn)表地址寫(xiě)入寄存器中。
將跳轉(zhuǎn)表地址寫(xiě)入寄存器中,無(wú)論跳轉(zhuǎn)表放置在內(nèi)存中什么位置,都可以通過(guò)訪問(wèn)寄存器,讀取跳轉(zhuǎn)表的地址,再通過(guò)跳轉(zhuǎn)表獲得各跳轉(zhuǎn)指令。其中,可以將跳轉(zhuǎn)表的首地址寫(xiě)入寄存器中,寄存器可以是基址寄存器。
304、獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,并構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引。
在不同操作系統(tǒng)中,實(shí)現(xiàn)相同功能的指令的長(zhǎng)度也有可能是不同的。獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引。其中,在該短指令被執(zhí)行時(shí),可以獲取寄存器中的跳轉(zhuǎn)表首地址,通過(guò)跳轉(zhuǎn)表的首地址和索引便可以定位補(bǔ)丁函數(shù)入口地址。
在跳轉(zhuǎn)表只有一張的時(shí)候,可以通過(guò)一個(gè)基址寄存器記錄該跳轉(zhuǎn)表的首地址,在短指令中可以寫(xiě)跳轉(zhuǎn)指令在跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),就會(huì)去默認(rèn)的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合該跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引就可以定位補(bǔ)丁函數(shù)的入口。其中,跳轉(zhuǎn)表可存儲(chǔ)一定量的跳轉(zhuǎn)指令,從而使得索引的長(zhǎng)度較短,例如每個(gè)跳轉(zhuǎn)表最多記錄10條指令。在跳轉(zhuǎn)表有多張時(shí),需要通過(guò)多個(gè)基址寄存器來(lái)記錄多張?zhí)D(zhuǎn)表的首地址,在短指令中就需要寫(xiě)入跳轉(zhuǎn)表所對(duì)應(yīng)的基址寄存器和跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),通過(guò)短指令中的記錄的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合包含跳轉(zhuǎn)指令在跳轉(zhuǎn)表中的索引定位補(bǔ)丁函數(shù)入口。
該短指令通過(guò)基址寄存器實(shí)現(xiàn)了長(zhǎng)跳轉(zhuǎn),由于該短指令小于待打補(bǔ)丁函數(shù)入口處第一條指令長(zhǎng)度,可保證順利實(shí)現(xiàn)在線補(bǔ)丁的激活。
305、將該待打補(bǔ)丁函數(shù)的第一條入口指令替換為該短指令,使得該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),該短指令被執(zhí)行,該補(bǔ)丁函數(shù)被激活。
由于程序中待打補(bǔ)丁函數(shù)的入口處有很多條指令,如果要替換多條指令,那么在替換過(guò)程中,可能出現(xiàn)某些需要替換的指令在被某些線程執(zhí)行,則可能造成線程執(zhí)行未知指令,引起操作系統(tǒng)異常。
將程序中待打補(bǔ)丁函數(shù)入口處的第一條指令替換為該短指令,該短指令的長(zhǎng)度不超過(guò)該第一條入口指令的長(zhǎng)度,那么在替換過(guò)程中不會(huì)影響到其他指令,可以保證在線補(bǔ)丁順利激活,也可以保證操作系統(tǒng)安全運(yùn)行。其中,該短指令中的寄存器標(biāo)識(shí)和索引都較短,可以保證該短指令的長(zhǎng)度不超過(guò)該第一條入口指令的長(zhǎng)度。
在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),作為該待打補(bǔ)丁函數(shù)入口處第一條指令的短指令被執(zhí)行,該短指令會(huì)被解析,根據(jù)解析的內(nèi)容去訪問(wèn)默認(rèn)的或者短指令記錄的基址寄存器,獲取該基址寄存器中存儲(chǔ)的跳轉(zhuǎn)表首地址,根據(jù)該跳轉(zhuǎn)表首地址和該短指令中記錄的跳轉(zhuǎn)指令在跳轉(zhuǎn)表中的索引,獲得跳轉(zhuǎn)指令,再根據(jù)跳轉(zhuǎn)指令跳轉(zhuǎn)到補(bǔ)丁函數(shù)入口,并執(zhí)行函數(shù)補(bǔ)丁,使得補(bǔ)丁函數(shù)被激活。
從上可知,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的方法,可以在只替換程序中待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
圖4描述了本發(fā)明實(shí)施例的一種在線補(bǔ)丁激活的裝置,該裝置具體包括:
定位單元401、寫(xiě)入單元402、獲取單元403、構(gòu)造單元404、替換單元405、執(zhí)行單元406。
定位單元401,用于定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令。
在待打補(bǔ)丁程序的運(yùn)行時(shí),定位單元401定位補(bǔ)丁函數(shù)的地址以及待打補(bǔ)丁函數(shù)的入口地址,以便可以通過(guò)后續(xù)的操作使得待打補(bǔ)丁函數(shù)的第一條入口指令與補(bǔ)丁函數(shù)地址發(fā)生關(guān)聯(lián)。
寫(xiě)入單元402,用于在定位單元401定位補(bǔ)丁函數(shù)的地址時(shí),將包含該補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表,將該跳轉(zhuǎn)表地址寫(xiě)入寄存器,該補(bǔ)丁函數(shù)地址是由定位單元401定位的。
在定位單元401定位補(bǔ)丁函數(shù)的地址時(shí),寫(xiě)入單元402將包含補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表,再將該跳轉(zhuǎn)表的地址寫(xiě)入寄存器。其中包含補(bǔ)丁函數(shù)地址的信息可以是補(bǔ)丁函數(shù)地址,也可以是跳轉(zhuǎn)到補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令。無(wú)論跳轉(zhuǎn)表放置在內(nèi)存中什么位置,都可以通過(guò)訪問(wèn)寄存器,讀取跳轉(zhuǎn)表的地址,再通過(guò)跳轉(zhuǎn)表獲得各個(gè)補(bǔ)丁函數(shù)的入口地址。其中,可以將跳轉(zhuǎn)表的首地址寫(xiě)入寄存器中,寄存器可以是基址寄存器。其中,該跳轉(zhuǎn)表可以用來(lái)存儲(chǔ)至少一個(gè)補(bǔ)丁函數(shù)的地址,可以實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)激活。
獲取單元403,用于獲取寫(xiě)入單元402寫(xiě)入的包含補(bǔ)丁函數(shù)地址的信息在該跳轉(zhuǎn)表中的索引;獲取定位單元401定位的待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。
獲取單元403獲取寫(xiě)入單元402寫(xiě)入的包含補(bǔ)丁函數(shù)地址的信息在該跳轉(zhuǎn)表中的索引。將該信息寫(xiě)入跳轉(zhuǎn)表后,獲取該信息在該跳轉(zhuǎn)表中的索引或者序號(hào)??梢酝ㄟ^(guò)該序號(hào)定位該信息在該跳轉(zhuǎn)表中的位置。
獲取單元403獲取定位單元401定位的待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。在不同操作系統(tǒng)中,實(shí)現(xiàn)相同功能的指令的長(zhǎng)度也有可能是不同的,因此需要獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。
構(gòu)造單元404,用于構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引,該待打補(bǔ)丁函數(shù)的第一條入口指令是由該定位單元定位的。
構(gòu)造單元404構(gòu)造一條可以實(shí)現(xiàn)長(zhǎng)跳轉(zhuǎn)的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引,可通過(guò)該寄存器的標(biāo)識(shí)獲取寄存器中的跳轉(zhuǎn)表首地址,通過(guò)跳轉(zhuǎn)表的首地址和該索引便可以定位補(bǔ)丁函數(shù)入口地址。其中,該短指令的長(zhǎng)度小于或者等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度。
在跳轉(zhuǎn)表只有一張的時(shí)候,可以通過(guò)一個(gè)基址寄存器記錄該跳轉(zhuǎn)表的首地址,在短指令中可以寫(xiě)包含補(bǔ)丁函數(shù)地址的信息在跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),就會(huì)去默認(rèn)的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合該信息在該跳轉(zhuǎn)表中的索引就可以定位補(bǔ)丁函數(shù)的入口。其中,跳轉(zhuǎn)表可存儲(chǔ)一定量的包含補(bǔ)丁函數(shù)地址的信息,從而使得索引的長(zhǎng)度較短。在跳轉(zhuǎn)表有多張時(shí),需要通過(guò)多個(gè)基址寄存器來(lái)記錄多張?zhí)D(zhuǎn)表的首地址,在短指令中就需要寫(xiě)入跳轉(zhuǎn)表所對(duì)應(yīng)的基址寄存器和包含補(bǔ)丁函數(shù)地址的信息在該跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),通過(guò)短指令中的記錄的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合包含補(bǔ)丁函數(shù)地址的信息在跳轉(zhuǎn)表中的索引定位補(bǔ)丁函數(shù)入口。
該短指令通過(guò)基址寄存器實(shí)現(xiàn)了長(zhǎng)跳轉(zhuǎn),由于該短指令小于待打補(bǔ)丁函數(shù)入口處第一條指令長(zhǎng)度,可保證順利實(shí)現(xiàn)在線補(bǔ)丁的激活。
替換單元405,用于將該待打補(bǔ)丁函數(shù)入口位置處的第一條指令替換為構(gòu)造單元404構(gòu)造的短指令。
由于待打補(bǔ)丁函數(shù)入口處有很多條指令,如果需要替換多條指令,那么在替換過(guò)程中,可能出現(xiàn)某些需要替換的指令在被某些線程執(zhí)行,則可能造成線程執(zhí)行未知指令,引起操作系統(tǒng)異常。
替換單元405將待打補(bǔ)丁函數(shù)入口處的第一條指令替換為構(gòu)造單元404構(gòu)造的短指令,該短指令的長(zhǎng)度不超過(guò)該第一條指令的長(zhǎng)度,那么在替換過(guò)程中不會(huì)影響到其他指令,可以保證在線補(bǔ)丁順利激活,也可以保證操作系統(tǒng)安全運(yùn)行。
執(zhí)行單元406,用于在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),執(zhí)行替換單元405替換的短指令,激活補(bǔ)丁函數(shù)。
在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),作為該待打補(bǔ)丁函數(shù)入口處第一條指令的短指令被執(zhí)行,該短指令會(huì)被解析,根據(jù)解析的內(nèi)容去訪問(wèn)默認(rèn)的或者短指令記錄的基址寄存器,獲取該基址寄存器中存儲(chǔ)的跳轉(zhuǎn)表首地址,根據(jù)該跳轉(zhuǎn)表首地址和該短指令中記錄的包含補(bǔ)丁函數(shù)地址的信息在跳轉(zhuǎn)表中的索引,獲得補(bǔ)丁函數(shù)入口地址,跳轉(zhuǎn)到補(bǔ)丁函數(shù)入口,并執(zhí)行函數(shù)補(bǔ)丁,使得補(bǔ)丁函數(shù)被激活。
從上可知,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的裝置,可以在只替換程序舊版本待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
圖5描述了本發(fā)明實(shí)施例的一種在線補(bǔ)丁激活的裝置,該裝置具體包括:
定位單元501,第一寫(xiě)入單元502、獲取單元503、構(gòu)造單元504、替換單元505、執(zhí)行單元506。
定位單元501,用于定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令。
在待打補(bǔ)丁程序的運(yùn)行時(shí),定位單元501定位補(bǔ)丁函數(shù)的地址以及待打補(bǔ)丁函數(shù)的入口地址,以便可以通過(guò)后續(xù)的操作使得待打補(bǔ)丁函數(shù)的第一條入口指令與補(bǔ)丁函數(shù)地址發(fā)生關(guān)聯(lián)。
第一寫(xiě)入單元502,用于在定位單元501定位補(bǔ)丁函數(shù)的地址時(shí),將補(bǔ)丁函數(shù)地址寫(xiě)入跳轉(zhuǎn)表,將該跳轉(zhuǎn)表地址寫(xiě)入寄存器。
在定位單元501定位補(bǔ)丁函數(shù)的地址時(shí),第一寫(xiě)入單元502將該補(bǔ)丁函數(shù)地址寫(xiě)入跳轉(zhuǎn)表,再將該跳轉(zhuǎn)表的地址寫(xiě)入寄存器。其中,無(wú)論跳轉(zhuǎn)表放置在內(nèi)存中什么位置,都可以通過(guò)訪問(wèn)寄存器,讀取跳轉(zhuǎn)表的地址,再通過(guò)跳轉(zhuǎn)表獲得各個(gè)補(bǔ)丁函數(shù)的入口地址。其中,可以將跳轉(zhuǎn)表的首地址寫(xiě)入寄存器中,寄存器可以是基址寄存器。其中,該跳轉(zhuǎn)表可以用來(lái)存儲(chǔ)至少一個(gè)補(bǔ)丁函數(shù)的地址,可以實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)激活。
獲取單元503,用于獲取第一寫(xiě)入單元502寫(xiě)入的該補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引;獲取定位單元501定位的待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。
各個(gè)程序的補(bǔ)丁函數(shù)地址在跳轉(zhuǎn)表的索引可以確定各個(gè)補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表的位置,通過(guò)該跳轉(zhuǎn)表的首地址和各個(gè)補(bǔ)丁函數(shù)地址的索引,可以確定各個(gè)補(bǔ)丁函數(shù)在內(nèi)存中的具體位置。
獲取第一寫(xiě)入單元502寫(xiě)入的補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引。將該補(bǔ)丁函數(shù)地址寫(xiě)入跳轉(zhuǎn)表后,獲取該補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引或者序號(hào)。可以通過(guò)該序號(hào)定位該補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的位置。
獲取定位單元501定位的待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。在不同操作系統(tǒng)中,實(shí)現(xiàn)相同功能的指令的長(zhǎng)度也有可能是不同的,因此需要獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。
構(gòu)造單元504,用于構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引,該待打補(bǔ)丁函數(shù)的第一條入口指令是由該定位單元定位的。
構(gòu)造單元504構(gòu)造一條可以實(shí)現(xiàn)長(zhǎng)跳轉(zhuǎn)的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引,可通過(guò)該寄存器的標(biāo)識(shí)獲取寄存器中的跳轉(zhuǎn)表首地址,通過(guò)跳轉(zhuǎn)表的首地址和該索引便可以定位補(bǔ)丁函數(shù)入口地址。其中,該短指令的長(zhǎng)度小于或者等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度。
在跳轉(zhuǎn)表只有一張的時(shí)候,可以通過(guò)一個(gè)基址寄存器記錄該跳轉(zhuǎn)表的首地址,在短指令中可以寫(xiě)補(bǔ)丁函數(shù)地址在跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),就會(huì)去默認(rèn)的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引就可以定位補(bǔ)丁函數(shù)的入口。其中,跳轉(zhuǎn)表可存儲(chǔ)一定量的補(bǔ)丁函數(shù)地址,從而使得索引的長(zhǎng)度較短。在跳轉(zhuǎn)表有多張時(shí),需要通過(guò)多個(gè)基址寄存器來(lái)記錄多張?zhí)D(zhuǎn)表的首地址,在短指令中就需要寫(xiě)入跳轉(zhuǎn)表所對(duì)應(yīng)的基址寄存器和補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),通過(guò)短指令中的記錄的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合補(bǔ)丁函數(shù)地址在跳轉(zhuǎn)表中的索引定位補(bǔ)丁函數(shù)入口。
該短指令通過(guò)基址寄存器實(shí)現(xiàn)了長(zhǎng)跳轉(zhuǎn),由于該短指令小于或等于待打補(bǔ)丁函數(shù)入口處第一條指令長(zhǎng)度,可保證順利實(shí)現(xiàn)在線補(bǔ)丁的激活。
替換單元505,用于將該待打補(bǔ)丁函數(shù)入口位置處的第一條指令替換為構(gòu)造單元504構(gòu)造的短指令。
由于待打補(bǔ)丁函數(shù)入口處有很多條指令,如果需要替換多條指令,那么在替換過(guò)程中,可能出現(xiàn)某些需要替換的指令在被某些線程執(zhí)行,則可能造成線程執(zhí)行未知指令,引起操作系統(tǒng)異常。
替換單元505,將待打補(bǔ)丁函數(shù)入口處的第一條指令替換為構(gòu)造單元504構(gòu)造的短指令,該短指令的長(zhǎng)度不超過(guò)該第一條指令的長(zhǎng)度,那么在替換過(guò)程中不會(huì)影響到其他指令,可以保證在線補(bǔ)丁順利激活,也可以保證操作系統(tǒng)安全運(yùn)行。
執(zhí)行單元506,用于在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),執(zhí)行替換單元505替換的短指令,激活補(bǔ)丁函數(shù)。
在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),作為該待打補(bǔ)丁函數(shù)入口處第一條指令的短指令被執(zhí)行,該短指令會(huì)被解析,根據(jù)解析的內(nèi)容去訪問(wèn)默認(rèn)的或者短指令記錄的基址寄存器,獲取該基址寄存器中存儲(chǔ)的跳轉(zhuǎn)表首地址,根據(jù)該跳轉(zhuǎn)表首地址和該短指令中記錄的補(bǔ)丁函數(shù)地址在跳轉(zhuǎn)表中的索引,獲得補(bǔ)丁函數(shù)入口地址,跳轉(zhuǎn)到補(bǔ)丁函數(shù)入口,并執(zhí)行函數(shù)補(bǔ)丁,使得補(bǔ)丁函數(shù)被激活。
從上可知,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的裝置,可以在只替換程序待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
圖6描述了本發(fā)明實(shí)施例的一種在線補(bǔ)丁激活的裝置,該裝置具體包括:
定位單元601、第二寫(xiě)入單元602、獲取單元603、構(gòu)造單元604、替換單元605、跳轉(zhuǎn)單元606。
定位單元601,用于定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令。
在待打補(bǔ)丁程序的運(yùn)行時(shí),定位單元601定位補(bǔ)丁函數(shù)的地址以及待打補(bǔ)丁函數(shù)的入口地址,以便可以通過(guò)后續(xù)的操作使得待打補(bǔ)丁函數(shù)的第一條入口指令與補(bǔ)丁函數(shù)地址發(fā)生關(guān)聯(lián)。
第二寫(xiě)入單元602,用于在定位單元601定位補(bǔ)丁函數(shù)的地址時(shí),將跳轉(zhuǎn)到補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令寫(xiě)入跳轉(zhuǎn)表,將該跳轉(zhuǎn)表地址寫(xiě)入寄存器。
在定位單元601定位補(bǔ)丁函數(shù)的地址時(shí),第一寫(xiě)入單元602將跳轉(zhuǎn)到補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令寫(xiě)入跳轉(zhuǎn)表,再將該跳轉(zhuǎn)表的地址寫(xiě)入寄存器。其中,無(wú)論跳轉(zhuǎn)表放置在內(nèi)存中什么位置,都可以通過(guò)訪問(wèn)寄存器,讀取跳轉(zhuǎn)表的地址,再通過(guò)跳轉(zhuǎn)表獲得各個(gè)跳轉(zhuǎn)指令。其中,可以將跳轉(zhuǎn)表的首地址寫(xiě)入寄存器中,寄存器可以是基址寄存器。其中,該跳轉(zhuǎn)表可以用來(lái)存儲(chǔ)至少一個(gè)跳轉(zhuǎn)指令,可以實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)激活。
獲取單元603,用于獲取第二寫(xiě)入單元602寫(xiě)入的跳轉(zhuǎn)到該補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引;獲取定位單元601定位的待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。
獲取第二寫(xiě)入單元602寫(xiě)入的跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引。將該跳轉(zhuǎn)指令寫(xiě)入跳轉(zhuǎn)表后,獲取該跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引或者序號(hào)。可以通過(guò)該序號(hào)或該索引定位該跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的位置。
獲取定位單元601定位的待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。在不同操作系統(tǒng)中,實(shí)現(xiàn)相同功能的指令的長(zhǎng)度也有可能是不同的,因此需要獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度。
構(gòu)造單元604,用于構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引,該待打補(bǔ)丁函數(shù)的第一條入口指令是由該定位單元定位的。
構(gòu)造單元604構(gòu)造一條可以實(shí)現(xiàn)長(zhǎng)跳轉(zhuǎn)的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引,可通過(guò)該寄存器的標(biāo)識(shí)獲取寄存器中的跳轉(zhuǎn)表首地址,通過(guò)跳轉(zhuǎn)表的首地址和該索引便可以定位跳轉(zhuǎn)指令,再通過(guò)跳轉(zhuǎn)指令定位補(bǔ)丁函數(shù)的地址。其中,該短指令的長(zhǎng)度小于或者等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度。
在跳轉(zhuǎn)表只有一張的時(shí)候,可以通過(guò)一個(gè)基址寄存器記錄該跳轉(zhuǎn)表的首地址,在短指令中可以寫(xiě)跳轉(zhuǎn)到補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令在跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),就會(huì)去默認(rèn)的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引就可以定位補(bǔ)丁函數(shù)的入口。其中,跳轉(zhuǎn)表可存儲(chǔ)一定量的跳轉(zhuǎn)指令,從而使得索引的長(zhǎng)度較短。在跳轉(zhuǎn)表有多張時(shí),需要通過(guò)多個(gè)基址寄存器來(lái)記錄多張?zhí)D(zhuǎn)表的首地址,在短指令中就需要寫(xiě)入跳轉(zhuǎn)表所對(duì)應(yīng)的基址寄存器和跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引。在該短指令被執(zhí)行時(shí),通過(guò)短指令中的記錄的基址寄存器獲取跳轉(zhuǎn)表的首地址,結(jié)合跳轉(zhuǎn)指令在跳轉(zhuǎn)表中的索引定位補(bǔ)丁函數(shù)入口。
該短指令通過(guò)基址寄存器實(shí)現(xiàn)了長(zhǎng)跳轉(zhuǎn),由于該短指令小于或等于待打補(bǔ)丁函數(shù)入口處第一條指令長(zhǎng)度,可保證順利實(shí)現(xiàn)在線補(bǔ)丁的激活。
替換單元605,用于將該待打補(bǔ)丁函數(shù)入口位置處的第一條指令替換為構(gòu)造單元604構(gòu)造的短指令。
由于待打補(bǔ)丁函數(shù)入口處有很多條指令,如果需要替換多條指令,那么在替換過(guò)程中,可能出現(xiàn)某些需要替換的指令在被某些線程執(zhí)行,則可能造成線程執(zhí)行未知指令,引起操作系統(tǒng)異常。
替換單元605將待打補(bǔ)丁函數(shù)入口處的第一條指令替換為構(gòu)造單元604構(gòu)造的短指令,該短指令的長(zhǎng)度不超過(guò)該第一條指令的長(zhǎng)度,那么在替換過(guò)程中不會(huì)影響到其他指令,可以保證在線補(bǔ)丁順利激活,也可以保證操作系統(tǒng)安全運(yùn)行。
執(zhí)行單元606,用于在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),執(zhí)行替換單元605替換的短指令,激活補(bǔ)丁函數(shù)。
在該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),作為該待打補(bǔ)丁函數(shù)入口處第一條指令的短指令被執(zhí)行,該短指令會(huì)被解析,根據(jù)解析的內(nèi)容去訪問(wèn)默認(rèn)的或者短指令記錄的基址寄存器,獲取該基址寄存器中存儲(chǔ)的跳轉(zhuǎn)表首地址,根據(jù)該跳轉(zhuǎn)表首地址和該短指令中記錄的跳轉(zhuǎn)指令在跳轉(zhuǎn)表中的索引,獲得補(bǔ)丁函數(shù)入口地址,跳轉(zhuǎn)到補(bǔ)丁函數(shù)入口,并執(zhí)行函數(shù)補(bǔ)丁,使得補(bǔ)丁函數(shù)被激活。
從上可知,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的裝置,可以在只替換程序待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
圖7描述了本發(fā)明另一個(gè)實(shí)施例提供的運(yùn)行驅(qū)動(dòng)設(shè)備的結(jié)構(gòu),包括至少一個(gè)處理器701(例如CPU),存儲(chǔ)器702,內(nèi)存703和至少一個(gè)通信總線704,用于實(shí)現(xiàn)這些裝置之間的連接通信。處理器701用于執(zhí)行存儲(chǔ)器702中存儲(chǔ)的可執(zhí)行模塊,例如計(jì)算機(jī)程序。存儲(chǔ)器702可能包含高速隨機(jī)存取存儲(chǔ)器(RAM:Random Access Memory),也可能還包括非不穩(wěn)定的存儲(chǔ)器(non-volatile memory),例如至少一個(gè)磁盤(pán)存儲(chǔ)器。通過(guò)至少一個(gè)處理器訪問(wèn)內(nèi)存中的地址。
在一些實(shí)施方式中,存儲(chǔ)器702存儲(chǔ)了程序7021,程序7021可以被處理器701執(zhí)行,這個(gè)程序包括:定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令;將包含補(bǔ)丁函數(shù)地址的信息寫(xiě)入跳轉(zhuǎn)表,并獲取該信息在該跳轉(zhuǎn)表中的索引;將該跳轉(zhuǎn)表地址寫(xiě)入寄存器;獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,并構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引;將該待打補(bǔ)丁函數(shù)的第一條入口指令替換為該短指令,使得該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),該短指令被執(zhí)行,該補(bǔ)丁函數(shù)被激活。具體的實(shí)施步驟與圖1所示的實(shí)施例相同,此處不再贅述。
從本發(fā)明實(shí)施例提供的以上技術(shù)方案可以看出,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的裝置,可以在只替換程序待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
圖8描述了本發(fā)明另一個(gè)實(shí)施例提供的運(yùn)行驅(qū)動(dòng)設(shè)備的結(jié)構(gòu),包括至少一個(gè)處理器801(例如CPU),存儲(chǔ)器802,內(nèi)存803和至少一個(gè)通信總線804,用于實(shí)現(xiàn)這些裝置之間的連接通信。處理器801用于執(zhí)行存儲(chǔ)器802中存儲(chǔ)的可執(zhí)行模塊,例如計(jì)算機(jī)程序。存儲(chǔ)器802可能包含高速隨機(jī)存取存儲(chǔ)器(RAM:Random Access Memory),也可能還包括非不穩(wěn)定的存儲(chǔ)器(non-volatile memory),例如至少一個(gè)磁盤(pán)存儲(chǔ)器。通過(guò)至少一個(gè)處理器訪問(wèn)內(nèi)存中的地址。
在一些實(shí)施方式中,存儲(chǔ)器802存儲(chǔ)了程序8021,程序8021可以被處理器801執(zhí)行,這個(gè)程序包括:定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令;將補(bǔ)丁函數(shù)地址寫(xiě)入跳轉(zhuǎn)表,并獲取該補(bǔ)丁函數(shù)地址在該跳轉(zhuǎn)表中的索引;將該跳轉(zhuǎn)表地址寫(xiě)入寄存器;獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,并構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引;將該待打補(bǔ)丁函數(shù)的第一條入口指令替換為該短指令,使得該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),該短指令被執(zhí)行,該補(bǔ)丁函數(shù)被激活。具體的實(shí)施步驟與圖2所示的實(shí)施例相同,此處不再贅述。
從本發(fā)明實(shí)施例提供的以上技術(shù)方案可以看出,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的裝置,可以在只替換程序待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
圖9描述了本發(fā)明另一個(gè)實(shí)施例提供的運(yùn)行驅(qū)動(dòng)設(shè)備的結(jié)構(gòu),包括至少一個(gè)處理器901(例如CPU),存儲(chǔ)器902,內(nèi)903,和至少一個(gè)通信總線904,用于實(shí)現(xiàn)這些裝置之間的連接通信。處理器901用于執(zhí)行存儲(chǔ)器902中存儲(chǔ)的可執(zhí)行模塊,例如計(jì)算機(jī)程序。存儲(chǔ)器902可能包含高速隨機(jī)存取存儲(chǔ)器(RAM:Random Access Memory),也可能還包括非不穩(wěn)定的存儲(chǔ)器(non-volatile memory),例如至少一個(gè)磁盤(pán)存儲(chǔ)器。通過(guò)至少一個(gè)處理器訪問(wèn)內(nèi)存中的地址。
在一些實(shí)施方式中,存儲(chǔ)器902存儲(chǔ)了程序9021,程序9021可以被處理器901執(zhí)行,這個(gè)程序包括:定位補(bǔ)丁函數(shù)地址和待打補(bǔ)丁函數(shù)的第一條入口指令;將跳轉(zhuǎn)到補(bǔ)丁函數(shù)地址的跳轉(zhuǎn)指令寫(xiě)入跳轉(zhuǎn)表,并獲取該跳轉(zhuǎn)指令在該跳轉(zhuǎn)表中的索引;將該跳轉(zhuǎn)表地址寫(xiě)入寄存器;獲取該待打補(bǔ)丁函數(shù)的第一條入口指令的長(zhǎng)度,并構(gòu)造一條長(zhǎng)度小于或等于該待打補(bǔ)丁函數(shù)的第一條入口指令長(zhǎng)度的短指令,該短指令包含該寄存器的標(biāo)識(shí)和該索引;將該待打補(bǔ)丁函數(shù)的第一條入口指令替換為該短指令,使得該待打補(bǔ)丁函數(shù)被調(diào)用時(shí),該短指令被執(zhí)行,該補(bǔ)丁函數(shù)被激活。具體的實(shí)施步驟與圖3所示的實(shí)施例相同,此處不再贅述。
從本發(fā)明實(shí)施例提供的以上技術(shù)方案可以看出,使用本發(fā)明實(shí)施例提供的在線補(bǔ)丁激活的裝置,可以在只替換程序待打補(bǔ)丁函數(shù)入口處第一條指令的情況下,實(shí)現(xiàn)在線補(bǔ)丁激活,提高了操作系統(tǒng)的安全性;進(jìn)一步,由于本發(fā)明實(shí)施例提供了跳轉(zhuǎn)表,跳轉(zhuǎn)表中可以記錄多個(gè)補(bǔ)丁函數(shù)的信息,從而實(shí)現(xiàn)多個(gè)在線補(bǔ)丁同時(shí)更新,提高了用戶體驗(yàn)。
需要說(shuō)明的是,對(duì)于前述的各方法實(shí)施例,為了簡(jiǎn)單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本發(fā)明,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說(shuō)明書(shū)中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本發(fā)明所必須的。
上述裝置和系統(tǒng)內(nèi)的各模塊之間的信息交互、執(zhí)行過(guò)程等內(nèi)容,由于與本發(fā)明方法實(shí)施例基于同一構(gòu)思,具體內(nèi)容可參見(jiàn)本發(fā)明方法實(shí)施例中的敘述,此處不再贅述。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分流程,是可以通過(guò)計(jì)算機(jī)程序來(lái)指令相關(guān)的硬件來(lái)完成,上述的程序可存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),可包括如上述各方法的實(shí)施例的流程。其中,上述的存儲(chǔ)介質(zhì)可為磁碟、光盤(pán)、只讀存儲(chǔ)記憶體(ROM:Read-Only Memory)或隨機(jī)存儲(chǔ)記憶體(RAM:Random Access Memory)等。
本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。