專利名稱:有效地打補丁的制作方法
技術領域:
本發明涉及到升級已安裝的計算機程序的操作領域。
背景技術:
打補丁是修改已經安裝的程序,包括應用程序、實用程序、操作系統和操作系統部件、設備驅動程序等等的過程。打補丁對于出于各種目的來修改程序是有用的,這些目的包括糾正程序錯誤、減少或消除安全風險或者提高所修改程序使用的邏輯。打補丁一般是由最初提供要打補丁的程序的公司或其它組織發起的。
安裝的程序主要是由可執行代碼模塊組成的。作為一個例子,許多設計成在來自Washington Redmond的Microsoft Corp.的WINDOWS XP操作系統上執行的程序主要是由叫做“DLL”的可執行代碼模塊組成的。一個打補丁的流行的傳統方法是要在組成要打補丁的安裝程序的可執行代碼模塊中標識出含有希望用補丁來修改的程序代碼的可執行代碼模塊;創建一個新版本的已標識的可執行代碼模塊,在其中已作了需要的修改;并且將新版本的已標識的可執行代碼模塊與安裝程序一起分配給希望應用該補丁的用戶。然后每個用戶確定她/他是否希望應用這個補丁,如果是,執行用新版本的已標識的可執行代碼模塊取代原來版本的已標識的可執行代碼模塊的安裝程序。
傳統的用于打補丁的方法有很多非常不利的地方。這些不利經常增加了與接收和應用補丁有關的負擔。一些情況下,這種增加的負擔延遲了一些用戶對一些補丁的應用,而且甚至阻止了一些用戶對一些補丁的應用。補丁應用中的這種延遲和阻礙在一些情況下可能對用戶有嚴重的負面效果,對那些設計成減少或消除安全風險的補丁來說尤其如此。
傳統的用于打補丁的方法的一個缺陷涉及到必須創建多個補丁進行分配以實現對單個程序的單獨修改的常例。一些情況下,要打補丁的程序有幾個不同的特定可執行代碼模塊的“環境(flavor)”,比如程序被設計成可在其上執行的每個操作系統或操作系統版本,和/或程序的每個自然語言版本的不同環境。這里標識的可執行代碼模塊是這樣的一種可執行代碼模塊以上描述的補丁的創建和分配過程必須為已標識的可執行代碼模塊的每個環境而重復。然后用戶必須選擇并應用已標識的可執行代碼模塊的適當環境的補丁。對大量結果補丁進行分類并選擇在每個用戶的計算機系統上適合的一組補丁來應用是非常繁重的,如此之多以至于這種情況有時被叫做“補丁地獄(patch hell)”。一些情況下,管理員必須維持一個標識了安裝在每個目標系統上的一組可執行模塊版本的目錄數據庫,它用于為每個目標系統選擇適當的常規補丁。
傳統的用于打補丁的方法的另一個缺陷涉及到分配的補丁的較大的尺寸。這對于有以兆比特級大小的可執行代碼模塊來說,并非罕見,這會導致單個補丁有一個可比較的大小,使得它對一些用戶來說難以分配和存儲,或者甚至不可能分配或存儲。這個問題對具有多個環境的補丁來說更要加倍嚴重。進一步說,因為每個常規補丁一般包括一個完整的可替代的可執行模塊,應用常規補丁會產生代碼攪拌(code churn)的問題。
傳統的打補丁的方法的一個進一步的缺陷涉及到一些用戶在應用補丁到生產計算機系統之前要對其進行測試的需要。一些情況下,在計算機系統上安裝一個補丁可能會有相反的結果,比如補丁中包含的新版本的標識的可執行代碼模塊產生一個新的程序錯誤的情況,或與在與補丁應用相對的計算機上運行的另一個程序之間產生新的、不可預料的相互作用的情況。因此,經常在生產系統上應用一個補丁之前,用戶首先對一個測試系統應用該補丁以估計該補丁應用在生產系統中是否安全,該生產系統的數據和操作的維持是重要的。這種獨立的補丁測試增加了與打補丁有關的負擔。此外,在常規補丁產生問題的情況下——比如應用程序兼容性問題或新的開發弱點——在應用補丁充分長的時間后,這種問題很難追溯到該補丁。
傳統的用于打補丁的方法的一個附加的缺陷涉及到補丁內包括的安裝程序的運行。經常地,為了取代為執行程序的一部分的可執行代碼模塊,該安裝程序必須首先終止那個程序的執行。同樣地,一些情況下,這種取代在沒有重新啟動計算機系統的情況下不能完成。所有這些步驟會在打補丁的計算機系統的使用中導致實質的中斷。
傳統的用于打補丁的方法的另一個缺陷包括試圖修補一個可執行模塊,其中已經為那個可執行模塊更早地發布“專用修補”,也叫做“熱修補”給該可執行模塊的適合的用戶子集。這樣的情況下,因為在向根據用戶是否已經應用熱修補的每個用戶來分配取代不同新版本的可執行代碼模塊的常規補丁過程中遇到的困難,通常代之以分配一個取代單個新版本的可執行模塊的簡單的常規補丁,而不考慮用戶是否已經應用熱修補。如果那個新版本包含熱修補,該補丁就向用戶強加上熱修補,而不是接收該熱修補。另一方面,如果那個新版本沒有包含熱修補,它就剝奪了用戶想要接收熱修補的權利。
傳統的用于打補丁的方法另一個缺陷包括對依靠特定可執行模塊,比如一個特定動態鏈接庫的軟件產品的安裝程序經常通過將該可執行模塊存儲在目標計算機系統的文件系統內的一個非標準位置來“隱藏”那個可執行模塊這一事實。因此,有時候確定特定的目標系統是否包含一個需要打補丁的可執行模塊的副本是困難的或不可能的,并且,同樣,也很難確定它位于目標計算機系統的文件系統內的哪個位置。同樣地,一些軟件產品維持已經由安裝程序安裝的可執行模塊版本的一個“目錄”。軟件產品可以依靠特定的可執行模塊版本的目錄中指示的正確性。常規補丁在沒有更新該目錄而用可執行模塊的新版本取代標識的可執行模塊版本的情況下,這種依靠就會失敗了。
傳統的用于打補丁的方法的另一個缺陷根源于在要打補丁的可執行模塊被安裝在目標計算機系統中之前的時間應用它們是不可能的這一事實。因此,如果要打補丁的可執行模塊是在接收那個可執行模塊的常規補丁之后才被安裝到目標計算機系統中,該補丁被應用于該可執行模塊是不可能的。
傳統的用于打補丁的方法的另一個缺陷是它們典型地只能由使用具有自由的修改許可的管理賬戶登錄到目標計算機系統的用戶來應用。為此目的而登錄一個管理賬戶會使該目標計算機系統易受存在于目標計算機系統上尋求修改該目標計算機系統并需要自由的修改許可的病毒的攻擊。
傳統的用于打補丁的方法的另一個缺陷是常規補丁很難或不可能失效,這需要比如倒轉可執行模塊的取代步驟,或者倒轉一個或多個對系統注冊表的修改的步驟。
因此,一個克服了以上討論的傳統的打補丁方法的一些或所有缺陷方面的新的打補丁的方法具有重要的實用性。
附圖簡述
圖1說明了一個適合的工具程序(facility)可在其中實現的計算系統環境的一個例子。
圖2是顯示一個典型的參照該工具程序的計算機系統間數據交換的流程圖。
圖3是顯示由該工具程序為接收并處理新補丁一般執行的步驟的流程圖。
圖4是顯示由該工具程序使用的典型的樣本補丁表格的數據結構圖表。
圖5是顯示由該工具程序為更新一個為特定補丁的配置指令而一般執行的步驟的流程圖。
圖6是顯示由該工具程序為完成一個由補丁指定的參數確認而一般執行的步驟的流程圖。
具體實施例方式
提供了一個用于為安裝的計算機程序代碼(“該工具程序”)打補丁的軟件程序。一些實施例中,該工具程序增加了參數測試和對安裝函數的測試結果處理。另一些實施例中,該工具程序為安裝函數增加不同的其他類型的泛函性(functionality),一些情況下是在安裝函數的執行流程中的任意位置。
一些實施例中,對每個補丁而言,該工具程序向每個要打補丁的計算機系統——即每個“目標計算機系統”分配可以執行測試的一個點的說明、要執行測試的特性和怎樣動作以回應一個或多個不同的測試結果。一些實施例中,該工具程序提供了一組標準的參數確認和可在補丁中被指定的其它測試。例如,補丁可以指定對于一個特定的函數,如果該函數的特定參數沒有一個確定的值,那該函數的調用應該在它實質的執行開始之前會失敗。另一個補丁可以指定對于一個特定的函數,如果特定的參數長度超過指定的最大長度值,那該參數應該在該函數的執行被允許繼續進行之前被截短到指定的最大長度。許多依賴于調用帶有參數值的函數的安全開發,當它們在沒有原有函數代碼的版本內被阻塞時,會導致該函數創建或利用不安全的環境。一些情況下,這種開發可通過使用這種補丁來阻止帶有這種參數值的函數執行而被阻止。一些實施例中,補丁指定了例如從文件中讀取或由用戶輸入的值的測試,而不是對函數參數進行測試。
一些實施例中,一個自動打補丁代理自動接收每個補丁,確認它,并將它們存儲在補丁表格內用于可能的應用程序。一些實施例中,每個補丁被應用于要打補丁的可執行模塊的任何情況下,當接收到補丁時,該模塊已經被加載在目標計算機系統中上。這里該方法稱作為“熱修補”,并且使得補丁一被接收立刻就有效,并且不要求該工具程序能夠確定要打補丁的可執行模塊存儲在磁盤的哪個地方。一些實施例中,每個接收的補丁應用于要打補丁的可執行模塊的磁盤映像,這樣,當磁盤映像在未來時間被加載時,加載的磁盤映像包括該補丁。這里該方法是指“冷修補”,允許補丁跨越多個會話的是持久的。一些實施例中,該工具程序執行熱修補和冷修補。一些實施例中,每次要打補丁的可執行模塊被操作系統加載者加載時,就將每個補丁應用于要打補丁的可執行模塊。這里該方法是指“加載時間補丁”。一些實施例中,每次要打補丁的函數被調用時,就將每個補丁應用于要打補丁的可執行模塊。這里該方法是指“調用截取補丁”。加載時間補丁和調用截取補丁都(1)不要求該工具程序能夠確定要打補丁的可執行模塊存儲在磁盤的哪個地方,(2)方便了特定補丁的有準備的可逆性,并且(3)不要求對可執行模塊的磁盤映像的修改。
一些實施例中,該工具程序允許用戶或管理員配置已被應用的補丁的運行。作為例子,這種配置可以包括,對一個特定的已應用的補丁由該補丁指定的測試在執行到達為該補丁指定的點時是否被執行;由該補丁指定的測試結果處理是被執行還是被忽略;和/或是否測試的性能和/或其結果被記錄、顯示在警告消息中等等。這些實施例中,該工具程序允許通過最初使登陸有效并使結果處理無效而在生產計算機系統上測試補丁。這些實施例中,該工具程序進一步允許在補丁結果處理之后,將該補丁記錄在“詳細(verbose)的模式”中來幫助標識該補丁產生問題的情況,比如應用程序兼容性問題或其它IT問題。如果發現補丁產生問題之后,這些實施例也允許該補丁在應用之后迅速失效。該工具程序的一些實施例也允許通過簡單地從接收并存儲在目標計算機系統中的一組補丁中刪除該補丁而迅速失效。
一些實施例中,該工具程序使用“數據驅動”補丁方法,其中補丁不包含代碼,而包含數據,比如指定了執行測試的點、要執行的測試的特性和怎樣動作作為對一個或多個不同測試結果的響應的一段小的人類可讀的文本或XML文檔。這樣的實施例中,打補丁代理接收數據驅動補丁,并且附加由補丁指定的測試和測試處理。一些實施例中,該工具程序使用“代碼驅動”打補丁方法,其中每個補丁包含附加在要打補丁的可執行模塊上的短程序,該短程序通過調用該工具程序的標準參數測試函數來自行執行測試,并且自行執行測試處理。使用數據驅動補丁或代碼驅動補丁,用單個補丁來處理要打補丁的可執行模塊的所有環境有時候是可能的。
一些實施例中,該工具程序標記每個補丁來證明(1)該補丁來源于一個批準的源頭,并且(2)該補丁的內容從批準源頭創建補丁開始就未被修改。
一些實施例中,該工具程序分配每個補丁給每個目標計算機系統,而且目標計算機系統上的打補丁代理基于目標計算機系統的特征自動確定哪個補丁將在目標計算機系統上應用和它們怎樣被應用。這減輕了用戶和管理員的許多傳統的與選擇和應用補丁有關的負擔,以及維持一個正確的、當前的目錄數據庫的負擔。例如,這些特征可以包括哪個版本的要打補丁的可執行模塊被安裝在目標計算機系統上。這些實施例中,該工具程序可以通過分配為特定可執行模塊的熱修補和未熱修補的環境指定了不同處理的補丁、為那個可執行模塊打補丁時消除為特定可執行模塊犧牲熱修補或使得熱修補普遍存在的需要來克服由熱修補所導致的該類型的問題。
一些實施例中,打補丁代理將每個接收的補丁存儲在目標系統中,而不考慮當該補丁被接收時,要由特定補丁打補丁的可執行模塊是否被安裝在目標系統上。因為在許多情況下,該工具程序應用補丁作為對加載要打補丁的可執行模塊或調用要打補丁的函數的響應,該工具程序可以對在接收補丁到目標系統之后安裝在目標系統上的可執行模塊應用一個補丁。同樣地,補丁可以在要打補丁的可執行模塊卸載和其后的重新安裝中繼續存在。
一些實施例中,打補丁代理在操作系統服務中實現。這些實施例中,工具程序符合打補丁代理應用補丁所需要的任何許可。這些實施例減少了當常規補丁被應用時通常強加的安全風險,因為它們消除了用戶使用具有很寬修改許可的管理賬戶登錄目標計算機系統的任何要求,上述要求會給目標計算機系統上存在的任何病毒修改目標計算機系統的敏感部分的較大機會。
這些由工具程序使用的補丁一般比較小,并因此提出了適度的對傳輸和存儲的資源要求。同樣地,因為工具程序使用的補丁易于以少數定義明確的方式來修改打補丁軟件的行為(behavior),故該工具程序幫助減少了代碼攪拌的問題。
圖1說明了適合的在其中可以實現該工具程序的計算機系統環境100的一個例子。該計算系統環境100只是一個適合的計算環境的例子并沒有任何限制用戶范圍或程序功能性的意圖。對涉及到示例性計算環境100中說明的任一部件或其結合而言,計算環境100被認為與其既無任何依賴性,也非必需。
該工具程序在大量其它的常用或專用計算系統環境或配置中也是可以操作的。適合使用該工具程序的熟知的計算系統、環境和/或配置的例子包括,但不限于個人計算機、服務器計算機、手提或膝上設備、寫字板設備、多處理器系統、基于微處理器的系統、機頂盒、可編程消費者電子設備、網絡PC、微型機、大型機、包括任何以上系統或設備的分布式計算環境等等。
該工具程序可在計算機可讀指令的普通上下文范圍,比如由計算機執行的程序模塊中進行描述。一般來說,程序模塊包括基本例程、程序、對象、部件、數據結構等等,它們執行特定的任務或實現特定的抽象數據類型。該工具程序也可以在任務由通過通信網絡鏈接的遠端處理設備執行的分布式計算環境中施行。在分布式環境中,程序模塊可被安置在包括存儲器存儲設備的本地和/或遠程計算機存儲介質。
關于圖1,一個用于實現該工具程序的示例性系統包括以計算機110的形式的通用計算設備。計算機110的部件可以包括,但不限于處理單元120、系統存儲器130和把包括系統存儲器在內的不同部件耦合到處理單元120的系統總線121。系統總線121可以是許多類型的總線結構,包括存儲器總線或存儲器控制器、外圍總線、和使用多種總線結構的任何一種的局部總線的任何一種。作為例子,而非限制,這種結構包括工業標準結構(ISA)總線、微通道結構(MCA)總線、增強型ISA(EISA)總線、視頻電子標準協會(VESA)局部總線以及外圍組件互聯(PCI)總線,也稱為Mezzanine總線。
計算機110典型地包括多種計算機可讀的介質。計算機可讀介質可以是由計算機110訪問的任何可用介質并包括易失的和非易失的介質、可移動的和不可移動的介質。作為例子,而非限制,計算機可讀介質可以包括計算機存儲介質和通信介質。計算機存儲介質包括易失的和非易失的介質、可移動的和不可移動的介質,這些介質以用于信息存儲的任何方法或技術,比如計算機可讀指令、數據結構、程序模塊或其它數據來實現。計算機存儲介質包括但不限于,RAM、ROM、EEPROM、閃存或其它存儲技術、CDROM、數字化視頻光盤(DVD)或其它的光盤存儲器、磁性磁帶、磁性錄音帶、磁性磁盤存儲器或其它的磁性存儲器設備,或可用于存儲需要的信息并可由計算機110存取的任何其它介質。通信介質典型地包括計算機可讀指令、數據結構、程序模塊或在一個調制數據信號比如載波或其它傳輸裝置中的其它數據并且包括任何信息傳遞介質。術語“調制數據信號”意思是具有一個或多個它的特征集或以信號中編碼信息的方式變換的信號。作為例子,而非限制,通信介質包括比如有線網絡或直接有線連接的有線介質和比如聲頻、RF、紅外線和其它無線介質。以上的任何組合也應該包括在計算機可讀介質的范圍內。
系統存儲器130包括以比如只讀存儲器(ROM)131和隨機存取存儲器(RAM)132的易失的和非易失的存儲器形式的計算機存儲介質。基本輸入/輸出系統133(BIOS)典型地存儲在ROM 131內,它包括如啟動時幫助在計算機110內的元件間傳輸信息的基本例程。RAM 132通常包含可由處理單元120即時存取和/或目前在操作的數據和/或程序模塊。作為例子而非限制,圖1說明了操作系統134、應用程序135、其它程序模塊136以及程序數據13。
計算機110還包括其它可移動/不可移動、易失/非易失計算機存儲介質。僅僅作為例子,圖1顯示了從不可移動的非易失磁性介質讀取或向其中寫入的硬盤驅動器141、從可移動的非易失磁性磁盤152讀取或向其中寫入的磁盤驅動器151、以及用于向諸如CD ROM或其它光學媒介這樣的可移動非易失光學介質156讀寫的光盤驅動器155。其它能用于示例性操作環境的可移動/不可移動、易失/非易失計算機存儲介質包括但不限于磁性盒式磁帶、閃存卡、數字多用途盤、數字視頻磁帶、固態RAM、固態ROM等等。硬盤驅動器141經常通過諸如接口140等不可移動存儲器接口連接到系統總線121,而磁盤驅動器151通過諸如接口150等可移動存儲器接口連接到系統總線121。
圖1討論并示出的驅動器及其關聯的計算機存儲介質為計算機110提供了計算機可讀指令、數據結構、程序模塊和其它數據的存儲。例如,在圖1中,示出硬盤驅動器141作為儲存操作系統144、應用程序145、其它程序模塊146和程序數據147。注意,這些組件可以與操作系統134、應用程序135、其它程序模塊136和程序數據137相同,也可以與它們不同。這里對操作系統144、應用程序145、其它程序模塊146和程序數據147給予不同的標號來說明至少它們是不同的副本。用戶可以通過輸入設備,如寫字板、電子數字化儀164、麥克風163、鍵盤162和定位設備161(通常指鼠標、跟蹤球或觸摸板)向計算機110輸入命令和信息。其它輸入設備(圖1中未示出)可包括操作桿、游戲手柄、圓盤式衛星天線、掃描儀等。這些和其它輸入設備通常通過耦合至系統總線的用戶輸入接口160連接至處理單元120,但是也可以通過其它接口和總線結構相連,如并行端口、游戲端口或通用串行總線(USB)。監視器191或其它類型的顯示設備也通過接口,如視頻接口190連接至系統總線121。監視器191也可以與觸摸屏面板等集成。注意,監視器和/或觸摸屏面板可以物理連接到結合有計算設備110中的外殼,比如一個平板型的個人計算機。此外,比如計算設備110的計算機也可以包括其他外圍輸出設備,比如,揚聲器195和打印機196,它們通過外圍接口194等進行連接。
計算機110可能工作在使用一個或多個到諸如遠程計算機180的遠程計算機的邏輯連接的網絡化環境內。遠程計算機180可以是個人計算機、服務器、路由器、網絡PC、對等設備或其他公共網絡節點,并且一般包括與計算機110相關的許多或所有上述元件,雖然圖1中僅說明了存儲器存儲設備181。圖1所述的邏輯連接包括局域網(LAN)171以及廣域網(WAN)173,但也可以包括其他網絡。這種網絡環境常見于辦公室、企業范圍的計算機網絡、內聯網以及因特網。例如,現在的工具程序中,計算機系統110可以包含數據移植于其中的源頭裝置,而遠程計算機180可以包含目的裝置。然而注意到,源頭和目的裝置不需要由網絡或任何其他裝置連接,代之以數據可通過任何能夠由源頭平臺寫入并由目的平臺讀取的任何裝置進行轉移。
當用于LAN網絡環境時,計算機110通過網絡接口或適配器170連接到局域網LAN 171。當用于WAN網絡環境時,計算機110一般包括調制解調器172或其他裝置,用于在諸如因特網的廣域網173上建立通信。調制解調器172可能是內置或外置的,它通過用戶輸入接口160或其它適合的機制連接到系統總線121。在網絡化環境內,所述與個人計算機110相關的程序模塊或其中的一部分可能存儲在遠程存儲設備內。作為例子,而非限制,圖1說明了將遠程應用程序185駐留在存儲設備181上。應該認識到所示的網絡連接是示例性的,在計算機間建立連接的其他裝置也可以使用。
盡管圖1顯示了存在于特定計算機系統上以特定方式排列的各種功能性和數據,本領域的技術人員意識到這種功能性和數據可以通過不同排列的計算機系統以不同的其他方式分布。盡管以上述方式配置點計算機系統一般用于支持該工具程序的運行,然而本領域的一個普通技術人員意識到該工具程序可以用不同類型和配置并由不同部件的設備來實現。
圖2是顯示了參照本工具程序的計算機系統間一個典型的數據交換的數據流程圖。圖2顯示的計算機系統(計算機系統210、220、221、222、230、231和232)一般有顯示的一些或所有部件并且與圖1結合進行討論。在補丁分配服務器上,該工具程序產生一個或多個補丁。這些補丁201從補丁分配服務器發送到一個或多個管理服務器,比如管理服務器220和230。接著,每個管理服務器將補丁運送到一個或多個目標計算機系統,比如目標計算機系統221、222、231和232。一些實施例中(未顯示),補丁分配服務器直接,或通過一個比通過單個管理服務器更為間接的路徑發送補丁到一個或多個目標計算機系統。在目標計算機系統接收到的補丁在目標計算機系統進行處理,下面將作更詳細的描述。管理服務器也可以發送補丁配置命令202到一個或多個目標計算機系統,該系統應用補丁配置命令以重新配置特定補丁的運行。作為下面更為詳細的描述,補丁可以完全失效;如果補丁沒有失效,其運行通知和測試結果處理可以獨立地生效或失效。當運行通知為生效時,通知可以顯示或本地存儲在目標計算機系統上,或可以作為通知203被發送到適當的管理服務器上。
圖3是顯示該工具程序為了接收和處理新補丁而一般執行的步驟的流程圖。在步驟301,該工具程序接收一個補丁。在步驟301接收的補丁可以是一個數據驅動補丁或是一個代碼驅動補丁。下面的表格1內顯示了一個樣本數據驅動補丁。
1<Softpatch Patch=″Q382429″>
2 <AffectedApplication AffectedExe=″sqlservr.exe″>
3 <AffectedVersion Version=″9.*″>
4 <AffectedModules Name=″SQLSORT.DLL″>
5<Version ″8.0.*, 9.*″>
6 <Function Name=″SsrpEnumCore″Address=″0x0802E76B″7 Param=″2″Paramtype=″LPSTR″>
8<Filter MaxByteLength=″60″/>
9<Resolution ActionType=″BOOL″Action=″FALSE″/>
10 </Function>
11 </Version>
12 <Version ″10.*,11.*″>
13 <Function Name=″SsrpEnumCore″Address=″0x0802D283″14 Param=″2″Paramtype=″LPSTR″>
15 <Filter MaxByteLength=″128″/>
16 <Resolution ActionType=″BOOL″Action=″FALSE″/>
17 </Function>
18 </Version>
19 </AffectedModules>
20 </AffectedVersion>
21</AffectedApplication>
2223<Signature Hash=″MD5″Signature=″C509-64AA-9161-8C52-24 9F6D-BF5A-AEF2-ECE1-0038-34D1″/>
25 </Softpatch>
表格1行1包含一個該補丁唯一的標識符。行2標識了受該補丁影響的應用程序。行3標識了受該補丁影響的應用程序版本。行4標識了受該補丁影響的可執行模塊。行5標識了兩個版本的受影響的可執行模塊——版本8.0.*和9.*——它們提供了打補丁的方向。行6-10包含為這些兩個版本的可執行模塊打補丁的方向。行6-7標識了要打補丁的函數、它在可執行模塊內的地址、由補丁測試的它的參數和要測試參數的類型。行8指示了在行6-7標識的參數應被測試以確定是否其長度超過60字節。行9指示了如果測試成功,該函數的調用應該失敗。行12標示了兩個更多版本的受影響的可執行模塊——版本10.*和11.*——它們提供了打補丁的方向。行13-17包含為這些兩個版本的可執行模塊打補丁的方向。行13-14標識了要打補丁的函數、它在可執行模塊內的地址、由補丁測試的它的參數和要測試參數的類型。可以看到,在行13-14內為版本10.*和11.*標識的可執行模塊內要打補丁的函數地址不同于在行6-7內為版本8.0.*和9.*標識的的可執行模塊內要打補丁的函數地址。行15指示了在行13-14內標識的參數應被測試以確定是否其長度超過128字節。行16指示了如果測試成功,該函數的調用應該失敗。該補丁可以指定各種結果處理動作類型,包括補丁函數調用失敗、出現異常、終止要打補丁的可執行模塊正被執行的進程、或者糾正違規值(比如通過截短過長的串)。行23-25包含對該補丁的識別標志,該標志標識了補丁的源頭并校驗了從離開源頭開始該補丁未被改變。
下面的表格2包含一個以上表格1中顯示的補丁的代碼驅動版本。
1 00411A7E push3Ch2 00411A80 mov eax,dword ptr[str]3 00411A83 pusheax4 00411A84 cailValidateStringLength(411082h)5 00411A89 add esp,86 00411A8C movzx ecx,al7 00411A8F testecx,ecx8 00411A91 je 411A9Ah9 00411A93 jmp foo+2(411AD2h)10 00411A9A xor eax,eax11 00411A9C ret表格2行1-3將用于測試函數的參數推到堆棧上。行4調用測試函數。行5-8將用于測試函數的返回代碼分支。如果測試函數成功,行9跳回開始執行打補丁函數主體部分。如果測試函數失敗,行10-11推動失敗的結果代碼到堆棧上并從打補丁函數返回到要打補丁函數的本色(color)。為了易讀,表格2忽略了顯示在一些代碼驅動補丁內的某些細節,包括用于測試補丁配置標記的當前值的可驗證的標志、指令,和從打補丁函數的代碼的開始重新定位的指令。
一些實施例中,所有類型的補丁可包含附加信息,包括,為要打補丁的可執行模塊的一個或多個版本中每一個版本的可用于校驗可執行模塊的特定情況是適合的該版本的副本的文件簽名。這種文件簽名可以是,例如,為整個可執行模塊版本的大小或校驗和,或者可能發生在可執行模塊內的特定點,比如在要打補丁的可執行模塊的偏移量處,的代碼。
在步驟302,如果補丁帶有合法標志被標記,那么該工具程序繼續到步驟303,否則該工具程序繼續到步驟301以接收下一個補丁。在步驟303,該工具程序增加補丁到本地補丁表格。在步驟304,該工具程序使用補丁的初始配置,比如通過發送它到缺省配置。
圖4是顯示該工具程序使用的一個典型的樣本補丁表格的數據結構圖。補丁表格400包含行,比如行401和402,每個行分為以下列包含從補丁中提取的補丁標識符的補丁標識符列411;包含標識要打補丁的可執行模塊信息,比如其名字的可執行模塊列412;標識了列412內標識的、要應用補丁的所有版本的可執行模塊的可執行模塊版本列413;包含當前配置值的測試性能有效列414,所述當前配置值用于確定打補丁函數被調用時是否每次都執行由補丁指定的測試;包含當前配置值的測試性能通知有效列415,所述當前配置值用于確定補丁測試執行時,是否每次都產生通知;包含當前配置值的測試結果通知有效列416,所述當前配置值用于確定當補丁測試成功時,是否每次都產生通知;包含當前配置值的測試結果處理有效列417,所述當前配置值用于確定當補丁測試失敗時,是否要執行補丁結果處理;和包含到該補丁自身的指針、指定了測試失敗時每次要執行的測試和測試結果處理的補丁列418。一些實施例中,不是如所示包含一個指針,而是該補丁列418直接包括每個補丁。一個特定的補丁表格可包括或指向各種不同類型的補丁,比如所有的代碼驅動的補丁、所有數據驅動的補丁,或者代碼驅動和數據驅動補丁的結合。
在步驟305,一旦該工具程序已經將接收的補丁增加到補丁表格并且初始化了它的配置,該補丁可由該工具程序自動應用于可執行模塊。在步驟305,該工具程序可以使用許多不同的方法來應用該補丁,包括由參考結合的應用中描述的那些,也包括實時函數調用攔截、和/或(1)已經加載的可執行模塊、(2)可執行模塊的一個或多個磁盤映像、或者(3)由操作系統的加載程序加載的可執行模塊的情況的代碼重寫。步驟305之后,該工具程序繼續到步驟301以接收下一個補丁。
圖5是顯示該工具程序為了為特定補丁更新配置指令而一般執行的步驟的流程圖。在步驟501,該工具程序為特定補丁接收配置指令,比如從一個管理員那里。一些實施例中,這種配置指令可由使用組方針的管理員產生。在步驟502,該工具程序參照接收的指令升級補丁表格內補丁的配置。步驟502之后,該工具程序繼續到步驟501以接收下一個配置指令。
圖6是顯示該工具程序為執行由補丁指定的參數變量而一般執行的步驟的流程圖。在步驟601,打補丁函數被調用。在步驟602,如果對影響被調用函數的補丁的測試是可行的,那么該工具程序繼續到步驟603,否則該工具程序繼續到步驟601以處理下一個對打補丁函數的調用。在步驟603,如果對該補丁的測試性能通知可以有效,那么該工具程序繼續到步驟604,否則該工具程序繼續到步驟605。在步驟604,該工具程序產生一個執行測試的通知。步驟604、608和610可以在該測試滿意的目標計算機系統上顯示或存儲一個指示,和/或傳送這種指示到一個遠程計算機系統用于在那里顯示或記錄。
在步驟605,該工具程序執行由補丁指定的確認測試。一些實施例中,步驟605包括調用由該工具程序為測試所用的一組標準例程的其中一個。在步驟606,如果在步驟605執行的測試令人滿意,那么該工具程序繼續到步驟601,否則該工具程序繼續到步驟607。在步驟607,如果為該補丁的測試結果通知無效,那么該工具程序繼續到步驟608,否則該工具程序繼續到步驟609。在步驟608,該工具程序產生一個測試不令人滿意的通知。在步驟609,如果測試結果處理對于補丁有效,那么該工具程序繼續到步驟610,否則,該工具程序繼續到步驟601。在步驟610,該工具程序執行由補丁指定的測試結果處理。步驟610之后,該工具程序繼續到步驟601。
本領域的技術人員應該意識到,以上描述的程序可以直接應用或以不同的方式擴展。例如,可以以不同方式在為不同目的的不同類型的可執行模塊的不同位置使用該工具程序來應用各種不同類型的補丁。同樣地,盡管這里描述的補丁是作為包含當值確認測試失敗時來為其指示一個問題的,但該工具程序也可以用當值確認測試成功時來為其指示一個問題的值確認來實現。一些實施例中,每個測試伴隨一個是成功還是失敗指示問題的一個指示。盡管前面的描述作為首選的實施例而參考,然而本發明的范圍僅僅以下面的權利要求和這里敘述的元件來定義。
權利要求
1.一種計算系統內用于擴充軟件的方法,包括在目標計算機系統中接收一個擴充規格表以指定(a)要擴充的函數,所指定的函數在計算系統中所執行的軟件中,(b)要測試的函數的參數,(c)應用于所指定參數的測試,和(d)如果所指定的參數不滿足于所指定的測試,就執行對函數狀態的修改;以及當在目標計算機系統上調用所指定的函數時,如果所指定的參數不能滿足指定的測試時,就對所指定函數的狀態進行指定的修改。
2.如權利要求1所述的方法,其特征在于,由所述擴充規格表所指定的修改阻止了所指定函數的執行。
3.如權利要求1所述的方法,其特征在于,由所述擴充規格表所指定的修改是在所指定參數改變之后執行所指定的函數。
4.如權利要求1所述的方法,其特征在于,在所述目標計算機系統中接收多個擴充規格表。
5.如權利要求4所述的方法,其特征在于,進一步包括在一種數據結構內來維護所有接收到的擴充規格表。
6.如權利要求1所述的方法,其特征在于,在接收所述擴充規格表后,并不要求用戶干涉以執行對所指定函數狀態的指定修改。
7.如權利要求1所述的方法,其特征在于,所述擴充規格表通過識別參數測試函數以進行調用來指定將測試應用于所指定的參數,所述參數測試函數的代碼不包含在所述擴充規格表中。
8.如權利要求1所述的方法,其特征在于,所述擴充規格表通過識別參數測試函數以進行調用來指定將測試應用于所指定的參數,所述參數測試函數在接收所述擴充規格表之前就已安裝。
9.如權利要求1所述的方法,其特征在于,所述擴充規格表包含代碼。
10.如權利要求9所述的方法,其特征在于,由所述擴充規格表包含的代碼包括調用參數測試函數的參數,所述參數測試函數的代碼不包含在所述擴充規格表中。
11.如權利要求1所述的方法,其特征在于,所述擴充規格表包含識別參數測試函數的文本,所述參數測試函數的代碼不包含在所述擴充規格表中。
12.如權利要求11所述的方法,其特征在于,由擴充規格表含有的文本所識別的參數測試函數的代碼包含在所述擴充規格表中。
13.如權利要求11所述的方法,其特征在于,由擴充規格表未含有的文本所識別的參數測試函數的代碼不包含在所述擴充規格表中。
14.如權利要求1所述的方法,其特征在于,進一步包括提供一個用于配置控制所述擴充規格表操作情況的接口,并且僅當該情況為有效狀態時,才對指定函數的狀態進行指定修改。
15.如權利要求14所述的方法,其特征在于,所提供的接口允許所述擴充規格表的操作被本地配置。
16.如權利要求14所述的方法,其特征在于,所提供的接口允許所述擴充規格表的操作被遠程配置。
17.如權利要求14所述的方法,其特征在于,所提供的接口允許所述擴充規格表的操作根據策略被配置。
18.如權利要求14所述的方法,其特征在于,所指定的測試是在執行所指定函數的任意實際代碼之前被執行。
19.如權利要求1所述的方法,其特征在于,進一步包括提供一個用于配置與所述擴充規格表相關警告的接口,并且如果所提供的接口用于使警告有效,就在由所述擴充規格表指定的測試每次失敗時產生一個警告。
20.如權利要求1所述的方法,其特征在于,進一步包括提供一個用于配置與所述擴充規格表相關通知的接口,并且如果所提供的接口用于使通知有效,就在由所述擴充規格表指定的測試每次執行時產生一個通知。
21.如權利要求20所述的方法,其特征在于,進一步包括將所產生的通知合并到單個已經合并的通知中。
22.如權利要求1所述的方法,其特征在于,所接收的擴充規格表被標記,該方法進一步包括驗證所述擴充規格表的簽名,并且,僅當對所述擴充規格表的簽名的驗證成功時,才執行對指定函數狀態進行的指定修改。
23.如權利要求22所述的方法,其特征在于,僅當所述擴充規格表的簽名的簽名人與含有指定函數的軟件的簽名人匹配時,才執行對指定函數的狀態進行的指定修改。
24.如權利要求1所述的方法,其特征在于,進一步包括響應于檢測到所指定函數已經被調用來執行所指定的測試,而不改變所指定函數的代碼。
25.如權利要求1所述的方法,其特征在于,進一步包括當調用所指定函數時,改變所指定函數的代碼以執行所指定的測試。
26.如權利要求25所述的方法,其特征在于,通過在所指定函數的代碼中插入一個到執行所述指定測試的單獨例行程序的跳轉以改變所指定函數的代碼。
27.如權利要求1所述的方法,其特征在于,在已鑒別的可執行模塊中提供所指定的函數,所述模塊使用加載程序進行加載,而所述方法進一步包括對加載程序進行登記以具有一個例行程序,該程序在響應對所指定函數的每次調用而執行所指定函數之前來執行所指定的測試。
28.一種允許在計算系統中存在的軟件進行擴充的計算系統,包括含有該軟件的存儲設備;補丁接收程序,在所述計算系統中接收補丁,該補丁指定了(a)一個指針,在該指針處要擴充該軟件,(b)與在指定指針處要測試的函數相關的一個值,(c)應用于所述指定值的測試,以及(d)如果指定的值不能滿足所指定的測試,就執行對軟件狀態的修改;以及打補丁代理,在所指定指針處將代碼注入軟件,這樣,當軟件的執行到達目標計算機系統的所指定指針時,如果指定的值不能滿足所指定的測試,就執行對軟件狀態的所指定修改。
29.一種計算機可讀介質,其內容引起目標計算系統執行一種為確認所述目標計算系統中可用的軟件添加值的方法,包括在所述計算系統中接收一個擴充規格表,該規格表指定了(a)要添加值確認的函數,(b)在函數執行期間,在目標計算系統中存在的要進行測試的數據,(c)要應用于所指定數據的測試,以及(d)如果指定的數據不能滿足所指定的測試,就執行對函數狀態的所指定的修改;以及當在目標計算機系統上調用所指定的函數時,如果所指定的數據不能滿足所指定的測試,就對所指定函數的狀態進行指定的修改。
30.如權利要求22所述的計算機可讀介質,其特征在于,所指定測試是一種通常都能滿足的測試,而不需要考慮所指定的數據值。
31.一種傳送補丁數據結構所生成的數據信號,包括識別要添加值確認的函數的信息;識別在函數執行期間存在的要測試的數據的信息;識別要應用于所指定數據的測試的信息;以及識別如果所指定的數據不能滿足所指定的測試,就對所指定函數的狀態進行修改的信息,這樣,如果在執行指定函數的目標計算機系統上接收到數據信號,該數據信號的內容就能用于當在目標計算機系統上調用所指定函數時,如果所指定的數據不能滿足所指定的測試,就對所指定函數的狀態進行指定的修改。
32.如權利要求31所述的所生成數據信號,其特征在于,所生成的數據信號在計算機系統之間進行傳送。
33.如權利要求31所述的所生成數據信號,其特征在于,所生成數據信號在計算機系統之間進行傳送。
34.一種用于為目標計算系統中可用軟件添加值確認的方法,包括在所述計算系統中接收一個擴充規格表,該規格表指定了(a)要添加值確認的軟件,(b)在所指定軟件中要添加值確認的指針,(c)在所指定軟件執行期間目標計算系統上存在的在所指定指針處要測試的數據,(d)要應用于所指定數據的測試,以及(e)如果指定的數據不能滿足所指定的測試,就執行對軟件狀態的修改;允許用戶配置所接收擴充規格表的操作模式;以及當在目標計算機系統上所指定指針處執行所指定的函數時,以與配置的所接收的擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表。
35.如權利要求34所述的方法,其特征在于,所述用戶配置用于所述擴充規格表的有效操作模式,并且以與配置的所接收的擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表的步驟包括如果指定的數據不能滿足所指定的測試,就執行對所指定軟件狀態的修改。
36.如權利要求34所述的方法,其特征在于,所述用戶配置的所述擴充規格表的有效診斷操作模式,并且,其中以與配置的所接收擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表的步驟包括如果指定的數據不能滿足所指定的測試,就執行(1)執行對所指定軟件狀態的指定修改,以及(2)產生指定的數據不能滿足所指定的測試的通知。
37.如權利要求34所述的方法,其特征在于,所述用戶配置用于所述擴充規格表的詳細有效操作模式,并且,以與配置用于所接收的擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表的步驟包括如果指定的數據不能滿足所指定的測試,就執行對所指定軟件狀態的指定修改,以及產生指定的測試被執行的通知。
38.如權利要求34所述的方法,其特征在于,所述用戶配置用于所述擴充規格表的詳細診斷操作模式,并且其中,以與配置用于所接收的擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表的步驟包括如果指定的數據不能滿足所指定的測試,就執行(1)執行對所指定軟件狀態的指定修改,以及(2)產生指定的數據不能滿足所指定的測試的通知。產生指定的測試被執行的通知。
39.如權利要求34所述的方法,其特征在于,所述用戶配置用于所述擴充規格表的無效操作模式,并且其中,以與配置用于所接收的擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表的步驟包括忽略對所指定軟件的狀態進行指定修改,而不考慮所指定的數據是否能滿足所指定的測試。
40.如權利要求34所述的方法,其特征在于,所述用戶配置用于所述擴充規格表的無效診斷操作模式,并且其中,以與配置用于所接收的擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表的步驟包括忽略對所指定軟件的狀態進行指定修改,而不考慮所指定的數據是否能滿足所指定的測試;如果指定的數據不能滿足所指定的測試,就產生指定的數據不能滿足所指定測試的通知。
41.如權利要求34所述的方法,其特征在于,所述用戶配置用于所述擴充規格表的無效診斷操作模式,并且其中,以與配置用于所接收的擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表的步驟包括忽略對所指定軟件的狀態進行指定修改,而不考慮所指定的數據是否能滿足所指定的測試;以及產生指定的測試被執行的通知。
42.如權利要求34所述的方法,其特征在于,所述用戶配置用于所述擴充規格表的無效診斷操作模式,并且其中,以與配置用于所接收的擴充規格表的操作模式相一致的方式來應用所接收的擴充規格表的步驟包括忽略對所指定軟件的狀態進行指定修改,而不考慮所指定的數據是否能滿足所指定的測試;產生指定的測試被執行的通知;如果指定的數據不能滿足所指定的測試,就產生指定的數據不能滿足所指定測試的通知。
全文摘要
這里描述了一個用于在目標計算機系統中擴充軟件的工具程序。該工具程序在計算系統內接收擴充規格表。所述擴充規格表指定了(a)要擴充的函數,(b)要測試的函數參數,(c)應用于所指定參數的測試,和(d)如果所指定的參數不滿足于所指定的測試,就執行對函數狀態的修改。當在目標計算機系統上調用所指定的函數時,如果所指定的參數不能滿足所指定的測試,所述工具程序就對所指定函數的狀態進行指定的修改。
文檔編號G06F11/36GK1696910SQ20051006507
公開日2005年11月16日 申請日期2005年4月8日 優先權日2004年5月11日
發明者A·布魯姆菲爾德, G·古蘭, J·加姆斯, S·A·阿爾施巴尼, S·A·菲爾德 申請人:微軟公司