熱補丁是什麼
熱補丁(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