Linux實現熱補丁

熱補丁是什麼

熱補丁(hotfix),又稱爲patch,指能夠修復軟件漏洞的一些代碼,是一種快速、低成本修復產品軟件版本缺陷的方式。通過電子郵件或者其他途徑來通知用戶有關熱補丁的消息,一般在軟件供應商的網站上可以免費下載補丁程序。和升級軟件版本相比,熱補丁的主要優勢是不會使設備當前正在運行的業務中斷,即在不重啓設備的情況下,可以對設備當前軟件版本的缺陷進行修復。

Linux熱補丁實現

如果要修改一個已經編譯完成的可執行文件中某個函數的執行流程,有2種方式:

·       通過設置LD_PRELOAD,但這種方式需要重啓已經運行的可執行文件。

·       通過修改可執行文件某個函數指向的地址,指向新的函數,這種方式可不重啓已經運行的可執行文件。

這裏討論第2種方式,即熱補丁(hotpatch)。 

要實現熱補丁,有2種方式(如果有新方式,歡迎補充):

·       在開發之初就讓程序支持熱補丁的加載,這種方式適合於擁有程序源碼的情況。

·       直接將熱補丁打到可執行程序中,不依賴於程序的源碼。

下面分別介紹下這2種方式的實現。

讓程序支持熱補丁


1.     先在可執行文件中找到存儲函數的的地址pRelocate(在程序的relocation section)

2.     保存原始函數的地址pOriginal(即*pRelocation),此步可用於打補丁不成功後的恢復

3.     加載補丁文件,加載時機下面討論

4.     加載補丁文件完成後,找到補丁文件中的函數地址pPatchFun

5.     將存儲的函數地址指向新的補丁函數,*pRelocation =pPatchFun

至於第3步,實現的方式也有多種,可通過發信號、監控補丁配置文件變化(使用inotify)等。 

更多請參考: 
Executableand Linkable Format 
Redirectingfunctions in shared ELF libraries 

直接打熱補丁

1.     attach到目標進程(使用ptrace)

2.     在進程中找到dlopen等函數的地址

3.     在可執行文件中找到存儲函數的的地址pRelocate

4.     保存原始函數的地址pOriginal(即*pRelocation),此步可用於打補丁不成功後的恢復

5.     通過dlopen將補丁文件加載到進程空間

6.     加載補丁文件完成後,找到補丁文件中的函數地址pPatchFun

7.     將存儲的函數地址指向新的補丁函數,*pRelocation =pPatchFun

此種方法比前一種方法多了前2步。 

更多請參考: 
linux hotpatch

參考:http://blog.csdn.net/byrantch/article/details/51231957

發佈了28 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章