本發(fā)明涉及軟件更新領(lǐng)域,尤其涉及一種熱補(bǔ)丁信息查詢方法以及裝置。
背景技術(shù):
隨著近年來計(jì)算技術(shù)的迅猛發(fā)展,計(jì)算機(jī)產(chǎn)品的更新?lián)Q代速度也隨之增快。目前,在軟件開發(fā)過程中,難免存在一些軟件設(shè)計(jì)方面的漏洞或用戶對(duì)該軟件的新的需求,為了不影響軟件的使用,一般以熱補(bǔ)丁的方式對(duì)該軟件進(jìn)行漏洞修復(fù)或更新,即在不中止軟件的情況下對(duì)該軟件進(jìn)行修復(fù)或更新。進(jìn)程熱補(bǔ)丁技術(shù)是對(duì)運(yùn)行中的進(jìn)程在不中斷進(jìn)程運(yùn)行的前提下對(duì)進(jìn)程加載熱補(bǔ)丁的技術(shù)。進(jìn)程熱補(bǔ)丁技術(shù)的處理方式基本是以函數(shù)為單位的,即可通過對(duì)出現(xiàn)漏洞或需要更新的函數(shù)進(jìn)行修復(fù),以實(shí)現(xiàn)對(duì)進(jìn)程的修復(fù)或更新。
進(jìn)程熱補(bǔ)丁技術(shù)由熱補(bǔ)丁制作裝置(也稱熱補(bǔ)丁制作程序)和熱補(bǔ)丁管理裝置(也稱熱補(bǔ)丁管理程序)組成。熱補(bǔ)丁制作裝置負(fù)責(zé)制作可被熱補(bǔ)丁管理裝置識(shí)別的熱補(bǔ)丁,熱補(bǔ)丁管理裝置負(fù)責(zé)對(duì)熱補(bǔ)丁和目標(biāo)進(jìn)程進(jìn)行操作,例如加載熱補(bǔ)丁、激活熱補(bǔ)丁、去激活熱補(bǔ)丁、卸載熱補(bǔ)丁、查詢熱補(bǔ)丁等。
在熱補(bǔ)丁管理裝置對(duì)目標(biāo)進(jìn)程以及熱補(bǔ)丁進(jìn)行操作的過程中,通常需要獲取熱補(bǔ)丁的信息,因此需要對(duì)熱補(bǔ)丁函數(shù)進(jìn)行查詢。在現(xiàn)有技術(shù)中,采用設(shè)置靜態(tài)的配置文件,并由熱補(bǔ)丁管理裝置將熱補(bǔ)丁信息寫入配置文件,當(dāng)需要查詢熱補(bǔ)丁信息時(shí),則通過讀取配置文件來查詢熱補(bǔ)丁信息的方法。然而,這樣的方法無(wú)法實(shí)現(xiàn)對(duì)熱補(bǔ)丁信息的實(shí)時(shí)動(dòng)態(tài)查詢,并且一旦配置文件丟失或損壞,則無(wú)法對(duì)熱補(bǔ)丁信息進(jìn)行查詢,用戶無(wú)法得知熱補(bǔ)丁的狀態(tài)。由于無(wú)法得知熱補(bǔ)丁的狀態(tài),導(dǎo)致熱補(bǔ)丁管理裝置無(wú)法對(duì)熱補(bǔ)丁以及目標(biāo)進(jìn)程進(jìn)行操作。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)以上問題,本發(fā)明的目的在于提供一種熱補(bǔ)丁信息查詢方法以及裝置,能夠動(dòng)態(tài)查詢熱補(bǔ)丁信息,且不存在因文件丟失或損壞而無(wú)法查詢熱補(bǔ)丁信息的情況,提高軟件運(yùn)行的穩(wěn)定性和安全性。
根據(jù)本發(fā)明的第一個(gè)方面,提供一種熱補(bǔ)丁信息查詢方法,其特征在于包括步驟:S101:預(yù)生成熱補(bǔ)丁時(shí),在熱補(bǔ)丁中定義熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu),熱補(bǔ)丁包括至少一個(gè)熱補(bǔ)丁函數(shù),每個(gè)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例對(duì)應(yīng)一個(gè)熱補(bǔ)丁函數(shù)的熱補(bǔ)丁信息,在熱補(bǔ)丁中生成讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例的查詢接口;S102:判斷熱補(bǔ)丁是否被加載,若是,則執(zhí)行步驟S103,若否,則結(jié)束熱補(bǔ)丁信息查詢;S103:計(jì)算查詢接口的地址;S104:根據(jù)查詢接口的地址對(duì)查詢接口進(jìn)行調(diào)用,并通過查詢接口獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例,以獲得所述熱補(bǔ)丁信息。
優(yōu)選地,判斷熱補(bǔ)丁是否被加載包括:在目標(biāo)進(jìn)程的maps文件中查找熱補(bǔ)丁,在目標(biāo)進(jìn)程的maps文件中找到熱補(bǔ)丁時(shí),判斷熱補(bǔ)丁被加載,在目標(biāo)進(jìn)程的maps文件中未找到熱補(bǔ)丁時(shí),判斷熱補(bǔ)丁未被加載。
優(yōu)選地,計(jì)算查詢接口的地址包括:在目標(biāo)進(jìn)程的maps文件中獲取熱補(bǔ)丁的地址,在符號(hào)表中獲取查詢接口偏移地址,將熱補(bǔ)丁的地址與接口偏移地址相加以得到查詢接口的地址。
優(yōu)選地,查詢接口為接口函數(shù)。
優(yōu)選地,根據(jù)查詢接口的地址對(duì)查詢接口進(jìn)行調(diào)用,并通過查詢接口獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例包括:根據(jù)查詢接口的地址修改目標(biāo)進(jìn)程的寄存器,以模擬目標(biāo)進(jìn)程對(duì)接口函數(shù)的調(diào)用。
優(yōu)選地,查詢接口為接口變量。
優(yōu)選地,根據(jù)查詢接口的地址對(duì)查詢接口進(jìn)行調(diào)用,并通過查詢接口獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例的步驟包括:直接通過查詢接口的地址讀取接口變量的變量值。
優(yōu)選地,多個(gè)與熱補(bǔ)丁函數(shù)對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例以鏈表、數(shù)組、樹、隊(duì)列或哈希表中的一種方式連接,當(dāng)查詢接口被調(diào)用時(shí),查詢接口相應(yīng)地返回鏈表的表頭、數(shù)組的指針、樹的根節(jié)點(diǎn)、隊(duì)列的頭指針或是哈希表的頭節(jié)點(diǎn)。
優(yōu)選地,多個(gè)與熱補(bǔ)丁函數(shù)對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例以鏈表、數(shù)組、樹、隊(duì)列或哈希表中的一種方式連接,當(dāng)查詢接口被調(diào)用時(shí),查詢接口返回?zé)嵫a(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例。
優(yōu)選地,本發(fā)明第一方面的熱補(bǔ)丁信息查詢方法,還包括步驟:當(dāng)熱補(bǔ)丁函數(shù)被加載時(shí),新建熱補(bǔ)丁函數(shù)所對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例。
優(yōu)選地,本發(fā)明第一方面的熱補(bǔ)丁信息查詢方法,還包括步驟:當(dāng)熱補(bǔ)丁函數(shù)狀態(tài)變化時(shí),對(duì)狀態(tài)變化的熱補(bǔ)丁函數(shù)所對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例進(jìn)行讀寫。
優(yōu)選地,本發(fā)明第一方面的熱補(bǔ)丁信息查詢方法,還包括步驟:當(dāng)熱補(bǔ)丁函數(shù)被卸載時(shí),刪除熱補(bǔ)丁函數(shù)所對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例。
根據(jù)本發(fā)明的第二個(gè)方面,提供一種熱補(bǔ)丁信息查詢裝置,包括:熱補(bǔ)丁生成單元,用于預(yù)生成熱補(bǔ)丁時(shí),在熱補(bǔ)丁中定義熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu),熱補(bǔ)丁包括至少一個(gè)熱補(bǔ)丁函數(shù),每個(gè)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例對(duì)應(yīng)一個(gè)熱補(bǔ)丁函數(shù)的熱補(bǔ)丁信息,在熱補(bǔ)丁中生成讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例的查詢接口;判斷單元,用于判斷熱補(bǔ)丁是否被加載,判斷熱補(bǔ)丁未被加載時(shí),結(jié)束查詢;計(jì)算單元,用于判斷單元判斷熱補(bǔ)丁被加載時(shí),計(jì)算單元計(jì)算查詢接口的地址;調(diào)用單元,用于計(jì)算單元在計(jì)算查詢接口的地址后,調(diào)用單元根據(jù)查詢接口的地址對(duì)查詢接口進(jìn)行調(diào)用,并通過查詢接口獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例。
本發(fā)明通過在熱補(bǔ)丁中定義熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)并生成查詢接口,通過調(diào)用查詢接口讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例,從而獲得熱補(bǔ)丁的信息,因此不需要額外設(shè)置配置文件,不會(huì)發(fā)生因文件丟失或損壞而無(wú)法查詢熱補(bǔ)丁信息的情況,有效地提高了可靠性,進(jìn)而保障了整體熱補(bǔ)丁加載的穩(wěn)定性。由于熱補(bǔ)丁信息存儲(chǔ)于熱補(bǔ)丁內(nèi)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例中,因此存儲(chǔ)、更改熱補(bǔ)丁信息更為快速便捷。本發(fā)明通過調(diào)用熱補(bǔ)丁的查詢接口讀取熱補(bǔ)丁信息,因此熱補(bǔ)丁信息是動(dòng)態(tài)實(shí)時(shí)獲取的,相較于在配置文件中讀取熱補(bǔ)丁信息的方法,不會(huì)產(chǎn)生信息延遲,從而可以避免文件丟失而無(wú)法查詢熱補(bǔ)丁信息,確保軟件系統(tǒng)的漏洞得到及時(shí)修復(fù),保證軟件運(yùn)行的安全性,避免軟件系統(tǒng)發(fā)生崩潰。例如,當(dāng)本發(fā)明實(shí)施例的技術(shù)方案應(yīng)用于云計(jì)算行業(yè)的虛擬化軟件的修復(fù),避免虛擬機(jī)因崩潰導(dǎo)致用戶無(wú)法正常訪問服務(wù)器。
附圖說明
以下結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)的說明,以使本發(fā)明的特性和優(yōu)點(diǎn)更為明顯。
圖1為本發(fā)明的熱補(bǔ)丁信息查詢方法的一個(gè)實(shí)例的流程圖;
圖2為本發(fā)明的包括多個(gè)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例的鏈表的示意圖;
圖3為圖1中步驟S103的詳細(xì)流程圖;
圖4為本發(fā)明的熱補(bǔ)丁信息查詢裝置的一個(gè)實(shí)例的模塊示意圖。
具體實(shí)施方式
以下將對(duì)本發(fā)明的實(shí)施例給出詳細(xì)的說明。盡管本發(fā)明將結(jié)合一些具體實(shí)施方式進(jìn)行闡述和說明,但需要注意的是本發(fā)明并不僅僅只局限于這些實(shí)施方式。相反,對(duì)本發(fā)明進(jìn)行的修改或者等同替換,均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
一些示例性實(shí)施例被描述成作為流程圖描繪的處理或方法。雖然流程圖將各項(xiàng)操作描述成順序的處理,但是其中的許多操作可以被并行地、并發(fā)地或者同時(shí)實(shí)施。此外,各項(xiàng)操作的順序可以被重新安排。當(dāng)其操作完成時(shí)所述處理可以被終止,但是還可以具有未包括在附圖中的附加步驟。所述處理可以對(duì)應(yīng)于方法、函數(shù)、規(guī)程、子例程、子程序等等。
圖1為本發(fā)明的熱補(bǔ)丁信息查詢方法的一個(gè)實(shí)例的流程圖。如圖1所示,本實(shí)例中的熱補(bǔ)丁信息查詢方法包括以下步驟:
S101:預(yù)生成熱補(bǔ)丁時(shí),在熱補(bǔ)丁中定義熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)并生成讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例的查詢接口。
S102:判斷熱補(bǔ)丁是否被加載。
S103:計(jì)算查詢接口的地址。
S104:根據(jù)查詢接口的地址對(duì)查詢接口進(jìn)行調(diào)用,并通過查詢接口獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例。
S105:結(jié)束查詢。
在加載熱補(bǔ)丁前,需要預(yù)生成熱補(bǔ)丁。生成熱補(bǔ)丁的方法使用現(xiàn)有技術(shù)中的方法,例如ksplice技術(shù)中,首先獲取一份運(yùn)行中進(jìn)程對(duì)應(yīng)的源碼并編譯出二進(jìn)制,稱為pre對(duì)象,打上源碼補(bǔ)丁再次編譯后,稱為post對(duì)象,對(duì)post對(duì)象和pre對(duì)象逐條指令比較并找出存在差異的函數(shù),之后把這些差異函數(shù)合并為進(jìn)程模塊形式的熱補(bǔ)丁。
在本實(shí)例的步驟S101中,在現(xiàn)有的生成熱補(bǔ)丁的方法的基礎(chǔ)上,在熱補(bǔ)丁中定義熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu),例如熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info,該熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info包括熱補(bǔ)丁信息,熱補(bǔ)丁信息包括熱補(bǔ)丁名稱、熱補(bǔ)丁狀態(tài)、熱補(bǔ)丁函數(shù)名、原始函數(shù)起始地址、原始長(zhǎng)度、修改的起始函數(shù)地址、修改后的長(zhǎng)度。在其他實(shí)施中,熱補(bǔ)丁信息根據(jù)需要設(shè)置,并不限于上述所列出的熱補(bǔ)丁信息。
圖2為本發(fā)明的包括多個(gè)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例的鏈表的示意圖。如圖2所示,一個(gè)熱補(bǔ)丁中包括一個(gè)或多個(gè)熱補(bǔ)丁函數(shù),一個(gè)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024對(duì)應(yīng)一個(gè)熱補(bǔ)丁函數(shù)的熱補(bǔ)丁信息。
當(dāng)有多個(gè)熱補(bǔ)丁函數(shù)時(shí),多個(gè)與熱補(bǔ)丁函數(shù)對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024以鏈表200方式連接。
當(dāng)熱補(bǔ)丁函數(shù)被加載時(shí),新建該熱補(bǔ)丁函數(shù)所對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2022,即在鏈表中插入新的節(jié)點(diǎn)。
當(dāng)熱補(bǔ)丁函數(shù)狀態(tài)變化時(shí),對(duì)相應(yīng)的狀態(tài)變化的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2022進(jìn)行讀寫。例如,特定熱補(bǔ)丁函數(shù)被激活時(shí),則通過該熱補(bǔ)丁函數(shù)名稱或標(biāo)識(shí)符遍歷鏈表200查找到該熱補(bǔ)丁函數(shù),對(duì)該熱補(bǔ)丁函數(shù)對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2022的熱補(bǔ)丁狀態(tài)等字段值進(jìn)行讀寫。
當(dāng)熱補(bǔ)丁函數(shù)被卸載時(shí),刪除熱補(bǔ)丁函數(shù)所對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2022,即從鏈表200中刪除相對(duì)應(yīng)的節(jié)點(diǎn)。
由此可看出,熱補(bǔ)丁信息是通過熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例被存儲(chǔ)在熱補(bǔ)丁內(nèi)部的,因此能夠保證熱補(bǔ)丁信息不被損壞或是丟失,提高了可靠性以及穩(wěn)定性。在對(duì)熱補(bǔ)丁信息進(jìn)行生成、修改等操作時(shí),通過熱補(bǔ)丁本身操作熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例即可完成,無(wú)需再使用外部文件,從而保證了修改可靠性,提高了運(yùn)行速度。
當(dāng)有多個(gè)熱補(bǔ)丁函數(shù)時(shí),在其他實(shí)施例中,多個(gè)與熱補(bǔ)丁函數(shù)一一對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例以數(shù)組、樹、隊(duì)列或哈希表中的一種方式或是其他本領(lǐng)域所知悉的連接數(shù)據(jù)的方式連接。
在步驟S101中還需要生成讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024的查詢接口。
在本實(shí)施例中,查詢接口為接口函數(shù),例如接口函數(shù)get_hotpatch_info()。通過調(diào)用接口函數(shù)get_hotpatch_info()獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024。
當(dāng)多個(gè)與熱補(bǔ)丁函數(shù)對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024以鏈表200連接時(shí),作為一種實(shí)施方式,通過調(diào)用接口函數(shù)get_hotpatch_info(),接口函數(shù)get_hotpatch_info()返回鏈表的表頭201,然后通過表頭201遍歷鏈表200,以得到熱補(bǔ)丁信息。
接著如步驟S102判斷熱補(bǔ)丁是否被加載。加載是指將編譯后的熱補(bǔ)丁加載至目標(biāo)進(jìn)程的虛擬地址空間。在本實(shí)施例中,通過在目標(biāo)進(jìn)程的maps文件中查找熱補(bǔ)丁,以確定熱補(bǔ)丁是否被加載。具體而言,每個(gè)進(jìn)程都具有一個(gè)進(jìn)程標(biāo)識(shí)符(PID)用于標(biāo)識(shí)進(jìn)程,根據(jù)目標(biāo)進(jìn)程的進(jìn)程標(biāo)識(shí)符獲取目標(biāo)進(jìn)程的maps文件。maps文件通常用于查看進(jìn)程的虛擬地址空間使用情況,其包括被映射的文件名以及地址等若干列數(shù)據(jù)。在目標(biāo)進(jìn)程的maps文件中的被映射的文件名列中查找熱補(bǔ)丁名稱,以確定熱補(bǔ)丁是否被加載。
如果在目標(biāo)進(jìn)程的maps文件中沒有查找到熱補(bǔ)丁,則表明熱補(bǔ)丁沒有被加載到目標(biāo)進(jìn)程的虛擬地址空間,接著進(jìn)入步驟S105結(jié)束查詢,此時(shí)熱補(bǔ)丁狀態(tài)為卸載。具體而言,由于熱補(bǔ)丁沒有被加載,即熱補(bǔ)丁處于卸載的狀態(tài),無(wú)需再對(duì)熱補(bǔ)丁的具體信息進(jìn)行查詢,因此結(jié)束熱補(bǔ)丁信息查詢的流程,并向用戶顯示熱補(bǔ)丁狀態(tài)為卸載。
如果在目標(biāo)進(jìn)程的maps文件中查找到熱補(bǔ)丁,則表明熱補(bǔ)丁已經(jīng)被加載到目標(biāo)進(jìn)程的虛擬地址空間,接著進(jìn)入下面的步驟S103。
如步驟S103,判斷熱補(bǔ)丁被加載時(shí),計(jì)算查詢接口的地址。圖3為圖1中步驟S103的詳細(xì)流程圖,如圖1以及圖3所示,首先執(zhí)行步驟S1031在目標(biāo)進(jìn)程的maps文件中獲取熱補(bǔ)丁的地址。具體而言,在步驟S102中涉及的maps文件里,獲取與熱補(bǔ)丁名稱相對(duì)應(yīng)的被映射的文件名所在數(shù)據(jù)行的地址信息,從而獲得熱補(bǔ)丁的起始地址。
接著如步驟S1032,在熱補(bǔ)丁的符號(hào)表中獲取查詢接口偏移地址。具體而言,查詢接口偏移地址即是指查詢接口在熱補(bǔ)丁中的相對(duì)地址。熱補(bǔ)丁的符號(hào)表中包括名稱以及相對(duì)地址等若干列數(shù)據(jù),獲取與查詢接口名稱相對(duì)應(yīng)的名稱所在數(shù)據(jù)行的相對(duì)地址信息,從而獲得查詢接口在熱補(bǔ)丁中的相對(duì)地址。
接著如步驟S1033,將熱補(bǔ)丁的地址與查詢接口偏移地址相加,從而獲得查詢接口的地址。
獲得查詢接口地址后進(jìn)入步驟S104,根據(jù)查詢接口的地址對(duì)查詢接口進(jìn)行調(diào)用,并通過查詢接口獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2021,2022,2023,2024。
具體而言,根據(jù)接口函數(shù)get_hotpatch_info()的地址修改目標(biāo)進(jìn)程的寄存器,以模擬目標(biāo)進(jìn)程對(duì)接口函get_hotpatch_info()的調(diào)用。這里修改目標(biāo)進(jìn)程的寄存器,以模擬目標(biāo)進(jìn)程對(duì)接口函數(shù)get_hotpatch_info()的調(diào)用的具體方法采用現(xiàn)有的對(duì)進(jìn)程的寄存器進(jìn)行修改以實(shí)現(xiàn)函數(shù)調(diào)用的方法,例如包括通過修改指令指針寄存器(IP寄存器),使其下一條執(zhí)行的指令地址指向接口函數(shù)get_hotpatch_info()的地址,即在上述步驟S1033中獲取的查詢接口的地址,從而使得目標(biāo)進(jìn)程執(zhí)行接口函數(shù)get_hotpatch_info(),以獲取熱補(bǔ)丁函數(shù)對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024。
當(dāng)有多個(gè)熱補(bǔ)丁函數(shù)時(shí),作為一種實(shí)施方式,當(dāng)接口函數(shù)get_hotpatch_info()被調(diào)用時(shí),接口函數(shù)get_hotpatch_info()返回鏈表200的表頭201。因此通過對(duì)鏈表表頭201的操作獲得熱補(bǔ)丁函數(shù)對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024,例如通過表頭201遍歷鏈表200以得到所有熱補(bǔ)丁函數(shù)的熱補(bǔ)丁信息。例如通過表頭201以及特定熱補(bǔ)丁函數(shù)的標(biāo)識(shí)符得到特定熱補(bǔ)丁函數(shù)的熱補(bǔ)丁信息。例如通過表頭201以及特定熱補(bǔ)丁的標(biāo)識(shí)符得到該熱補(bǔ)丁所包含的所有熱補(bǔ)丁函數(shù)的熱補(bǔ)丁信息。
由于本實(shí)施例中調(diào)用接口函數(shù)僅需返回鏈表200的表頭201,因此接口函數(shù)本身設(shè)置較為簡(jiǎn)單,加快了運(yùn)行速度,減少了維護(hù)熱補(bǔ)丁的成本。
在其他實(shí)施例中,多個(gè)與熱補(bǔ)丁函數(shù)對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例以數(shù)組、樹、隊(duì)列或哈希表中的一種方式連接,當(dāng)查詢接口被調(diào)用時(shí),查詢接口相應(yīng)地返回?cái)?shù)組的指針、樹的根節(jié)點(diǎn)、隊(duì)列的頭指針或是哈希表的頭節(jié)點(diǎn)。接著通過對(duì)數(shù)組的指針、樹的根節(jié)點(diǎn)、隊(duì)列的頭指針或是哈希表的頭節(jié)點(diǎn)的操作獲得熱補(bǔ)丁函數(shù)的熱補(bǔ)丁信息。多個(gè)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例以其他等同的方式連接時(shí),也相應(yīng)地返回可進(jìn)行操作的類似頭節(jié)點(diǎn)或指針的等同物。
在另一種實(shí)施方式中,當(dāng)接口函數(shù)get_hotpatch_info()被調(diào)用時(shí),接口函數(shù)get_hotpatch_info()直接返回?zé)嵫a(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2021,2022,2023,2024。具體而言,設(shè)置當(dāng)接口函數(shù)get_hotpatch_info()被調(diào)用時(shí),返回所有的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2021,2022,2023,2024。在其他實(shí)施例中,設(shè)置接口函數(shù)get_hotpatch_info()被調(diào)用時(shí),同時(shí)附加特定熱補(bǔ)丁函數(shù)標(biāo)識(shí)符等參數(shù),從而接口函數(shù)get_hotpatch_info()遍歷由多個(gè)與熱補(bǔ)丁對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024組成的鏈表200,并通過熱補(bǔ)丁標(biāo)識(shí)符等參數(shù)返回對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2022。
需要注意的是,通過查詢接口對(duì)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例的讀取還可以使用其他的實(shí)施方式,并不以上述介紹的為限,只要滿足通過查詢接口對(duì)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例進(jìn)行讀取操作即可。
在獲取熱補(bǔ)丁信息后,進(jìn)入步驟S105結(jié)束查詢,并向用戶展示目標(biāo)進(jìn)程上的熱補(bǔ)丁信息。由于在調(diào)用查詢接口時(shí),查詢接口是運(yùn)行在目標(biāo)進(jìn)程中的,所以能夠動(dòng)態(tài)實(shí)時(shí)地反映目標(biāo)進(jìn)程中熱補(bǔ)丁的信息。
在一變形的實(shí)施例中,查詢接口為接口變量,例如接口變量hotpatch_info_list。通過讀取接口變量hotpatch_info_list的變量值獲取獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024。
具體而言,根據(jù)步驟S103中獲取的接口變量hotpatch_info_list的地址,通過ptrace函數(shù)調(diào)用上述地址,以獲得變量hotpatch_info_list的變量值。ptrace函數(shù)是Linux系統(tǒng)的系統(tǒng)函數(shù),提供了一種使父進(jìn)程得以監(jiān)視和控制其它進(jìn)程的方式,以實(shí)現(xiàn)斷點(diǎn)調(diào)試和系統(tǒng)調(diào)用的跟蹤。
當(dāng)多個(gè)與熱補(bǔ)丁對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024以鏈表200方式連接時(shí),作為一種實(shí)施方式,讀取接口變量hotpatch_info_list,接口變量hotpatch_info_list返回鏈表200的表頭201,通過表頭201遍歷鏈表200,以得到熱補(bǔ)丁信息。具體而言,根據(jù)接口變量hotpatch_info_list的地址,通過ptrace函數(shù)調(diào)用地址,從而獲得多個(gè)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024組成的鏈表200的表頭201,然后通過表頭201遍歷鏈表200,得到所有熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024的地址,再通過ptrace函數(shù)調(diào)用,得到每個(gè)熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)hotpatch_info實(shí)例2021,2022,2023,2024對(duì)應(yīng)的變量成員的值。
變形實(shí)施例中的其他方法均與原實(shí)施例類似,具體參照上述對(duì)原實(shí)施例的描述,此處不再贅述。
需要注意的是,除了接口函數(shù)以及接口變量,也可以采用其他查詢接口的方式,只要符合通過對(duì)查詢接口的調(diào)用能夠讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例即可。
從以上對(duì)熱補(bǔ)丁信息查詢方法的描述可看出,本發(fā)明在熱補(bǔ)丁中定義包括熱補(bǔ)丁信息的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)并生成讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2021,2022,2023,2024的查詢接口,當(dāng)熱補(bǔ)丁加載到目標(biāo)進(jìn)程中時(shí),通過調(diào)用運(yùn)行在目標(biāo)進(jìn)程中的查詢接口,從而獲得熱補(bǔ)丁信息。因此本發(fā)明不需要額外設(shè)置配置文件用于記錄熱補(bǔ)丁信息,所有的信息都保存在目標(biāo)進(jìn)程的熱補(bǔ)丁中,因此不會(huì)發(fā)生信息丟失或是損壞的情況,提高了熱補(bǔ)丁信息查詢的可靠性以及穩(wěn)定性,進(jìn)而保障了整體熱補(bǔ)丁加載的穩(wěn)定性。
同時(shí)本發(fā)明對(duì)熱補(bǔ)丁信息存儲(chǔ)于熱補(bǔ)丁內(nèi)部,因此存儲(chǔ)、更改熱補(bǔ)丁信息更為快速且可靠性更高。由于對(duì)于熱補(bǔ)丁信息查詢是動(dòng)態(tài)實(shí)時(shí)的,因此不會(huì)發(fā)生熱補(bǔ)丁信息延遲的情況,查詢可靠性得到了保證,從而可以確保軟件系統(tǒng)的漏洞得到及時(shí)修復(fù),保證軟件運(yùn)行的安全性,避免軟件系統(tǒng)發(fā)生崩潰。例如,當(dāng)本發(fā)明實(shí)施例的技術(shù)方案應(yīng)用于云計(jì)算行業(yè)的虛擬化軟件的修復(fù),避免虛擬機(jī)因崩潰導(dǎo)致用戶無(wú)法正常訪問服務(wù)器??梢岳斫獾氖?,本發(fā)明實(shí)施例的熱補(bǔ)丁信息查詢方法也可以應(yīng)用于其他修復(fù)軟件的實(shí)例中。
本發(fā)明還提供了一種熱補(bǔ)丁信息查詢裝置,圖4為本發(fā)明的熱補(bǔ)丁信息查詢裝置的一個(gè)實(shí)例的模塊示意圖。
如圖4所示,本實(shí)施例中的熱補(bǔ)丁信息查詢裝置1包括熱補(bǔ)丁生成單元101,判斷單元102,計(jì)算單元103以及調(diào)用單元104。
其中,熱補(bǔ)丁生成單元101用于在熱補(bǔ)丁中定義熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)并生成讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2021,2022,2023,2024的查詢接口。判斷單元102用于判斷熱補(bǔ)丁是否被加載。計(jì)算單元103用于計(jì)算查詢接口的地址。調(diào)用單元104用于根據(jù)查詢接口的地址對(duì)查詢接口進(jìn)行調(diào)用,并通過查詢接口獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例。
結(jié)合圖1,圖2,圖3以及圖4,熱補(bǔ)丁信息查詢裝置1參照上文中熱補(bǔ)丁信息查詢方法而進(jìn)行工作。
首先由熱補(bǔ)丁生成單元101執(zhí)行步驟S101,即預(yù)生成熱補(bǔ)丁時(shí),在熱補(bǔ)丁中定義包括熱補(bǔ)丁信息的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)并生成讀取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2021,2022,2023,2024的查詢接口。查詢接口同樣被設(shè)置為接口函數(shù)或是接口變量。
接著判斷單元102執(zhí)行步驟S102,即判斷熱補(bǔ)丁是否被加載。當(dāng)判斷熱補(bǔ)丁未被加載時(shí),結(jié)束查詢熱補(bǔ)丁信息的流程,并向用戶返回?zé)嵫a(bǔ)丁狀態(tài)為卸載。
當(dāng)判斷單元102判斷熱補(bǔ)丁被加載時(shí),則由計(jì)算單元103執(zhí)行步驟S103,首先在目標(biāo)進(jìn)程的maps文件中獲取熱補(bǔ)丁的地址,接著在熱補(bǔ)丁的符號(hào)表中獲取查詢接口偏移地址,將兩者相加從而獲得查詢接口的地址。
接著,調(diào)用單元104根據(jù)查詢接口的地址對(duì)查詢接口進(jìn)行調(diào)用。查詢接口在目標(biāo)進(jìn)程中運(yùn)行,并將熱補(bǔ)丁函數(shù)所對(duì)應(yīng)的熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2021,2022,2023,2024通過查詢接口反饋。調(diào)用單元104獲取熱補(bǔ)丁信息數(shù)據(jù)結(jié)構(gòu)實(shí)例2021,2022,2023,2024,也就是熱補(bǔ)丁信息。
具體的方法如上述熱補(bǔ)丁信息查詢方法描述的流程所述,此處不再一一贅述。
本發(fā)明的熱補(bǔ)丁信息查詢裝置1在本實(shí)施例中單獨(dú)為一個(gè)裝置,在其他實(shí)施例中,熱補(bǔ)丁信息查詢裝置被分割并分別包含于熱補(bǔ)丁制作裝置以及熱補(bǔ)丁管理裝置中。例如,熱補(bǔ)丁生成單元101包含于熱補(bǔ)丁制作裝置中,判斷單元102,計(jì)算單元103以及調(diào)用單元104包含于熱補(bǔ)丁管理裝置中。
需要說明的是,本發(fā)明是熱補(bǔ)丁查詢的一種應(yīng)用。在本發(fā)明的實(shí)現(xiàn)過程中,會(huì)涉及到多個(gè)軟件功能模塊的應(yīng)用。如在仔細(xì)閱讀申請(qǐng)文件、準(zhǔn)確理解本發(fā)明的實(shí)現(xiàn)原理和發(fā)明目的以后,在結(jié)合現(xiàn)有公知技術(shù)的情況下,本領(lǐng)域技術(shù)人員完全可以運(yùn)用其掌握的軟件編程技能實(shí)現(xiàn)本發(fā)明,將本發(fā)明中的所有實(shí)施例,實(shí)施方式,變形實(shí)施例中的技術(shù)特征進(jìn)行自由組合。前述熱補(bǔ)丁生成方法以及熱補(bǔ)丁加載方法的其他實(shí)施細(xì)節(jié)均參照現(xiàn)有技術(shù)實(shí)施。
以上僅是本發(fā)明的具體應(yīng)用范例,對(duì)本發(fā)明的保護(hù)范圍不構(gòu)成任何限制。除上述實(shí)施例外,本發(fā)明還可以有其它實(shí)施方式。凡采用等同替換或等效變換形成的技術(shù)方案,均落在本發(fā)明所要求保護(hù)的范圍之內(nèi)。