補丁處理方法及裝置的制造方法
【專利摘要】本發明公開了一種補丁處理方法及裝置,其中,該方法包括:檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部,其中,被補丁進程為用于獲取該被補丁函數和補丁函數的地址;在檢測到各個線程所對應待執行指令的指針均未指向該被補丁函數的頭部時,將被補丁函數替換為補丁函數。通過本發明解決了相關技術中采用長跳轉指令方式時,不能有效解決指令修改過程的原子性的問題,進而實現了采用長跳轉指令方式時,保證了指令修改過程的原子性的效果。
【專利說明】
補丁處理方法及裝置
技術領域
[0001]本發明涉及通信領域,具體而言,涉及補丁處理方法及裝置。
【背景技術】
[0002]熱補丁技術是系統在運行的過程中,通過函數替換,將有缺陷的函數替換為補丁函數,即在被補函數入口處通過跳轉指令跳轉到補丁函數,從而避開執行被補丁函數,轉而執行補丁函數,以此達到修補缺陷的目的。所以,熱補丁機制的基本問題可以歸結為:
[0003]I)采用什么樣的跳轉指令,是短跳轉還是長跳轉;
[0004]2)如何保證指令修改過程的原子性,即修改過程中,被修改指令不可被任何執行流執行,必須等到全部指令修改完成方可。
[0005]二者的核心是問題2)的實現,而問題2)的復雜程度取決于問題I)中跳轉方式的選擇。
[0006]短跳轉可以用單條指令來實現,而單條指令的替換本身就是原子的,所以這會給問題2的實現帶來很大的便利性,大大簡化了熱補丁機制的設計,但是短跳轉的缺點也是顯而易見的,那就是跳轉的范圍很有限,尤其是在大型軟件系統中,這個缺點更易凸顯出來,會導致跳轉距離遠的地址無法到達,導致補丁打不上,當然可以采取特殊的技巧來規避短跳轉的這個缺點。
[0007]如果采用長跳轉指令,那么理論上可以跳轉到任意地址,可以從根本上解決短跳轉的缺陷,但是長跳轉需要多條指令來實現,而多條指令的修改過程如果不加保護,原子性就得不到保障,這是很危險的,很容易破壞代碼的一致性。
[0008]由此可見,短跳轉要著力解決跳轉距離的問題,而長跳轉則要解決指令修改過程的原子性問題;
[0009]目前出現的大部分熱補丁技術采用的都是短跳轉,然后使用各種技巧來解決跳轉距離的問題。
[0010]針對相關技術中,采用長跳轉指令方式時,不能有效解決指令修改過程的原子性的問題,還未提出有效的解決方案。
【發明內容】
[0011]本發明提供了一種補丁處理方法及裝置,以至少解決相關技術中采用長跳轉指令方式時,不能有效解決指令修改過程的原子性的問題。
[0012]根據本發明的一個方面,提供了一種補丁處理方法,包括:檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部,其中,所述被補丁進程為用于獲取所述被補丁函數和補丁函數的地址;在檢測到所述各個線程所對應待執行指令的指針均未指向所述被補丁函數的頭部時,將所述被補丁函數替換為所述補丁函數。
[0013]進一步地,所述待執行指令的指針為存儲于程序計數器PC中的指針。
[0014]進一步地,將所述被補丁函數替換為補丁函數包括:將位于所述被補丁函數的頭部中的指令修改為用于跳轉至所述補丁函數的指令,其中,將經過跳轉指令修改后的所述被補丁函數稱之為第一被補丁函數。
[0015]進一步地,檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部之前包括:接收補丁激活請求;根據所述補丁激活請求獲取補丁文件的名稱及版本;根據所述補丁文件的名稱及版本確定所述被補丁進程未打過與所述補丁文件對應的相同的補丁;對所述補丁文件進行解析,并根據解析結果獲取所述被補丁函數的地址和所述補丁函數的地址。
[0016]進一步地,檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部之前包括:停止運行所述各個線程;在所述各個線程中的指定線程所對應待執行指令的指針指向所述被補丁函數的頭部時,運行所述指定線程,直至所述指定線程對應的待執行指令的指針未指向對應的被補丁函數的頭部。
[0017]進一步地,將所述被補丁函數替換為所述補丁函數之后包括:在所述全部線程所對應待執行指令的指針滿足以下條件時,對所述第一被補丁函數進行替換:所述全部線程所對應待執行指令的指針均未指向對應的所述第一被補丁函數的頭部、所述全部線程所對應待執行指令的指針均未指向在任一所述補丁函數中、任一線程所對應待執行指令的指針之前的調用鏈均未落在所述補丁函數中。
[0018]進一步地,對所述第一被補丁函數進行替換包括:將所述第一被補丁函數中的跳轉指令恢復為未對所述被補丁函數進行替換之前頭部中的指令。
[0019]進一步地,對所述第一被補丁函數進行替換之前包括:接收補丁去激活請求。
[0020]根據本發明的另一個方面,還提供了一種補丁處理裝置,包括:檢測模塊,用于檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部,其中,所述被補丁進程為用于獲取所述被補丁函數和補丁函數的地址;第一替換模塊,用于在檢測到所述各個線程所對應待執行指令的指針均未指向所述被補丁函數的頭部時,將所述被補丁函數替換為所述補丁函數。
[0021]進一步地,所述待執行指令的指針為存儲于程序計數器PC中的指針。
[0022]進一步地,所述第一替換模塊還用于將位于所述被補丁函數的頭部中的指令修改為用于跳轉至所述補丁函數的指令,其中,將經過跳轉指令修改后的所述被補丁函數稱之為第一被補丁函數。
[0023]進一步地,所述裝置還包括:第一接收模塊,用于接收補丁激活請求;第一獲取模塊,用于根據所述補丁激活請求獲取補丁文件的名稱及版本;確定模塊,用于根據所述補丁文件的名稱及版本確定所述被補丁進程未打過與所述補丁文件對應的相同的補丁 ;第二獲取模塊,用于對所述補丁文件進行解析,并根據解析結果獲取所述被補丁函數的地址和所述補丁函數的地址。
[0024]進一步地,所述裝置還包括:第一運行模塊,用于停止運行所述各個線程;第二運行模塊,用于在所述各個線程中的指定線程所對應待執行指令的指針指向所述被補丁函數的頭部時,運行所述指定線程,直至所述指定線程對應的待執行指令的指針未指向對應的被補丁函數的頭部。
[0025]進一步地,所述裝置還包括:第二替換模塊,用于在所述全部線程所對應待執行指令的指針滿足以下條件時,對所述第一被補丁函數進行替換:所述全部線程所對應待執行指令的指針均未指向對應的所述第一被補丁函數的頭部、所述全部線程所對應待執行指令的指針均未指向在任一所述補丁函數中、任一線程所對應待執行指令的指針之前的調用鏈均未落在所述補丁函數中。
[0026]進一步地,所述第二替換模塊還用于將所述第一被補丁函數中的跳轉指令恢復為未對所述被補丁函數進行替換之前頭部中的指令。
[0027]進一步地,所述裝置還包括:第二接收模塊,用于接收補丁去激活請求。
[0028]通過本發明,采用檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部,其中,被補丁進程為用于獲取該被補丁函數和補丁函數的地址;在檢測到各個線程所對應待執行指令的指針均未指向該被補丁函數的頭部時,將被補丁函數替換為補丁函數。解決了相關技術中采用長跳轉指令方式時,不能有效解決指令修改過程的原子性的問題,進而實現了采用長跳轉指令方式時,保證了指令修改過程的原子性的效果。
【附圖說明】
[0029]此處所說明的附圖用來提供對本發明的進一步理解,構成本申請的一部分,本發明的示意性實施例及其說明用于解釋本發明,并不構成對本發明的不當限定。在附圖中:
[0030]圖1是根據本發明實施例的補丁處理方法的流程圖;
[0031]圖2是根據本發明實施例的補丁處理裝置的結構框圖;
[0032]圖3是根據本發明實施例的補丁處理裝置的結構框圖(一);
[0033]圖4是根據本發明實施例的補丁處理裝置的結構框圖(二);
[0034]圖5是根據本發明實施例的補丁處理裝置的結構框圖(三);
[0035]圖6是根據本發明實施例的補丁處理裝置的結構框圖(四);
[0036]圖7是根據本發明實施例的熱補丁消息流程圖。
【具體實施方式】
[0037]下文中將參考附圖并結合實施例來詳細說明本發明。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。
[0038]在本實施例中提供了一種補丁處理方法,圖1是根據本發明實施例的補丁處理方法的流程圖,如圖1所示,該流程包括如下步驟:
[0039]步驟S102,檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部,其中,被補丁進程為用于獲取被補丁函數和補丁函數的地址;
[0040]步驟S104,在檢測到該各個線程所對應待執行指令的指針均未指向該被補丁函數的頭部時,將被補丁函數替換為補丁函數。
[0041]通過上述步驟,在確定各個線程所對應待執行指令的指針均未指向該被補丁函數的頭部時,才將被補丁函數替換為補丁函數,解決了相關技術中采用長跳轉指令方式時,不能有效解決指令修改過程的原子性的問題,進而實現了采用長跳轉指令方式時,保證了指令修改過程的原子性的效果。
[0042]在一個可選實施例中,上述待執行指令的指針為存儲于程序計數器PC中的指針。
[0043]上述步驟S104中涉及到將被補丁函數替換為補丁函數,在一個可選實施例中,通過將位于被補丁函數的頭部中的指令修改為用于跳轉至補丁函數的指令,完成將被補丁函數替換為補丁函數,其中,此處將經過跳轉指令修改后的被補丁函數稱之為第一被補丁函數。
[0044]在一個可選實施例中,檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部之前,接收補丁激活請求,根據補丁激活請求獲取補丁文件的名稱及版本,根據補丁文件的名稱及版本確定被補丁進程未打過與補丁文件對應的相同的補丁,對補丁文件進行解析,并根據解析結果獲取被補丁函數的地址和補丁函數的地址。
[0045]在另一個可選實施例中,檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部之前,停止運行各個線程,在各個線程中的指定線程所對應待執行指令的指針指向被補丁函數的頭部時,運行指定線程,直至該指定線程對應的待執行指令的指針未指向對應的被補丁函數的頭部。從而保證了指令修改過程是不被中斷的,即是具備原子性的。
[0046]將該被補丁函數替換為該補丁函數之后還涉及到去激活的過程,在一個可選實施例中,在全部線程所對應待執行指令的指針滿足以下條件時,對第一被補丁函數進行替換:全部線程所對應待執行指令的指針均未指向對應的第一被補丁函數的頭部、全部線程所對應待執行指令的指針均未指向在任一補丁函數中、任一線程所對應待執行指令的指針之前的調用鏈均未落在補丁函數中。
[0047]關于上述步驟中,對第一被補丁函數進行替換,在一個可選實施例中,將第一被補丁函數中的跳轉指令恢復為未對被補丁函數進行替換之前頭部中的指令。
[0048]在一個可選實施例中,對第一被補丁函數進行替換之前,接收補丁去激活請求。
[0049]在本實施例中還提供了一種補丁處理裝置,該裝置用于實現上述實施例及優選實施方式,已經進行過說明的不再贅述。如以下所使用的,術語“模塊”可以實現預定功能的軟件和/或硬件的組合。盡管以下實施例所描述的裝置較佳地以軟件來實現,但是硬件,或者軟件和硬件的組合的實現也是可能并被構想的。
[0050]圖2是根據本發明實施例的補丁處理裝置的結構框圖,如圖2所述,該裝置包括:檢測模塊22,用于檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部,其中,該被補丁進程為用于獲取該被補丁函數和補丁函數的地址;第一替換模塊24,用于在檢測到該各個線程所對應待執行指令的指針均未指向該被補丁函數的頭部時,將該被補丁函數替換為該補丁函數。
[0051]可選地,待執行指令的指針為存儲于程序計數器PC中的指針。
[0052]可選地,第一替換模塊24還用于將位于該被補丁函數的頭部中的指令修改為用于跳轉至該補丁函數的指令,其中,將經過跳轉指令修改后的被補丁函數稱之為第一被補丁函數。
[0053]圖3是根據本發明實施例的補丁處理裝置的結構框圖(一),如圖3所示,裝置還包括:第一接收模塊32,用于接收補丁激活請求;第一獲取模塊34,用于根據該補丁激活請求獲取補丁文件的名稱及版本;確定模塊36,用于根據該補丁文件的名稱及版本確定該被補丁進程未打過與該補丁文件對應的相同的補丁;第二獲取模塊38,用于對該補丁文件進行解析,并根據解析結果獲取該被補丁函數的地址和該補丁函數的地址。
[0054]圖4是根據本發明實施例的補丁處理裝置的結構框圖(二),如圖4所示,該裝置還包括:第一運行模塊42,用于停止運行該各個線程;第二運行模塊44,用于在該各個線程中的指定線程所對應待執行指令的指針指向該被補丁函數的頭部時,運行該指定線程,直至該指定線程對應的待執行指令的指針未指向對應的被補丁函數的頭部。
[0055]圖5是根據本發明實施例的補丁處理裝置的結構框圖(三),如圖5所示,該裝置還包括:第二替換模塊52,用于在該全部線程所對應待執行指令的指針滿足以下條件時,對該第一被補丁函數進行替換:該全部線程所對應待執行指令的指針均未指向對應的被補丁函數的頭部、該全部線程所對應待執行指令的指針均未指向在任一該補丁函數中、任一線程所對應待執行指令的指針之前的調用鏈均未落在該補丁函數中。
[0056]可選地,第二替換模塊52還用于將該第一被補丁函數中的跳轉指令恢復為未對該被補丁函數進行替換之前頭部中的指令。
[0057]圖6是根據本發明實施例的補丁處理裝置的結構框圖(四),如圖6所示,該裝置還包括:第二接收模塊62,用于接收補丁去激活請求。
[0058]需要說明的是,上述各個模塊是可以通過軟件或硬件來實現的,對于后者,可以通過以下方式實現,但不限于此:上述各個模塊均位于同一處理器中;或者,上述各個模塊分別位于第一處理器、第二處理器和第三處理器…中。
[0059]針對相關技術中存在的上述問題,下面結合可選實施例進行說明,在本可選實施例中結合了上述可選實施例及其可選實施方式。
[0060]本可選實施例采用長跳轉指令方式,并且使用一種簡單的機制來保障長跳轉指令修改過程的原子性。
[0061]因為長跳轉由多條指令組成,所以修改這些指令勢必會牽涉到指令一致性問題,即修改指令的過程可能會被中斷,導致指令修改不完整、指令序列不一致,并且隨后這些被部分修改的指令被執行,這些前后不一致的指令被執行會導致致命的錯誤,所以指令修改過程必須是不被中斷的,即原子的。本發明使用一種簡單實用的機制來保證指令修改過程的原子性。
[0062]確定采用長跳轉方式,這種跳轉方式可以跳轉到任何地址。
[0063]打補丁過程由三個進程合作完成,用戶交互進程、補丁管理進程、被補丁進程。
[0064]用戶交互進程接收用戶補丁請求,包括補丁的激活、去激活請求。接收到激活請求后,根據補丁文件的名稱及版本,查找對應被補丁進程是否已經打過相同的補丁,如果沒有,記錄本次請求內容,即補丁名稱及版本,隨后將請求內容以消息形式派發給被補丁進程,接著等待被補丁進程的響應,直至超時。如果被補丁進程打過相同的補丁,那么直接返回。
[0065]被補丁進程接收到補丁激活消息后,解開補丁文件,驗證補丁頭,驗證無誤后提取補丁動態庫,然后加載補丁動態庫,定位補丁函數和被補丁函數的地址,做好補丁激活的準備工作,然后被補丁進程將被補丁函數與補丁函數的地址發送給補丁管理進程,由后者完成最終的函數替換工作。
[0066]補丁管理進程收到被補丁進程發送的補丁激活消息后,停住被補丁進程內所有線程,即讓被補丁進程處于完全靜止的狀態,然后判斷被補丁進程此刻能否安全地進行函數替換,即判斷被補丁進程內各個線程的程序計數器,裝載即將執行的指令地址的寄存器(Program Counter,簡稱為PC)是否落在被補丁函數的頭部,如果均沒有落在任一被補丁函數的頭部,那么可以進行函數替換。
[0067]如果上述測試不滿足條件,記錄下所有不滿足條件的線程,然后讓這些線程運行一小段時間,目的是讓各個線程的PC指針有機會離開被補丁函數的頭部,運行結束后,再次判斷這些線程的PC,不滿足條件的接著運行,就這樣不斷運行不滿足條件的線程,直到最大運行次數。
[0068]到達最大運行次數前,如果已經沒有線程不滿足條件,即被補丁進程內所有線程已經全部滿足打補丁的條件,那么接著進行各個被補丁函數的替換工作;否則,本次補丁激活請求宣告失敗。
[0069]被補丁函數的替換,就是將被補丁函數的頭幾條指令修改成跳轉至對應補丁函數的指令,由于此刻被補丁進程是靜止的,沒有任何執行流,所以指令修改過程不會被打斷,從而可以保證指令修改過程的原子性。正是通過這種讓被補丁進程靜止的方法來達到指令修改過程的原子性。
[0070]所有被補丁函數的指令修改完成后,啟動被補丁進程內所有線程,補丁管理進程將操作結果返回給被補丁進程,被補丁進程接著將操作結果返回給用戶交互進程,最終用戶交互進程將結果返回給用戶,本次補丁激活流程至此全部完成。
[0071]補丁去激活就是恢復被補丁函數的原先指令,補丁激活過程中,指令修改時,會將被補丁函數的指令保存起來以便后續恢復。去激活流程與激活流程一致,請求經由用戶交互進程到被補丁進程,然后到補丁管理進程。恢復被補丁函數的指令時,判據更加嚴格,要求被補丁函數內所有線程的PC滿足:
[0072]I)不落在任一被補丁函數的頭幾條指令中;
[0073]2)不落在當前要去激活的補丁區域中,即不落在任一補丁函數中;
[0074]3)以當前PC為起點往后回溯調用鏈,要求調用鏈不穿過補丁區域;
[0075]只有滿足以上3個條件,才可以安全地卸載補丁,否則會導致致命錯誤。
[0076]本可選實施例提供了一個通用的軟件熱補丁方法,圖7是根據本發明實施例的熱補丁消息流程圖,如圖7所示,包括如下步驟:
[0077]步驟一,用戶交互進程接收來自用戶的激活/去激活請求,接收到請求后會根據已有的記錄信息查看該請求是否已經執行過,如果沒有,則會記錄該請求,然后將請求打包成消息推送給被補丁進程,否則直接返回。
[0078]例如用戶請求激活補丁 /home/test, patch,會將補丁絕對路徑名/home/test,patch及被補丁進程名發給用戶交互進程,后者根據補丁名稱test, patch搜索被補丁進程補丁列表,檢查是否存在相同名稱的補丁,如果找到,說明該補丁已經打過,直接返回,否貝1J,將絕對路徑/home/test, patch發送給被補丁進程。
[0079]步驟二,被補丁進程接收到補丁消息后,如果是激活消息,就解開補丁包驗證補丁的有效性,然后提取補丁包的內容生成補丁動態庫,加載該動態庫,根據補丁頭內容定位補丁函數及被補丁函數的地址,并作記錄,以防對同一個函數疊加打補丁,做好這些準備工作后,將補丁函數及被補丁函數打包成消息發送給補丁管理函數,由后者完成真正的補丁激活工作。如果是去激活消息,根據補丁版本信息獲取補丁信息,然后向補丁管理進程請求去激活補丁。
[0080]收到補丁激活消息,被補丁進程首先打開包含在激活消息中的補丁文件絕對路徑名/home/test, patch, test, patch文件由兩部分組成:補丁說明部分、補丁實體。補丁說明部分包括被補丁函數名稱列表、補丁函數名稱列表、補丁函數個數等信息;補丁實體則是由補丁代碼編譯生成的動態庫文件。這兩部分信息被分別提取出來,后者單獨存放到一個新的文件中并打開,至此,補丁代碼加載完畢,然后分別查找被補丁函數與補丁函數的地址,接著將被補丁函數與補丁函數的地址列表發送給補丁管理進程去激活。如果是去激活的話,那么只需根據收到的補丁信息查找被補丁函數列表及補丁動態庫,然后提交給補丁管理進程去去激活。
[0081]步驟三,補丁管理進程收到補丁消息后,如果是激活消息,就將被補丁進程內所有的線程全部停住,檢查此刻能否進行被補丁函數的指令替換,即所有線程的PC指針均不落在任一被補函數的頭部,如果可以,則進行指令修改,否則,進行判據收斂,即不斷進行運行、判斷直至最大運行次數,若判據收斂,則進行指令修改,否則宣告失敗;如果是去激活,同樣首先進行判據收斂,只是判據更為嚴格,如上文所述。
[0082]綜上所述,通過本發明解決了相關技術中采用長跳轉指令方式時,不能有效解決指令修改過程的原子性的問題,進而實現了采用長跳轉指令方式時,保證了指令修改過程的原子性的效果。
[0083]在另外一個實施例中,還提供了一種軟件,該軟件用于執行上述實施例及優選實施方式中描述的技術方案。
[0084]在另外一個實施例中,還提供了一種存儲介質,該存儲介質中存儲有上述軟件,該存儲介質包括但不限于:光盤、軟盤、硬盤、可擦寫存儲器等。
[0085]顯然,本領域的技術人員應該明白,上述的本發明的各模塊或各步驟可以用通用的計算裝置來實現,它們可以集中在單個的計算裝置上,或者分布在多個計算裝置所組成的網絡上,可選地,它們可以用計算裝置可執行的程序代碼來實現,從而,可以將它們存儲在存儲裝置中由計算裝置來執行,并且在某些情況下,可以以不同于此處的順序執行所示出或描述的步驟,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實現。這樣,本發明不限制于任何特定的硬件和軟件結合。
[0086]以上所述僅為本發明的優選實施例而已,并不用于限制本發明,對于本領域的技術人員來說,本發明可以有各種更改和變化。凡在本發明的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本發明的保護范圍之內。
【主權項】
1.一種補丁處理方法,其特征在于,包括: 檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部,其中,所述被補丁進程為用于獲取所述被補丁函數和補丁函數的地址; 在檢測到所述各個線程所對應待執行指令的指針均未指向所述被補丁函數的頭部時,將所述被補丁函數替換為所述補丁函數。2.根據權利要求1所述的方法,其特征在于,所述待執行指令的指針為存儲于程序計數器PC中的指針。3.根據權利要求1所述的方法,其特征在于,將所述被補丁函數替換為補丁函數包括: 將位于所述被補丁函數的頭部中的指令修改為用于跳轉至所述補丁函數的指令,其中,將經過跳轉指令修改后的所述被補丁函數稱之為第一被補丁函數。4.根據權利要求1所述的方法,其特征在于,檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部之前包括: 接收補丁激活請求; 根據所述補丁激活請求獲取補丁文件的名稱及版本; 根據所述補丁文件的名稱及版本確定所述被補丁進程未打過與所述補丁文件對應的相同的補丁; 對所述補丁文件進行解析,并根據解析結果獲取所述被補丁函數的地址和所述補丁函數的地址。5.根據權利要求1所述的方法,其特征在于,檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部之前包括: 停止運行所述各個線程; 在所述各個線程中的指定線程所對應待執行指令的指針指向所述被補丁函數的頭部時,運行所述指定線程,直至所述指定線程對應的待執行指令的指針未指向對應的被補丁函數的頭部。6.根據權利要求3所述的方法,其特征在于,將所述被補丁函數替換為所述補丁函數之后包括: 在全部線程所對應待執行指令的指針滿足以下條件時,對所述第一被補丁函數進行替換: 所述全部線程所對應待執行指令的指針均未指向對應的所述第一被補丁函數的頭部、所述全部線程所對應待執行指令的指針均未指向在任一所述補丁函數中、任一線程所對應待執行指令的指針之前的調用鏈均未落在所述補丁函數中。7.根據權利要求6所述的方法,其特征在于,對所述第一被補丁函數進行替換包括: 將所述第一被補丁函數中的跳轉指令恢復為未對所述被補丁函數進行替換之前頭部中的指令。8.根據權利要求6所述的方法,其特征在于,對所述第一被補丁函數進行替換之前包括: 接收補丁去激活請求。9.一種補丁處理裝置,其特征在于,包括: 檢測模塊,用于檢測被補丁進程中各個線程所對應待執行指令的指針是否均指向被補丁函數的頭部,其中,所述被補丁進程為用于獲取所述被補丁函數和補丁函數的地址;第一替換模塊,用于在檢測到所述各個線程所對應待執行指令的指針均未指向所述被補丁函數的頭部時,將所述被補丁函數替換為所述補丁函數。10.根據權利要求9所述的裝置,其特征在于,所述待執行指令的指針為存儲于程序計數器PC中的指針。11.根據權利要求9所述的裝置,其特征在于,所述第一替換模塊還用于將位于所述被補丁函數的頭部中的指令修改為用于跳轉至所述補丁函數的指令,其中,將經過跳轉指令修改后的所述被補丁函數稱之為第一被補丁函數。12.根據權利要求9所述的裝置,其特征在于,所述裝置還包括: 第一接收模塊,用于接收補丁激活請求; 第一獲取模塊,用于根據所述補丁激活請求獲取補丁文件的名稱及版本; 確定模塊,用于根據所述補丁文件的名稱及版本確定所述被補丁進程未打過與所述補丁文件對應的相同的補丁; 第二獲取模塊,用于對所述補丁文件進行解析,并根據解析結果獲取所述被補丁函數的地址和所述補丁函數的地址。13.根據權利要求9所述的裝置,其特征在于,所述裝置還包括: 第一運行模塊,用于停止運行所述各個線程; 第二運行模塊,用于在所述各個線程中的指定線程所對應待執行指令的指針指向所述被補丁函數的頭部時,運行所述指定線程,直至所述指定線程對應的待執行指令的指針未指向對應的被補丁函數的頭部。14.根據權利要求11所述的裝置,其特征在于,所述裝置還包括: 第二替換模塊,用于在全部線程所對應待執行指令的指針滿足以下條件時,對所述第一被補丁函數進行替換: 所述全部線程所對應待執行指令的指針均未指向對應的所述第一被補丁函數的頭部、所述全部線程所對應待執行指令的指針均未指向在任一所述補丁函數中、任一線程所對應待執行指令的指針之前的調用鏈均未落在所述補丁函數中。15.根據權利要求14所述的裝置,其特征在于,所述第二替換模塊還用于將所述第一被補丁函數中的跳轉指令恢復為未對所述被補丁函數進行替換之前頭部中的指令。16.根據權利要求14所述的裝置,其特征在于,所述裝置還包括: 第二接收模塊,用于接收補丁去激活請求。
【文檔編號】G06F9/44GK105988798SQ201510076617
【公開日】2016年10月5日
【申請日】2015年2月12日
【發明人】李國勝
【申請人】中興通訊股份有限公司