一种热补丁实现方法及系统的制作方法

文档序号:8942897阅读:447来源:国知局
一种热补丁实现方法及系统的制作方法
【技术领域】
[0001] 本发明涉及一种计算机技术,特别是涉及一种热补丁实现方法及系统。
【背景技术】
[0002] 热补丁(hotfix),又称为patch,指能够修复软件漏洞的一些代码,是一种快速、 低成本修复产品软件版本缺陷的方式。通过电子邮件或者其他途径来通知用户有关热补丁 的消息,一般在软件供应商的网站上可以免费下载补丁程序。和升级软件版本相比,热补 丁的主要优势是不会使设备当前正在运行的业务中断,即在不重启设备的情况下,可以对 设备当前软件版本的缺陷进行修复。每个补丁都有自身的状态,只有在用户命令行的干预 下才能发生切换。补丁状态包括IDLE、DEACTIVE、ACTIVE和RUNNING等不同状态,对补丁 的操作包括加载、临时运行、确认运行、停止运行、删除、安装、卸载等,分别对应命令patch load、patch active、patch run、patch deactive、patch delete 和 patch install、undo patch install。热补丁的实现大部分工作在于补丁文件加载和补丁文件未定义符号的重 定位处理。现有热补丁实现方法是通过开发人员编码完成这部分工作,工作量大且容易出 错。
[0003] 鉴于此,如何找到一种更好的实现热补丁的技术方案就成为了本领域技术人员亟 待解决的问题。

【发明内容】

[0004] 鉴于以上所述现有技术的缺点,本发明的目的在于提供一种热补丁实现方法及系 统,用于解决现有技术中通过开发人员编码完成热补丁实现工作,工作量大且容易出错的 问题。
[0005] 为实现上述目的及其他相关目的,本发明提供一种热补丁实现方法,所述热补丁 实现方法包括:将补丁源文件编译成动态链接库文件,所述补丁源文件包括补丁函数;将 所述动态链接库文件加载到内存中;获取所述动态链接库文件中的补丁函数地址以及应用 程序中的被补丁函数地址,修改所述被补丁函数地址的入口指令为跳转到所述补丁函数地 址。
[0006] 可选地,将所述动态链接库文件加载到内存中的具体实现包括:通过dlopen函数 打开所述动态链接库文件。
[0007] 可选地,获取所述动态链接库文件中的补丁函数地址以及应用程序中的被补丁函 数地址的具体实现包括:通过dlsym函数分别获取所述动态链接库文件中的补丁函数地址 以及应用程序中的被补丁函数地址。
[0008] 可选地,所述热补丁实现方法还包括:将所述被补丁函数的入口指令还原,关闭所 述动态链接库文件。
[0009] 可选地,关闭所述动态链接库文件的具体实现包括:通过dlclose函数关闭所述 动态链接库文件。
[0010] 本发明提供一种热补丁实现系统,所述热补丁实现系统包括:补丁文件生成模块, 用于将补丁源文件编译成动态链接库文件,所述补丁源文件包括补丁函数;补丁文件加载 模块,用于将所述动态链接库文件加载到内存中;补丁文件激活模块,用于获取所述动态链 接库文件中的补丁函数地址以及应用程序中的被补丁函数地址,修改所述被补丁函数地址 的入口指令为跳转到所述补丁函数地址。
[0011] 可选地,将所述动态链接库文件加载到内存中的具体实现包括:通过dlopen函数 打开所述动态链接库文件。
[0012] 可选地,获取所述动态链接库文件中的补丁函数地址以及应用程序中的被补丁函 数地址的具体实现包括:通过dlsym函数分别获取所述动态链接库文件中的补丁函数地址 以及应用程序中的被补丁函数地址。
[0013] 可选地,所述热补丁实现系统还包括补丁文件卸载模块,用于将所述被补丁函数 的入口指令还原,关闭所述动态链接库文件。
[0014] 可选地,关闭所述动态链接库文件的具体实现包括:通过dlclose函数关闭所述 动态链接库文件。
[0015] 如上所述,本发明的一种热补丁实现方法及系统,具有以下有益效果:基于操作系 统的动态库机制,包括使用操作系统提供的函数库函数来实现应用程序热补丁的大部分工 作。与现有的技术相比,本发明有方案复杂度低,大大减少了开发人员的工作量,效率高且 稳定性更好。
【附图说明】
[0016] 图1显示为本发明的热补丁实现方法的一实施例的流程示意图。
[0017] 图2显示为本发明的热补丁实现系统的一实施例的模块示意图。
[0018] 元件标号说明
[0019] 1 热补丁实现系统
[0020] 11 补丁文件生成模块
[0021] 12 补丁文件加载模块
[0022] 13 补丁文件激活模块
[0023] Sl ~S3 步骤
【具体实施方式】
[0024] 以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书 所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实 施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离 本发明的精神下进行各种修饰或改变。
[0025] 需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想, 遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘 制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可 能更为复杂。
[0026] 本发明提供一种热补丁实现方法。所述热补丁实现方法可以应用于采用动态链接 库技术的操作系统中,例如Iinux操系统。在一个实施例中,如图1所示,所述热补丁实现 方法包括:
[0027] 步骤S1,将补丁源文件编译成动态链接库文件,所述补丁源文件包括补丁函数。在 一个实施例中,生成补丁就是把补丁源文件编译、链接成Iinux系统的动态链接库文件。动 态链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需 的代码和其他资源。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函 数。例如,补丁源文件patch, c的内容如下所示:
[0028]
)
[0029] 在 patch, c (补丁源文件)实现了补丁函数 patch_raw_getname。则将 patch, c 通 过编译、链接生成二进制的动态链接库文件(patch, so)。该动态链接库文件(patch, so)也 可称为补丁文件。
[0030] 步骤S2,将所述动态链接库文件加载到内存中。在一个实施例中,Iinux应用程序 在收到加载补丁的指令后,调用dlopen函数打开动态链接库文件(patch, so文件)dlopen 函数是Iinux系统glibc库提供的库函数,功能是将补丁文件(代码段、数据段、BSS段)加 载到应用程序的进程空间,并完成补丁文件中未定义符号的重定位处理。dlopen作为一个 库函数,函数现实的效率及稳定性都有保证。其相关的主要代码如下所示:
[0031] handle = dlopen ( "patch, so",RTLD_N0W);
[0032] if ( ! handle) {
[0033] printf ( " % s\n",dlerror ());
[0034] return-1 ;
[0035] }
[0036] 步骤S3,获取所述动态链接库文件中的补丁函数地址以及应用程序中的被补丁 函数地址,修改所述被补丁函数地址的入口指令为跳转到所述补丁函数地址。激活补丁要 完成被补丁函数到补丁函数的跳转。在补丁源文件中,补丁函数名是在被补丁函数名前加 "patch_"前缀标识。如patch, c中补丁函数patch_raw_getname就是在被补丁函数raw_ getname加了"patch_"前缀。使用dlsym函数分别传入补丁函数名和被补丁函数名作为参 数,可以得到补丁函数和被补丁函数在应用程序进程空间的地址。有了地址便可以实现被 补丁函数到补丁函数的跳转。在一个实施例中,这部分处理伪编码如下所示:
[0037] /*获取补丁函数地址*/
[0038] patch_fun = dlsym(handle, "patch_raw_getname");
[0039] /*获取被补丁函数地址*/
[0040] patched_fun = dlsym(handle, "raw_getname");
[0041] /*修改被补丁函数入口指令,跳转到补丁函数执行;即将被补丁函数入口处 的指令修改成跳转到补丁函数入口的跳转指令机器码。下面假定跳转指令机器码为 0x12345678,具体需要根据具体CPU填充*/
[0042] *patched_fun = 0x12345678 ;
[0043] 执行以上激活补丁动作后,CPU在执行到被补丁函数时,将直接执行跳转指令,跳 转补丁函数执行,从而执行补丁函数的指令。
[0044] 在一个实施例中,所述热补丁实现方法还包括:将所述被补丁函数的入口指令还 原,关闭所述动态链接库文件。关闭所述动态链接库文件的具
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1