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

文档序号:8942897阅读:来源:国知局
体实现包括:通过dlclose函 数关闭所述动态链接库文件。在一个实施例中,应用程序接收到卸载补丁的指令后,将激活 补丁时修改被补丁函数(raw_getname)的代码指令还原,然后通过通过dlclose函数关闭 补丁文件(如patch, so)。dlclose函数会将patch, so的代码段、数据段从应用程序的进 程空间中移除。
[0045] 本发明提供一种热补丁实现系统。所述热补丁实现系统可以应用于采用动态链接 库技术的操作系统中,例如Iinux操系统。在一个实施例中,如图2所示,所述热补丁实现 系统1包括补丁文件生成模块11、补丁文件加载模块12以及补丁文件激活模块13。其中:
[0046] 补丁文件生成模块11用于将补丁源文件编译成动态链接库文件,所述补丁源文 件包括补丁函数。在一个实施例中,补丁文件生成模块11把补丁源文件编译、链接成Iinux 系统的动态链接库文件。动态链接库文件,是一种不可执行的二进制程序文件,它允许程序 共享执行特殊任务所必需的代码和其他资源。动态链接提供了一种方法,使进程可以调用 不属于其可执行代码的函数。例如,补丁源文件patch, c的内容如下所示:
[0047]
[0048] 在 patch, c (补丁源文件)实现了补丁函数 patch_raw_getname。则将 patch, c 通 过编译、链接生成二进制的动态链接库文件(patch, so)。该动态链接库文件(patch, so)也 可称为补丁文件。
[0049] 补丁文件加载模块12与补丁文件生成模块11相连,用于将所述动态链接库文件 加载到内存中。具体地,补丁文件加载模块12将补丁文件生成模块11生成的所述动态链 接库文件加载到内存中。在一个实施例中,Iinux应用程序在收到加载补丁的指令后,补丁 文件加载模块12调用dlopen函数打开动态链接库文件(patch, so文件)。dlopen函数是 Iinux系统glibc库提供的库函数,功能是将补丁文件(代码段、数据段、BSS段)加载到应 用程序的进程空间,并完成补丁文件中未定义符号的重定位处理。dlopen作为一个库函数, 函数现实的效率及稳定性都有保证。其相关的主要代码如下所示:
[0050] handle = dlopen ( "patch, so",RTLD_N0W);
[0051] if ( ! handle) {
[0052] printf ( " % s\n",dlerror ());
[0053] return-1 ;
[0054] }
[0055] 补丁文件激活模块13与补丁文件加载模块12相连,用于获取所述动态链接库文 件中的补丁函数地址以及应用程序中的被补丁函数地址,修改所述被补丁函数地址的入口 指令为跳转到所述补丁函数地址。激活补丁要完成被补丁函数到补丁函数的跳转。在补丁 源文件中,补丁函数名是在被补丁函数名前加"patch_"前缀标识。如patch, c中补丁函数 patch_raw_getname就是在被补丁函数raw_getname加了 "patch_"前缀。补丁文件激活模 块13使用dlsym函数分别传入补丁函数名和被补丁函数名作为参数,可以得到补丁函数和 被补丁函数在应用程序进程空间的地址。有了地址便可以被补丁函数到补丁函数的跳转。 在一个实施例中,这部分处理伪编码如下所示:
[0056] /*获取补丁函数地址*/
[0057] patch_fun = dlsym(handle, "patch_raw_getname");
[0058] /*获取被补丁函数地址*/
[0059] patched_fun = dlsym(handle, "raw_getname");
[0060] /*修改被补丁函数入口指令,跳转到补丁函数执行;即将被补丁函数入口处 的指令修改成跳转到补丁函数入口的跳转指令机器码。下面假定跳转指令机器码为 0x12345678,具体需要根据具体CPU填充*/
[0061] *patched_fun = 0x12345678 ;
[0062] 补丁文件激活模块13执行以上激活补丁动作后,应用程序在执行到被补丁函数 时,将直接执行跳转指令,跳转补丁函数执行,从而执行补丁函数的指令。
[0063] 在一个实施例中,所述热补丁实现系统1还包括补丁文件卸载模块,补丁文件卸 载模块与所述补丁文件激活模块13相连,用于将所述被补丁函数的入口指令还原,关闭 所述动态链接库文件。在一个实施例中,关闭所述动态链接库文件的具体实现包括:通过 dlclose函数关闭所述动态链接库文件。在一个实施例中,应用程序接收到卸载补丁的指令 后,补丁文件卸载模块将激活补丁时修改被补丁函数(raw_getname)的代码指令还原,然 后通过通过dlclose函数关闭补丁文件(如patch, so)。dlclose函数会将patch, so的代 码段、数据段从应用程序的进程空间中移除。
[0064] 综上所述,本发明的一种热补丁实现方法及系统基于操作系统的动态库机制,包 括使用Iinux提供的函数库函数(dlopen、dlsym、dlopen、dlclose)来实现Iinux应用程 序热补丁的大部分工作。与现有的技术相比,本发明有方案复杂度低,大大减少了开发人员 的工作量,效率高且稳定性更好。所以,本发明有效克服了现有技术中的种种缺点而具高度 产业利用价值。
[0065] 上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟 悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因 此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完 成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
【主权项】
1. 一种热补丁实现方法,其特征在于,所述热补丁实现方法包括: 将补丁源文件编译成动态链接库文件,所述补丁源文件包括补丁函数; 将所述动态链接库文件加载到内存中; 获取所述动态链接库文件中的补丁函数地址以及应用程序中的被补丁函数地址,修改 所述被补丁函数地址的入口指令为跳转到所述补丁函数地址。2. 根据权利要求1所述的热补丁实现方法,其特征在于:将所述动态链接库文件加载 到内存中的具体实现包括:通过dlopen函数打开所述动态链接库文件。3. 根据权利要求1所述的热补丁实现方法,其特征在于:获取所述动态链接库文件中 的补丁函数地址以及应用程序中的被补丁函数地址的具体实现包括:通过dlsym函数分别 获取所述动态链接库文件中的补丁函数地址以及应用程序中的被补丁函数地址。4. 根据权利要求1所述的热补丁实现方法,其特征在于:所述热补丁实现方法还包括: 将所述被补丁函数的入口指令还原,关闭所述动态链接库文件。5. 根据权利要求4所述的热补丁实现方法,其特征在于:关闭所述动态链接库文件的 具体实现包括:通过dlclose函数关闭所述动态链接库文件。6. -种热补丁实现系统,其特征在于:所述热补丁实现系统包括: 补丁文件生成模块,用于将补丁源文件编译成动态链接库文件,所述补丁源文件包括 补丁函数; 补丁文件加载模块,用于将所述动态链接库文件加载到内存中; 补丁文件激活模块,用于获取所述动态链接库文件中的补丁函数地址以及应用程序中 的被补丁函数地址,修改所述被补丁函数地址的入口指令为跳转到所述补丁函数地址。7. 根据权利要求6所述的热补丁实现系统,其特征在于:将所述动态链接库文件加载 到内存中的具体实现包括:通过dlopen函数打开所述动态链接库文件。8. 根据权利要求6所述的热补丁实现系统,其特征在于:获取所述动态链接库文件中 的补丁函数地址以及应用程序中的被补丁函数地址的具体实现包括:通过dlsym函数分别 获取所述动态链接库文件中的补丁函数地址以及应用程序中的被补丁函数地址。9. 根据权利要求6所述的热补丁实现系统,其特征在于:所述热补丁实现系统还包括 补丁文件卸载模块,用于将所述被补丁函数的入口指令还原,关闭所述动态链接库文件。10. 根据权利要求9所述的热补丁实现系统,其特征在于:关闭所述动态链接库文件的 具体实现包括:通过dlclose函数关闭所述动态链接库文件。
【专利摘要】本发明提供一种热补丁实现方法及系统。所述热补丁实现方法包括:将补丁源文件编译成动态链接库文件,所述补丁源文件包括补丁函数;将所述动态链接库文件加载到内存中;获取所述动态链接库文件中的补丁函数地址以及应用程序中的被补丁函数地址,修改所述被补丁函数地址的入口指令为跳转到所述补丁函数地址。本发明的一种热补丁实现方法及系统可以基于操作系统的动态库机制来实现应用程序热补丁的大部分工作。与现有的技术相比,本发明有方案复杂度低,大大减少了开发人员的工作量,效率高且稳定性更好。
【IPC分类】G06F9/445, G06F9/45
【公开号】CN105159738
【申请号】CN201510514816
【发明人】李智荣
【申请人】上海斐讯数据通信技术有限公司
【公开日】2015年12月16日
【申请日】2015年8月20日
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1