一種熱補丁信息查詢方法以及裝置與流程
2024-03-30 22:57:05 4

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