[发明专利]在线补丁的激活方法、装置及系统有效
申请号: | 201310157498.8 | 申请日: | 2010-02-11 |
公开(公告)号: | CN103218262B | 公开(公告)日: | 2017-03-15 |
发明(设计)人: | 余加强;郑伟 | 申请(专利权)人: | 华为技术有限公司 |
主分类号: | G06F9/48 | 分类号: | G06F9/48;G06F9/45 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 518129 广东*** | 国省代码: | 广东;44 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 在线 补丁 激活 方法 装置 系统 | ||
技术领域
本发明涉及计算机技术领域,具体涉及一种在线补丁的激活方法、装置及系统。
背景技术
在线补丁是指程序运行中不重启程序而生效的补丁,广泛应用于各类软件。参见图1,激活在线补丁的基本原理是将要原函数(即待打补丁的函数)的入口处的指令替换为跳转指令,然后通过替换的跳转指令将调用原函数的程序跳转到的补丁函数中执行。随着Linux X86系统在电信领域的广泛应用,同样要求对Linux系统中的应用软件能够在线打补丁,但由于X86系统的指令特点以及Linux的调度方式,使得简单的将被替换函数的入口处指令改为跳转指令的补丁激活方式变得不完全可靠,不能满足电信软件对可靠性的要求。
参见图2,在Linux X86系统中,无条件跳转指令占5个字节,激活在线补丁时绝大多数情况下都会覆盖原函数入口处的3条指令,称原函数中这3条指令占用的5个字节的区域为临界区。如果激活在线补丁时直接将原函数入口处的指令替换为跳转指令,则当进程中有多个线程时,有可能出现某线程执行到临界区处(如执行到第一条或第二条指令)时刚好发生线程切换的情况,若此时激活在线补丁,该线程切换回来后由于原函数的临界区代码已被新的跳转指令覆盖,程序便会发生异常。
现有技术一般使用Pannus补丁技术,具体包括以下步骤:
(1)使用函数ptrace将原函数的进程暂停;
(2)检查原函数所有线程的EIP(extended instruction pointer,指令指针寄存器)值是否在临界区;
(3)如果没有线程的EIP值在临界区,则在补丁函数入口写入跳转指令,恢复进程的执行;
(4)如果有线程的EIP值在临界区,则恢复进程执行一段时间,重新暂停进程进行检查;
(5)检查若干次(可自定义,如10次)后,如果还不能激活补丁,则返回激活补丁失败。
由于Pannus先暂停原函数进程,再检查所有线程的EIP值是否在临界区,因此,可以在一定程度上避免因直接写入而发生的程序异常。
发明人在实现本发明过程中,发现现有技术中:
替换函数前只检查当前线程EIP值是否在临界区,一旦有线程是在信号处理函数中,信号的返回地址在临界区内,则在线程处理完信号处理函数后返回时,由于临界区已被跳转指令覆盖,这时将会导致程序出错,因此这种现有技术方案仍然不能保证激活补丁时安全可靠。
发明内容
本发明实施例在于提供一种软件在线补丁的激活方法及系统,以提高应用软件在线补丁激活时的安全性和可靠性。
本发明实施例是通过以下技术方案实现的:
一种在线补丁激活方法,包括:
在待打补丁程序编译时,在所述程序的每个函数入口位置前或后预留中间区;
定位补丁函数的地址和待打补丁函数的入口地址;
基于所述补丁函数的地址和所述待打补丁函数的入口地址,在所述中间区写入用于跳转到所述补丁函数的长跳转指令,其中所述中间区为处于待打补丁函数入口位置前或后,且能放置至少一条长跳转指令的存储空间;
将待打补丁函数入口位置处的指令修改为跳转到所述中间区的短跳转指令,使得所述短跳转指令被执行后,跳转到所述中间区,通过所述中间区指令的执行跳转到所述补丁函数执行;
其中,所述在待打补丁程序编译时,在所述程序的每个函数入口位置前或后预留所述中间区的步骤,包括:
将待打补丁程序的源文件编译生成汇编文件后,查找所述汇编文件中表示函数的关键字字符串;
在找到的表示函数的关键字字符串所指示的函数入口位置的前或后,插入指定字节数的初始指令以预留中间区;其中,所述指定字节数表示所述中间区的大小;
对插入有所述初始指令的汇编文件重新编译生成新的汇编文件,并将新的汇编文件编译生成目标文件,由多个目标文件链接生成待打补丁程序的可执行文件。
一种通信系统,所述通信系统包括至少一个CPU、内存编译器,所述CPU上运行有Linux操作系统,所述Linux操作系统之上运行有至少一种应用程序,所述应用程序关联有补丁管理线程和至少一个业务线程,其中:
所述内存中载入有包含至少一个待打补丁函数的应用程序和包含补丁函数的补丁文件,其中,所述待打补丁函数的入口位置前或后具有能放置至少一条长跳转指令的存储空间;
所述编译器用于在对待打补丁程序进行编译时,在所述待打补丁程序的每个函数入口位置前或后预留能放置至少一条长跳转指令的存储空间;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于华为技术有限公司,未经华为技术有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201310157498.8/2.html,转载请声明来源钻瓜专利网。
- 上一篇:一种阵列基板及其制造方法和显示装置
- 下一篇:封框胶及其制备方法