Linux热补丁的实现

作者: kissLife | 来源:发表于2016-05-07 16:24 被阅读947次

    如果要修改一个已经编译完成的可执行文件中某个函数的执行流程,有2种方式:

    • 通过设置LD_PRELOAD,但这种方式需要重启已经运行的可执行文件。
    • 通过修改可执行文件某个函数指向的地址,指向新的函数,这种方式可不重启已经运行的可执行文件。这里讨论第2种方式,即热补丁(hotpatch)。

    要实现热补丁,有2种方式(如果有新方式,欢迎补充):

    • 在开发之初就让程序支持热补丁的加载,这种方式适合于拥有程序源码的情况。
    • 直接将热补丁打到可执行程序中,不依赖于程序的源码。

    下面分别介绍下这2种方式的实现。

    让程序支持热补丁

    1. 先在可执行文件中找到存储函数的的地址pRelocate(在程序的relocation section)
    2. 保存原始函数的地址pOriginal(即*pRelocation),此步可用于打补丁不成功后的恢复
    3. 加载补丁文件,加载时机下面讨论
    4. 加载补丁文件完成后,找到补丁文件中的函数地址pPatchFun
    5. 将存储的函数地址指向新的补丁函数,*pRelocation = pPatchFun至于第3步,实现的方式也有多种,可通过发信号、监控补丁配置文件变化(使用inotify)等。

    更多请参考:Executable and Linkable FormatRedirecting functions in shared ELF libraries

    直接打热补丁

    1. attach到目标进程(使用ptrace)
    2. 在进程中找到dlopen等函数的地址
    3. 在可执行文件中找到存储函数的的地址pRelocate
    4. 保存原始函数的地址pOriginal(即*pRelocation),此步可用于打补丁不成功后的恢复
    5. 通过dlopen将补丁文件加载到进程空间
    6. 加载补丁文件完成后,找到补丁文件中的函数地址pPatchFun
    7. 将存储的函数地址指向新的补丁函数,*pRelocation = pPatchFun此种方法比前一种方法多了前2步。

    更多请参考:linux hotpatch

    相关文章

      网友评论

        本文标题:Linux热补丁的实现

        本文链接:https://www.haomeiwen.com/subject/ogxsrttx.html