如果要修改一个已经编译完成的可执行文件中某个函数的执行流程,有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 Format
Redirecting 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热补丁的实现相关推荐

  1. Linux实现热补丁

    热补丁是什么 热补丁(hotfix),又称为patch,指能够修复软件漏洞的一些代码,是一种快速.低成本修复产品软件版本缺陷的方式.通过电子邮件或者其他途径来通知用户有关热补丁的消息,一般在软件供应商 ...

  2. linux内核热修复,揭露内核黑科技 - 热补丁技术真容

    原创 理查德 Linux阅码场 6月12日 内核热补丁是一种无需重启操作系统,动态为内核打补丁的技术.系统管理员基于该技术,可以在不重启系统的情况下,修复内核BUG或安全漏洞,可以在最大程度上减少系统 ...

  3. Linux内核热补丁方案对比

    Linux内核热补丁方案对比 荣涛 2021年10月13日 1. Linux 内核热补丁 1.1. linux 内核热补丁技术背景 1.1.1. update和upgrade的区别 1.1.1.1. ...

  4. 如何替换一个Linux内核函数的实现-热补丁原理

    昨晚发过誓了.不会再接着写二进制hook的手艺了,今天有网友咨询技术细节,终于又忍不住了- 为了不违背即便是胡乱说出口誓言,今天不写二进制hook,今天用C语言写,二进制只是沾点边儿! 看题目, 替换 ...

  5. Linux 4.1内核热补丁成功实践

    最开始公司运维同学反馈,个别宿主机上存在进程CPU峰值使用率异常的现象.而数万台机器中只出现了几例,也就是说万分之几的概率.监控产生的些小误差,不会造成宕机等严重后果,很容易就此被忽略了.但我们考虑到 ...

  6. 零代价修复海量服务器的内核缺陷——UCloud内核热补丁技术揭秘

    下述为UCloud资深工程师邱模炯在InfoQ架构师峰会上的演讲--<UCloud云平台的内核实践>中非常受关注的内核热补丁技术的一部分.给大家揭开了UCloud云平台内核技术的神秘面纱. ...

  7. Android热补丁技术—dexposed原理简析(手机淘宝采用方案)

    上篇文章<Android无线开发的几种常用技术>我们介绍了几种android移动应用开发中的常用技术,其中的热补丁正在被越来越多的开发团队所使用,它涉及到dalvik虚拟机和android ...

  8. 内核热补丁,真的安全么?

    简介: Linux 内核函数的热替换"撞上"函数调用约定还靠谱吗? Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在比较常见的比 ...

  9. LibcarePlus用户态程序热补丁

    LibcarePlus https://gitee.com/openeuler/docs/edit/stable2-20.03_LTS_SP1/docs/zh/docs/Virtualization/ ...

最新文章

  1. oracle11g的安装
  2. protoc支持c_protoc 命令参数
  3. Confluence 6 数据库结构图
  4. python版本升级及pip部署方法
  5. 打造安全可靠的研发中心桌面
  6. 找出不是两个数组共有的元素(学习去重复算法)
  7. 本地连接远程access数据库
  8. .NET 5(C#) 将控制台程序(Console Application)发布成单个exe文件
  9. 2019-1-3 每日一记
  10. 【架构风格 架构模式 设计模式 概念】
  11. 利用Linux查找重复文件(shell脚本)
  12. Android系统ANR错误实战分析
  13. 联想s40-70进入bios方法。
  14. 云计算第四次作业—web网站的搭建
  15. python拨打网络电话_0成本搭建IP电话系统,统一通信系统,呼叫中心系统-3CX快速安装手册...
  16. Centos6.4忘记密码 单机下修改root密码
  17. 查快递单号物流信息查询,支持多家快递
  18. 终于,“亚麻百货”也要来了!
  19. java自动生成word,java动态生成word解决方案
  20. UE使用技巧之---去空格

热门文章

  1. RPA—pyautogui+PIL+pandas识别全版本(2.0-3.0)滑动验证码,获取表格数据
  2. SparkRDD算子--mapPartitionsWithIndex算子
  3. Android 经典 Crash 分析,Android Crash 原理分析
  4. java 实现http长轮询,webim使用http长轮询如何保证消息的绝对实时性
  5. 制作圆形图片,你会以下几种?
  6. python Selenium浏览器爬虫指南 --未完成版本
  7. 均衡发展国检时计算机会问哪些问题,XX小学均衡发展迎国检工作方案.doc
  8. FileSaver+xlsx 表格下载为excel
  9. Roadstar.ai陷罗生门!内斗升级,周光与另两位创始人各执一词...
  10. Firefox旧版本及插件安装下载