热补丁是什么
热补丁(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
文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux25392 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!