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热补丁的实现

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

  • Linux MySQL+Keepalived主主热备

    上一篇Linux Keepalived双机热备实现了Linux Keepalived双机热备利用Nginx进行节点...

  • Android Sophix 补丁生成工具使用

    为了实现阿里Sophix 热更新功能实现 这里记录下 Sophix 补丁生成工具的使用方式 1. 工具下载地址 下...

  • Linux下安装配置LIDS系统

    LIDS全称为Linux Intrusion Detection System,是一种基于Linux内核补丁模式的...

  • React Native CodePush热更新

    以前做Android原生的时候,用腾讯bugly实现热更新,发布补丁的时候,android界面是没有任何提示的,在...

  • Andfix源码分析

    热修复主要有三个步骤: 1 生成差异补丁 2 加载差异补丁 3 替换方法 1.1 生成差异补丁 阿里提供的差量补丁...

  • 热修复-热门框架对比

    一、什么是热修复? 热修复:让应用能够在无需重新安装的情况实现更新,帮助应用快速建立动态修复能力。其实就是打补丁包...

  • javassist即时编译技术,美团热修复核心与原理解密01-美

    什么是热修复技术? 关于热修复这个名词,并不陌生。相信大家都有过更新window补丁的经历,通过补丁可以动态修复系...

  • Android关于热修复

    热修复: 热修复(也称热补丁、热修复补丁,英语:hotfix)是一种包含信息的独立的累积更新包,通常表现为一个或多...

  • 插件化与热修复

    Android插件化:从入门到放弃 插件化开发小结 Android热更新技术的研究与实现 各大热补丁方案分析和比较...

网友评论

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

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