补丁加载方法及装置制造方法

文档序号:6536714阅读:145来源:国知局
补丁加载方法及装置制造方法【专利摘要】本发明实施例提供一种补丁加载方法及装置,该方法包括:编译补丁代码生成可重定位的动态链接库,所述补丁代码为以补丁函数为单位的指令;解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系,所述目标进程为加载所述补丁代码后的应用程序在运行时所处的进程;根据所述补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行所述补丁函数。本发明实施例通过将补丁代码编译生成动态加载库的方式,实现同一补丁代码对多个版本应用程序的通用。【专利说明】补丁加载方法及装置【
技术领域
】[0001]本发明实施例涉及通信技术,尤其涉及一种补丁加载方法及装置。【
背景技术
】[0002]应用程序是为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。每一个应用程序运行于独立的进程,且拥有自己独立的地址空间。但应用程序在应用过程中可能存在一定的缺陷,需后续维护时编写修复该缺陷的程序作为补丁代码,进程运行该应用程序时加载补丁代码,以保证进程顺利运行。[0003]目前的补丁加载方案,通常先离线将补丁代码编译链接为目标文件;再以待修复软件的符号绝对地址为依据,将目标文件制作成待修复软件中原有函数和补丁代码中补丁函数的替换对应关系的绝对地址镜像文件;待绝对地址镜像文件被加载到设备后,根据上述替换对应关系确定需要打补丁的原有函数,以及原有函数和补丁函数的地址,并将原有函数的入口指令修改为跳转指令,跳转到补丁函数入口处,从而实现在中央处理器(CentralProcessingUnit,简称:CPU)执行到原有函数时,补丁函数将被执行。[0004]对于多版本应用程序,采用上述补丁加载方案进行补丁加载时,生成多份绝对地址镜像文件,导致补丁代码管理和维护的难度。【
发明内容】[0005]本发明实施例提供一种补丁加载方法及装置,以解决现有的补丁加载方案中补丁代码管理和维护难度高的问题。[0006]第一方面,本发明实施例提供一种补丁加载方法,包括:[0007]编译补丁代码生成可重定位的动态链接库,所述补丁代码为以补丁函数为单位的指令;[0008]解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系,所述目标进程为加载所述补丁代码后的应用程序在运行时所处的进程;[0009]根据所述补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行所述补丁函数。[0010]结合第一方面,在第一方面的第一种可能的实现方式中,所述解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系之前,所述方法还包括:[0011]找出目标进程中加载的镜像文件,采用可执行的链接格式ELF解析所述镜像文件,获取所述镜像文件中的原有函数和原有全局变量对应的名称和绝对地址,得到所述目标进程的符号表,所述符号表包含所述原有函数和所述原有全局变量对应的名称。[0012]结合第一方面的第一种可能的实现方式,在第一方面的第二种可能的实现方式中,所述解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系,包括:[0013]分析所述补丁镜像文件,记录所述补丁镜像文件中的补丁函数和补丁全局变量的名称和相对地址;[0014]分析所述补丁镜像文件中的重定位段,获取重定位函数和重定位全局变量的名称和相对地址;[0015]根据所述重定位函数和重定位全局变量的名称和相对地址,建立所述补丁镜像文件和目标进程的连接关系。[0016]结合第一方面的第二种可能的实现方式,在第一方面的第三种可能的实现方式中,所述根据所述补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行所述补丁函数,包括:[0017]在所述目标进程的符号表中,查找所述重定位函数名称和/或所述重定位全局变量名称;[0018]若确定所述重定位函数名称和所述重定位全局变量名称存在于所述目标进程中,则将其标记为目标进程内函数或目标进程内变量;[0019]将所述目标进程内函数和/或目标进程内变量从所述重定位段中移除,并调用系统的动态链接库加载函数重定位所述动态链接库中的符号;以及,[0020]根据所述补丁镜像文件的加载内存地址及所述目标进程内函数和所述目标进程内变量的相对地址,得到所述目标进程内函数和所述目标进程内变量的重定位地址并写A;[0021]修改所述原有函数的入口指令,跳转执行所述补丁函数。[0022]结合第一方面、第一方面的第一种至第三种可能的实现方式中的任意一种,在第一方面的第四种可能的实现方式中,所述根据所述补丁镜像文件和目标进程的连接关系,修改所述原有函数的入口指令,跳转执行所述补丁函数之前,所述方法还包括:[0023]调用补丁初始化入口函数,完成所述补丁镜像文件的初始化。[0024]第二方面,本发明实施例提供一种补丁加载装置,包括:[0025]编译模块,用于编译补丁代码生成可重定位的动态链接库,所述补丁代码为以补丁函数为单位的指令;[0026]加载模块,用于解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系,所述目标进程为加载所述补丁代码后的应用程序在运行时所处的进程;及,根据所述补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行所述补丁函数。[0027]结合第二方面,在第二方面的第一种可能的实现方式中,所述加载模块还用于:[0028]在所述解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系之前,找出目标进程中加载的镜像文件,采用可执行的链接格式ELF解析所述镜像文件,获取所述镜像文件中的原有函数和原有全局变量对应的名称和绝对地址,得到所述目标进程的符号表,所述符号表包含所述原有函数和所述原有全局变量对应的名称。[0029]结合第二方面的第一种可能的实现方式,在第二方面的第二种可能的实现方式中,所述加载模块具体用于:[0030]分析所述补丁镜像文件,记录所述补丁镜像文件中的补丁函数和补丁全局变量的名称和相对地址;[0031]分析所述补丁镜像文件中的重定位段,获取重定位函数和重定位全局变量的名称和相对地址;[0032]根据所述重定位函数和重定位全局变量的名称和相对地址,建立所述补丁镜像文件和目标进程的连接关系。[0033]结合第二方面的第二种可能的实现方式,在第二方面的第三种可能的实现方式中,所述加载模块还具体用于:[0034]在所述目标进程的符号表中,查找所述重定位函数名称和/或所述重定位全局变量名称;[0035]若确定所述重定位函数名称和所述重定位全局变量名称存在于所述目标进程中,则将其标记为目标进程内函数或目标进程内变量;[0036]将所述目标进程内函数和/或目标进程内变量从所述重定位段中移除,并调用系统的动态链接库加载函数重定位所述动态链接库中的符号;以及,[0037]根据所述补丁镜像文件的加载内存地址及所述目标进程内函数和所述目标进程内变量的相对地址,得到所述目标进程内函数和所述目标进程内变量的重定位地址并写A;[0038]修改所述原有函数的入口指令,跳转执行所述补丁函数。[0039]结合第二方面、第二方面的第一种至第三种可能的实现方式中的任意一种,在第二方面的第四种可能的实现方式中,所述加载模块还用于:[0040]在所述根据所述补丁镜像文件和目标进程的连接关系,修改所述原有函数的入口指令,跳转执行所述补丁函数之前,调用补丁初始化入口函数,完成所述补丁镜像文件的初始化。[0041]本发明实施例通过将补丁代码编译生成动态加载库的方式,实现同一补丁代码对多个版本应用程序的通用,降低补丁代码管理和维护的难度;另外,由于动态链接库支持动态多次加载和删除,因此,补丁镜像文件可动态加载及卸载,无需复位系统,对系统业务无影响。【专利附图】【附图说明】[0042]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。[0043]图1为本发明补丁加载方法实施例一的流程图;[0044]图2为本发明补丁加载方法实施例二的流程图;[0045]图3为本发明补丁加载方法实施例二中S204的流程示例图;[0046]图4为本发明补丁加载装置实施例一的结构示意图。【具体实施方式】[0047]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。[0048]图1为本发明补丁加载方法实施例一的流程图。本发明实施例提供一种补丁加载方法,该方法可以由补丁加载装置执行,该装置可以集成在通信设备中,其中,通信设备可以为个人计算机(PersonalComputer,简称:PC)、笔记本电脑或服务器等终端设备。如图1所示,该方法包括:[0049]S101、编译补丁代码生成可重定位的动态链接库,该补丁代码为以补丁函数为单位的指令。[0050]在现有技术中,离线编译补丁代码,针对具体的应用程序版本,将补丁代码链接为绝对定位的二进制补丁镜像文件,其中,补丁镜像文件的起始地址通过预先规划好的补丁空间地址确定,由于补丁代码链接时的地址和补丁代码加载后的地址须一致,导致制作好的补丁代码只能放到设备中预先划分好的补丁空间,若该补丁空间保留过小,将影响后续补丁代码的加载,若该补丁空间保留过大,则造成内存的浪费,且多次增删补丁,易产生内存碎片,即现有技术中补丁空间的伸缩性差。[0051]在本发明实施例中,通过编译补丁代码生成动态链接库。具体地,将补丁代码按照标准的目标文件生成方式进行编译和生成;然后,将一个或多个补丁目标文件,采用“ld-fpic-shared”链接为动态链接库(SharedObject,简称:S0),即共享对象。其中,采用动态链接库的方式,只需补丁代码中补丁函数对应的原有函数的函数原型不变,就可以将该动态链接库无修改直接加载到其版本中使用,从而可实现单个补丁代码在多个应用程序版本中的通用。[0052]其中,动态链接库的扩展名可以为多种形式。例如,Linux系统中,动态链接库的扩展名通常为.so。动态链接库向运行于操作系统下的应用程序提供代码、数据或函数;应用程序可根据动态链接库文件中的指令打开、启用、查询、禁用和关闭驱动程序。重定位是将调用或跳转等指令中的静态链接地址(相对地址)转换为补丁代码在目标进程中的实际加载地址。[0053]补丁代码以函数为单位进行编码,在该补丁代码中可引用待修复软件的宿主进程内的任务函数及全局变量,以及其他动态链接库内的函数。本发明实施例中,采用动态链接库的方式进行动态加载,且动态加载库支持多次加载和删除,因此,补丁代码中可包括多个补丁函数,编译生成一个动态链接库加载到目标进程;也可以仅包含一个补丁函数,编译成多个动态链接库单独加载到目标进程。可选地,对补丁代码中新增函数存在缺陷的场景,可以对采用补丁代码修复后的应用程序进一步打补丁,增加新增函数的缺陷修复,即本发明实施例支持增量补丁;也可卸载原补丁代码,由新增函数后的补丁代码对待修复软件进行缺陷修复。[0054]S102、解析包含补丁代码的补丁镜像文件,获取该补丁镜像文件中的重定位函数信息,建立补丁镜像文件和目标进程的连接关系,该目标进程为加载补丁代码后的应用程序在运行时所处的进程。[0055]其中,补丁镜像文件为基于一定格式编译补丁代码生成的目标文件,即SlOl中提及的补丁目标文件。通常情况下,补丁镜像文件可以包括补丁函数、数据段、字符段和重定位段等,其中,补丁函数即待修复软件中存在缺陷的函数对应的修正程序或代码。可选地,还可以包括补丁初始化入口函数,该补丁初始化入口函数用于完成补丁代码中各函数的初始化。[0056]另外,重定位函数信息可以包括上述补丁函数、数据段、字符段或重定位段等对应的名称和相对地址,例如,重定位段中需重定位的全局变量的名称和相对地址,及需重定位的补丁函数对应的名称和相对地址。这里的相对地址,本领域技术人员可以将其理解为,各指令位于该补丁镜像文件中的位置,以位于该补丁镜像文件中第一行指令为例,其相对地址为0,而该补丁镜像文件被加载到目标进程中的初始地址为1000,则上述第一行的指令在目标进程中的实际地址为1000+0=1000,即补丁镜像文件中各指令在目标进程中的实际地址为其在该补丁镜像文件中相对地址与被加载初始地址的加和,从而实现补丁镜像文件可适用于多个版本的应用程序。[0057]S103、根据补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行补丁函数。[0058]具体地,该步骤中,根据S102建立的补丁镜像文件和目标进程的连接关系,完成对补丁镜像文件中包含信息的重定位,对于重定位函数信息中补丁函数与待修复软件中原有函数,若二者的函数符号(例如函数名称)相同,则修改该原有函数的入口指令,待目标进程执行到该原有函数时,跳转执行与该原有函数对应的补丁函数。[0059]本发明实施例通过将补丁代码编译生成动态加载库的方式,实现同一补丁代码对多个版本应用程序的通用,降低补丁代码管理和维护的难度;另外,由于动态链接库支持动态多次加载和删除,因此,补丁镜像文件可动态加载及卸载,无需复位系统,对系统业务无影响。[0060]图2为本发明补丁加载方法实施例二的流程图。该实施例对如图1所示的实施例进行详细说明,主要针对通信设备中主机软件缺陷进行修复的补丁代码进行加载的应用场景。如图2所示,本实施例可分为编译、加载和激活三个阶段,其中,S201-S202为编译阶段;S203-S208为加载阶段;S209-S210为激活阶段,具体地,该实施例中补丁加载方法可包括:[0061]S201、以函数为单位,编辑补丁代码。[0062]S202、编译补丁代码生成可重定位的动态链接库,该补丁代码为以补丁函数为单位的指令。[0063]该步骤同上述实施例中S102,此处不再赘述。[0064]该发明实施例中,在编译阶段,离线预处理以函数为单位的补丁代码,将补丁代码动态链接为可重定位的动态链接库。其中,S201和S202在加载补丁代码之前执行即可。S201和S202均为可选步骤,对已编辑好的补丁代码,可仅执行S202,;对已编译生成动态链接库的补丁代码,这两个步骤都可忽略不执行。[0065]S203、找出目标进程中加载的镜像文件,采用可执行的链接格式解析该镜像文件,获取该镜像文件中的原有函数和原有全局变量对应的名称和绝对地址,得到目标进程的符号表。[0066]其中,符号表包含上述原有函数和原有全局变量对应的名称。可执行的链接格式(ExecutableandLinkingFormat,简称:ELF)为Linux系统文件内容格式,段或节区(SECTION)保存对象(object)文件的信息,包括指令、数据、符号表和重定位信息等等。[0067]S204、解析包含补丁代码的补丁镜像文件,获取该补丁镜像文件中的重定位函数信息,建立补丁镜像文件和目标进程的连接关系。[0068]具体地,如图3所示,该步骤可以包括:[0069]S2041、分析补丁镜像文件,记录补丁镜像文件中的补丁函数和补丁全局变量的名称和相对地址。[0070]S2042、分析补丁镜像文件中的重定位段,获取重定位函数和重定位全局变量的名称和相对地址。[0071]S2043、根据重定位函数和重定位全局变量的名称和相对地址,建立补丁镜像文件和目标进程的连接关系。[0072]这里的补丁镜像文件和目标进程的连接关系,本领域技术人员可以将其理解为,补丁镜像文件和目标进程的映射关系,即补丁镜像文件被加载到目标进程之后,将补丁镜像文件中的各指令的相对地址转换为绝对地址,对该补丁镜像文件进行配置,建立补丁镜像文件与目标进程之间的映射关系。[0073]S205、在目标进程的符号表中,查找重定位函数名称和/或重定位全局变量名称。[0074]其中,符号表在编译应用程序的过程中不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息。这些信息一般以表格形式存储于系统中。例如常数表、变量名表、数组名表、过程名表和标号表等等,统称为符号表。[0075]具体地,在目标进程的符号表中,查找重定位段中的重定位函数名称和/或重定位全局变量名称在目标进程的符号表和加载的动态链接库中是否全部存在。若某一重定位函数名称或重定位全局变量名称在目标进程中不存在,说明该补丁代码与当前待修复软件不匹配,补丁代码加载失败,整个流程结束;否则执行S206。[0076]S206、若确定重定位函数名称和重定位全局变量名称存在于目标进程中,则将其标记为目标进程内函数或目标进程内变量。[0077]S207、将目标进程内函数和/或目标进程内变量从重定位段中移除,并调用系统的动态链接库加载函数重定位动态链接库中的符号。[0078]其中,系统的动态链接库加载函数,例如,dlopen函数,用于加载动态链接库中的符号,这些符号在编译阶段是未知的,因此,对于目标进程内函数和目标进程内变量,需将其从重定位段中移除。[0079]例如,重定位段的数据结构为:[0080]typedefstruct{[0081]Elf32_Addrr_offset;[0082]Elf32_ffordr_info;[0083]Elf32_ffordr_addend;[0084]}Elf32_Rela;[0085]将Elf32_Wordr_info域置0,实现该符号在重定位段中移除的功能,在使用dlopen函数加载时,不再处理该符号的信息。[0086]本发明实施例采用dlopen函数将动态链接库加载到目标进程中,使用dlopen函数的好处在于补丁代码的加载、删除和存放空间等都是由系统从全局来进行规划和管理的,从而无须为该补丁镜像文件预先分配内存,也无须在补丁镜像文件加载时动态申请内存并进行管理。dlopen函数加载成功后,会同时把该补丁镜像文件的符号信息加入系统的符号信息表中。[0087]S208、根据补丁镜像文件的加载内存基址及目标进程内函数和目标进程内变量的相对地址,得到目标进程内函数和目标进程内变量的重定位地址并写入。[0088]该步骤用于实现目标进程内函数和目标进程内变量的重定位。经S207和S208的执行,完成整个补丁镜像文件中符号(补丁函数和/或全局变量)的重定位。[0089]在系统的动态链接库加载函数加载成功后,返回补丁镜像文件的加载内存基址,使用该基址加上重定位段中目标进程内函数和目标进程内变量的相对地址,得到目标进程内函数和目标进程内变量的绝对地址,并对该绝对地址进行重定位跳转计算并写入,把所有符号进行上述操作即完成补丁代码的重定位。[0090]S209、修改原有函数的入口指令,跳转执行补丁函数。[0091]对于补丁镜像文件中补丁函数和原符号表存在原有函数具有相同函数符号的,修改原有函数入口指令,待目标进程运行至该原有函数时,跳转执行补丁函数,从而实现对待修复软件中所存在缺陷的修复。[0092]其中,S205-S209为S103的进一步细化。[0093]在上述实施例的基础上,补丁加载方法在S103或S209之前,还可以包括:调用补丁初始化入口函数,完成补丁镜像文件的初始化。[0094]通过现有补丁加载方案加载补丁代码,补丁代码中的函数及全局变量不能在⑶B或串口内进行调用,不利于调试定位;本实施例中,通过调用补丁初始化入口函数实现补丁镜像文件的初始化,可通过制定补丁代码的模板格式,把需初始化操作的函数放入固定的补丁初始化入口函数中,在补丁代码加载时,自动执行初始化操作。[0095]图4为本发明补丁加载装置实施例一的结构示意图。本发明实施例提供一种补丁加载装置,该装置可以集成在通信设备中,其中,通信设备可以为PC、笔记本电脑或服务器等终端设备。如图4所示,该补丁加载装置40包括:编译模块41和加载模块42。[0096]其中,编译模块41用于编译补丁代码生成可重定位的动态链接库,所述补丁代码为以补丁函数为单位的指令;加载模块42用于解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系,所述目标进程为加载所述补丁代码后的应用程序在运行时所处的进程;及,根据所述补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行所述补丁函数。[0097]本实施例的装置,可以执行如图1和图2所示实施例的补丁加载方法,其实现原理和技术效果类似,此处不再赘述。[0098]在上述基础上,加载模块42还可以用于:在所述解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系之前,找出目标进程中加载的镜像文件,采用ELF解析所述镜像文件,获取所述镜像文件中的原有函数和原有全局变量对应的名称和绝对地址,得到所述目标进程的符号表,所述符号表包含所述原有函数和所述原有全局变量对应的名称。[0099]可选地,加载模块42可以具体用于:分析所述补丁镜像文件,记录所述补丁镜像文件中的补丁函数和补丁全局变量的名称和相对地址;分析所述补丁镜像文件中的重定位段,获取重定位函数和重定位全局变量的名称和相对地址;根据所述重定位函数和重定位全局变量的名称和相对地址,建立所述补丁镜像文件和目标进程的连接关系。[0100]进一步地,加载模块42还可以具体用于:在所述目标进程的符号表中,查找所述重定位函数名称和/或所述重定位全局变量名称;若确定所述重定位函数名称和所述重定位全局变量名称存在于所述目标进程中,则将其标记为目标进程内函数或目标进程内变量;将所述目标进程内函数和/或目标进程内变量从所述重定位段中移除,并调用系统的动态链接库加载函数重定位所述动态链接库中的符号;以及,根据所述补丁镜像文件的加载内存地址及所述目标进程内函数和所述目标进程内变量的相对地址,得到所述目标进程内函数和所述目标进程内变量的重定位地址并写入;修改所述原有函数的入口指令,跳转执行所述补丁函数。[0101]在上述实施例的基础上,加载模块42还可以用于:在所述根据所述补丁镜像文件和目标进程的连接关系,修改所述原有函数的入口指令,跳转执行所述补丁函数之前,调用补丁初始化入口函数,完成所述补丁镜像文件的初始化。[0102]本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:R0M、RAM、磁碟或者光盘等各种可以存储程序代码的介质。[0103]最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。【权利要求】1.一种补丁加载方法,其特征在于,包括:编译补丁代码生成可重定位的动态链接库,所述补丁代码为以补丁函数为单位的指令;解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系,所述目标进程为加载所述补丁代码后的应用程序在运行时所处的进程;根据所述补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行所述补丁函数。2.根据权利要求1所述的方法,其特征在于,所述解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系之前,所述方法还包括:找出目标进程中加载的镜像文件,采用可执行的链接格式ELF解析所述镜像文件,获取所述镜像文件中的原有函数和原有全局变量对应的名称和绝对地址,得到所述目标进程的符号表,所述符号表包含所述原有函数和所述原有全局变量对应的名称。3.根据权利要求2所述的方法,其特征在于,所述解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系,包括:分析所述补丁镜像文件,记录所述补丁镜像文件中的补丁函数和补丁全局变量的名称和相对地址;分析所述补丁镜像文件中的重定位段,获取重定位函数和重定位全局变量的名称和相对地址;根据所述重定位函数和重定位全局变量的名称和相对地址,建立所述补丁镜像文件和目标进程的连接关系。4.根据权利要求3所述的方法,其特征在于,所述根据所述补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行所述补丁函数,包括:在所述目标进程的符号表中,查找所述重定位函数名称和/或所述重定位全局变量名称;若确定所述重定位函数名称和所述重定位全局变量名称存在于所述目标进程中,则将其标记为目标进程内函数或目标进程内变量;将所述目标进程内函数和/或目标进程内变量从所述重定位段中移除,并调用系统的动态链接库加载函数重定位所述动态链接库中的符号;以及,根据所述补丁镜像文件的加载内存地址及所述目标进程内函数和所述目标进程内变量的相对地址,得到所述目标进程内函数和所述目标进程内变量的重定位地址并写入;修改所述原有函数的入口指令,跳转执行所述补丁函数。5.根据权利要求1-4任一项所述的方法,其特征在于,所述根据所述补丁镜像文件和目标进程的连接关系,修改所述原有函数的入口指令,跳转执行所述补丁函数之前,所述方法还包括:调用补丁初始化入口函数,完成所述补丁镜像文件的初始化。6.一种补丁加载装置,其特征在于,包括:编译模块,用于编译补丁代码生成可重定位的动态链接库,所述补丁代码为以补丁函数为单位的指令;加载模块,用于解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系,所述目标进程为加载所述补丁代码后的应用程序在运行时所处的进程;及,根据所述补丁镜像文件和目标进程的连接关系,修改原有函数入口指令,跳转执行所述补丁函数。7.根据权利要求6所述的装置,其特征在于,所述加载模块还用于:在所述解析包含所述补丁代码的补丁镜像文件,获取所述补丁镜像文件中的重定位函数信息,建立所述补丁镜像文件和目标进程的连接关系之前,找出目标进程中加载的镜像文件,采用可执行的链接格式ELF解析所述镜像文件,获取所述镜像文件中的原有函数和原有全局变量对应的名称和绝对地址,得到所述目标进程的符号表,所述符号表包含所述原有函数和所述原有全局变量对应的名称。8.根据权利要求7所述的装置,其特征在于,所述加载模块具体用于:分析所述补丁镜像文件,记录所述补丁镜像文件中的补丁函数和补丁全局变量的名称和相对地址;分析所述补丁镜像文件中的重定位段,获取重定位函数和重定位全局变量的名称和相对地址;根据所述重定位函数和重定位全局变量的名称和相对地址,建立所述补丁镜像文件和目标进程的连接关系。9.根据权利要求8所述的装置,其特征在于,所述加载模块还具体用于:在所述目标进程的符号表中,查找所述重定位函数名称和/或所述重定位全局变量名称;若确定所述重定位函数名称和所述重定位全局变量名称存在于所述目标进程中,则将其标记为目标进程内函数或目标进程内变量;将所述目标进程内函数和/或目标进程内变量从所述重定位段中移除,并调用系统的动态链接库加载函数重定位所述动态链接库中的符号;以及,根据所述补丁镜像文件的加载内存地址及所述目标进程内函数和所述目标进程内变量的相对地址,得到所述目标进程内函数和所述目标进程内变量的重定位地址并写入;修改所述原有函数的入口指令,跳转执行所述补丁函数。10.根据权利要求6-9任一项所述的装置,其特征在于,所述加载模块还用于:在所述根据所述补丁镜像文件和目标进程的连接关系,修改所述原有函数的入口指令,跳转执行所述补丁函数之前,调用补丁初始化入口函数,完成所述补丁镜像文件的初始化。【文档编号】G06F9/445GK103744709SQ201410033575【公开日】2014年4月23日申请日期:2014年1月23日优先权日:2014年1月23日【发明者】刘中柱申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1