一种在线补丁激活的方法及装置转让专利

申请号 : CN201610865260.4

文献号 : CN106484369B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈运生强鸿斐万汉阳

申请人 : 华为技术有限公司

摘要 :

本发明涉及计算机技术领域,具体涉及一种在线补丁激活的方法和装置。其中方法包括:定位补丁函数地址和待打补丁函数的第一条入口指令;将包含补丁函数地址的信息写入跳转表,并获取该信息在该跳转表中的索引;将该跳转表地址写入寄存器;获取该待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引;将该待打补丁函数的第一条入口指令替换为该短指令,使得该待打补丁函数被调用时,该短指令被执行,该补丁函数被激活。使用本发明提供的方法和装置,可以在只替换待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性。

权利要求 :

1.一种在线补丁激活的方法,其特征在于,包括:定位补丁函数地址和待打补丁函数的第一条入口指令;

将包含补丁函数地址的信息写入跳转表,并获取所述信息在所述跳转表中的索引;

将所述跳转表地址写入寄存器;

获取所述待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于所述待打补丁函数的第一条入口指令长度的短指令,所述短指令包含所述索引;

将所述待打补丁函数的第一条入口指令替换为所述短指令,使得所述待打补丁函数被调用时,所述短指令被执行以解析出所述索引,所述寄存器被访问以获取所述跳转表地址,根据所述跳转表地址和所述索引解析出所述补丁函数地址,并根据所述补丁函数地址跳转到所述补丁函数。

2.如权利要求1所述的在线补丁激活的方法,其特征在于,所述将包含补丁函数地址的信息写入跳转表包括:将所述补丁函数地址写入跳转表;

获取所述信息在所述跳转表中的索引包括:

获取所述补丁函数地址在所述跳转表中的索引。

3.如权利要求1所述的在线补丁激活的方法,其特征在于,所述将包含补丁函数地址的信息写入跳转表包括:将跳转到所述补丁函数的地址的跳转指令写入跳转表;

获取所述信息在所述跳转表中的索引包括:

获取所述跳转指令在所述跳转表中的索引。

4.如权利要求1至3任一所述的在线补丁激活的方法,其特征在于,所述跳转表用于存储至少一条包含补丁函数地址的信息。

5.一种在线补丁激活的装置,其特征在于,包括:定位单元,用于定位补丁函数地址和待打补丁函数的第一条入口指令;

写入单元,将包含所述补丁函数地址的信息写入跳转表,将所述跳转表地址写入寄存器,所述补丁函数地址是由所述定位单元定位的;

获取单元,用于获取所述写入单元写入的信息在所述跳转表中的索引;获取所述定位单元定位的待打补丁函数的第一条入口指令的长度;

构造单元,用于构造一条长度小于或等于所述待打补丁函数的第一条入口指令长度的短指令,所述短指令包含所述索引,所述待打补丁函数的第一条入口指令是由所述定位单元定位的;

替换单元,用于将所述待打补丁函数的第一条入口指令替换为所述构造单元构造的短指令;

执行单元,用于在所述待打补丁函数被调用时,执行所述替换单元替换的短指令以解析出所述索引,访问所述寄存器以获取所述跳转表地址,根据所述跳转表地址和所述索引解析出所述补丁函数地址,并根据所述补丁函数地址跳转到所述补丁函数。

6.根据权利要求5所述的在线补丁激活的装置,其特征在于,所述写入单元具体用于:将定位单位定位的所述补丁函数的地址写入跳转表;

所述获取单元具体用于:

获取所述补丁函数定制在所述跳转表中的索引。

7.根据权利要求5所述的在线补丁激活的装置,其特征在于,所述写入单元具体用于:将可以跳转到补丁函数的地址的跳转指令写入跳转表;

所述获取单元具体用于:

获取所述跳转指令定制在所述跳转表中的索引。

说明书 :

一种在线补丁激活的方法及装置

技术领域

[0001] 本发明涉及计算机技术领域,具体涉及一种在线补丁激活的方法和装置。

背景技术

[0002] 在操作系统中,跳转指令可以改变程序执行流程,例如在线补丁,在线补丁的目的是在不丢失程序旧版本的情况下使用补丁函数代替程序旧版本中待打补丁的函数,用于修复程序旧版本的缺陷或增强旧版本的功能。其基本原理是将程序旧版本中待打补丁函数的入口位置处的指令替换为跳转指令,当操作系统执行到程序旧版本待打补丁函数入口时,跳转指令将使得操作系统跳转到补丁函数入口处,执行补丁函数。
[0003] 目前,实现在线补丁激活的方法有很多,其中,一种具体的实现方法为长跳转方法,长跳转方法可以通过寄存器实现,首先将目标地址写入寄存器,然后跳转到寄存器中的目标地址执行新的指令,但是该长跳转方法需要多条指令才能完成跳转。
[0004] 从上可知,使用长跳转方法实现在线补丁激活,需要替换程序旧版本待打补丁函数入口处的多条指令,如果在指令替换时某些线程正在或将要执行这些被替换指令的部分或全部,则可能造成线程执行未知指令,引起操作系统异常。

发明内容

[0005] 本发明实施例提供了一种在线补丁激活的方法和装置,能够在激活在线补丁的过程中提高操作系统的安全性。
[0006] 本发明实施例的第一方面公开了一种在线补丁激活的方法,所述方法包括:
[0007] 定位补丁函数地址和待打补丁函数的第一条入口指令;将包含补丁函数地址的信息写入跳转表,并获取所述信息在所述跳转表中的索引;将所述跳转表地址写入寄存器;获取所述待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于所述待打补丁函数的第一条入口指令长度的短指令,所述短指令包含所述寄存器的标识和所述索引;将所述待打补丁函数的第一条入口指令替换为所述短指令,使得所述待打补丁函数被调用时,所述短指令被执行,所述补丁函数被激活。
[0008] 结合第一方面,在第一方面的第一种实现方式中,所述将包含补丁函数地址的信息写入跳转表包括:
[0009] 将所述补丁函数地址写入跳转表;
[0010] 获取所述信息在所述跳转表中的索引包括:
[0011] 获取所述补丁函数地址在所述跳转表中的索引。
[0012] 结合第一方面,在第一方面的第二种实现方式中,所述将包含补丁函数地址的信息写入跳转表包括:
[0013] 将跳转到所述补丁函数的地址的跳转指令写入跳转表;
[0014] 获取所述信息在所述跳转表中的索引包括:
[0015] 获取所述跳转指令在所述跳转表中的索引。
[0016] 结合第一方面或第一方面的第一种实现方式或第一方面的第二种实现方式,在第一方面的第三种实现方式中,所述跳转表用于存储至少一条包含补丁函数地址的信息。
[0017] 本发明实施例的第二方面公开了一种在线补丁激活的装置,所述装置包括:
[0018] 定位单元,用于定位补丁函数地址和待打补丁函数的第一条入口指令;写入单元,将包含所述补丁函数地址的信息写入跳转表,将所述跳转表地址写入寄存器,所述补丁函数地址是由所述定位单元定位的;获取单元,用于获取所述写入单元写入的信息在所述跳转表中的索引;获取所述定位单元定位的待打补丁函数的第一条入口指令的长度;构造单元,用于构造一条长度小于或等于所述待打补丁函数的第一条入口指令长度的短指令,所述短指令包含所述寄存器的标识和所述索引,所述待打补丁函数的第一条入口指令是由所述定位单元定位的;替换单元,用于将所述待打补丁函数的第一条入口指令替换为所述构造单元构造的短指令;执行单元,用于在所述待打补丁函数被调用时,执行替换单元替换的短指令,激活所述补丁函数。
[0019] 结合第二方面,在第二方面的第一种实现方式中,所述写入单元具体用于:
[0020] 将定位单位定位的所述补丁函数的地址写入跳转表;
[0021] 所述获取单元具体用于:
[0022] 获取所述补丁函数定制在所述跳转表中的索引。
[0023] 结合第二方面,在第二方面的第二种实现方式中,所述写入单元具体用于:
[0024] 将可以跳转到补丁函数的地址的跳转指令写入跳转表;
[0025] 所述获取单元具体用于:
[0026] 获取所述跳转指令定制在所述跳转表中的索引。
[0027] 从上可知,使用本发明实施例提供的在线补丁激活的方法和装置,可以在只替换程序旧版本待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。

附图说明

[0028] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0029] 图1为本发明一个实施例提供的在线补丁激活的方法流程图;
[0030] 图2为本发明另一个实施例提供的在线补丁激活的方法流程图;
[0031] 图3为本发明另一个实施例提供的在线补丁激活的方法流程图;
[0032] 图4为本发明一个实施例提供的在线补丁激活的装置结构图;
[0033] 图5为本发明另一个实施例提供的在线补丁激活的装置结构图;
[0034] 图6为本发明另一个实施例提供的在线补丁激活的装置结构图;
[0035] 图7为本发明另一个实施例提供的在线补丁激活的装置结构图;
[0036] 图8为本发明另一个实施例提供的在线补丁激活的装置结构图;
[0037] 图9为本发明另一个实施例提供的在线补丁激活的装置结构图。

具体实施方式

[0038] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0039] 图1描述了本发明实施例的一种在线补丁激活的方法,该方法描述的是短指令替换程序中待打补丁函数入口处第一条指令的过程,该方法具体包括:
[0040] 101、定位补丁函数地址和待打补丁函数的第一条入口指令。
[0041] 在线补丁是指程序运行中不需要重启程序而生效的补丁,广泛应用于各类软件。在待打补丁程序运行时,在线补丁激活线程定位补丁函数地址以及该程序中待打补丁函数的第一条入口指令。其中,在线补丁激活线程可以是程序内部的线程,也可以是一个用于激活补丁的应用程序的线程。
[0042] 102、将包含补丁函数地址的信息写入跳转表,并获取该信息在该跳转表中的索引。
[0043] 跳转表是在线补丁激活线程在内存中开辟的一块空间,可以记录包含补丁函数地址的信息。其中,包含补丁函数地址的信息可以是补丁函数地址,也可以跳转到补丁函数地址的跳转指令。使用跳转表可以实现多个补丁函数同时激活。
[0044] 获取该信息在该跳转表中的索引。将包含补丁函数地址的信息写入跳转表后,获取该信息在该跳转表中的索引或者序号。可以通过该序号或者索引定位该信息在该跳转表中的位置。
[0045] 103、将该跳转表地址写入寄存器中。
[0046] 将跳转表地址写入寄存器中,无论跳转表放置在内存中什么位置,都可以通过访问寄存器,读取跳转表的地址,再通过跳转表获得各个包含补丁函数地址的信息。其中,可以将跳转表的首地址写入寄存器中,寄存器可以是基址寄存器。
[0047] 104、获取该待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引。
[0048] 在不同操作系统中,实现相同功能的指令的长度也有可能是不同的。获取该待打补丁函数的第一条入口指令的长度,构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引。其中,在该短指令被执行时,可以获取寄存器中的跳转表首地址,通过跳转表的首地址和索引便可以定位补丁函数入口地址。
[0049] 在跳转表只有一张的时候,可以通过一个基址寄存器记录该跳转表的首地址,在短指令中可以写包含补丁函数地址的信息在跳转表中的索引。在该短指令被执行时,就会去默认的基址寄存器获取跳转表的首地址,结合该信息在该跳转表中的索引就可以定位补丁函数的入口。其中,跳转表可存储一定量的包含补丁函数地址的信息,例如跳转表可以存储10条该信息,从而使得索引的长度较短。
[0050] 在跳转表有多张时,需要通过多个基址寄存器来记录多张跳转表的首地址,在短指令中就需要写入跳转表所对应的基址寄存器和包含补丁函数地址的信息在该跳转表中的索引。在该短指令被执行时,通过短指令中的记录的基址寄存器获取跳转表的首地址,结合包含补丁函数地址的信息在跳转表中的索引定位补丁函数入口。
[0051] 该短指令通过基址寄存器实现了长跳转,由于该短指令小于或等于待打补丁函数入口处第一条指令长度,可保证顺利实现在线补丁的激活。
[0052] 105、将该待打补丁函数的第一条入口指令替换为该短指令,使得该待打补丁函数被调用时,该短指令被执行,该补丁函数被激活。
[0053] 由于程序中待打补丁函数的入口处有很多条指令,如果要替换多条指令,那么在替换过程中,可能出现某些需要替换的指令在被某些线程执行,则可能造成线程执行未知指令,引起操作系统异常。
[0054] 将程序中待打补丁函数入口处的第一条指令替换为该短指令,该短指令的长度不超过该第一条入口指令的长度,那么在替换过程中不会影响到其他指令,可以保证在线补丁顺利激活,也可以保证操作系统安全运行。其中,该短指令中的寄存器标识和索引都较短,可以保证该短指令的长度不超过该第一条入口指令的长度。
[0055] 在该待打补丁函数被调用时,作为该待打补丁函数入口处第一条指令的短指令被执行,该短指令会被解析,根据解析的内容去访问默认的或者短指令记录的基址寄存器,获取该基址寄存器中存储的跳转表首地址,根据该跳转表首地址和该短指令中记录的包含补丁函数地址的信息在跳转表中的索引,获得补丁函数入口地址,跳转到补丁函数入口,并执行函数补丁,使得补丁函数被激活。
[0056] 从上可知,使用本发明实施例提供的在线补丁激活的方法,可以在只替换程序中待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0057] 图2描述了本发明实施例的一种在线补丁激活的方法,该方法描述的是短指令替换程序中待打补丁函数入口处第一条指令的过程,该方法具体包括:
[0058] 201、定位补丁函数地址和待打补丁函数的第一条入口指令。
[0059] 在线补丁是指程序运行中不需要重启程序而生效的补丁,广泛应用于各类软件。在待打补丁程序运行时,在线补丁激活线程定位补丁函数的地址以及该程序中待打补丁函数的第一条入口指令。其中,在线补丁激活线程可以是程序内部的线程,也可以是一个用于激活补丁的应用程序的线程。
[0060] 202、将补丁函数地址写入跳转表,并获取该补丁函数地址在该跳转表中的索引。
[0061] 跳转表是在线补丁激活线程在内存中开辟的一块空间,可以记录补丁函数地址。使用跳转表可以实现多个补丁函数同时激活。
[0062] 获取该补丁函数地址在该跳转表中的索引。将该补丁函数地址写入跳转表后,获取该补丁函数地址在该跳转表中的索引或者序号。可以通过该序号或索引定位该补丁函数地址在该跳转表中的位置。
[0063] 203、将该跳转表地址写入寄存器中。
[0064] 将跳转表地址写入寄存器中,无论跳转表放置在内存中什么位置,都可以通过访问寄存器,读取跳转表的地址,再通过跳转表获得各个补丁函数地址。其中,可以将跳转表的首地址写入寄存器中,寄存器可以是基址寄存器。
[0065] 204、获取该待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引。
[0066] 在不同操作系统中,实现相同功能的指令的长度也有可能是不同的。获取该待打补丁函数的第一条入口指令的长度,构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引。其中,在该短指令被执行时,可以获取寄存器中的跳转表首地址,通过跳转表的首地址和索引便可以定位补丁函数入口地址。
[0067] 在跳转表只有一张的时候,可以通过一个基址寄存器记录该跳转表的首地址,在短指令中可以写补丁函数地址在跳转表中的索引。在该短指令被执行时,就会去默认的基址寄存器获取跳转表的首地址,结合该索引就可以定位补丁函数的入口。其中,跳转表可存储一定量的补丁函数地址,例如一张跳转表可以存储5条或10条补丁函数地址,从而使得索引的长度较短。
[0068] 在跳转表有多张时,需要通过多个基址寄存器来记录多张跳转表的首地址,在短指令中就需要写入跳转表所对应的基址寄存器和补丁函数地址该跳转表中的索引。在该短指令被执行时,通过短指令中的记录的基址寄存器获取跳转表的首地址,结合补丁函数地址在跳转表中的索引定位补丁函数入口。
[0069] 该短指令通过基址寄存器实现了长跳转,由于该短指令小于或等于待打补丁函数入口处第一条指令长度,可保证顺利实现在线补丁的激活。
[0070] 205、将该待打补丁函数的第一条入口指令替换为该短指令,使得该待打补丁函数被调用时,该短指令被执行,该补丁函数被激活。
[0071] 由于程序中待打补丁函数的入口处有很多条指令,如果要替换多条指令,那么在替换过程中,可能出现某些需要替换的指令在被某些线程执行,则可能造成线程执行未知指令,引起操作系统异常。
[0072] 将程序中待打补丁函数入口处的第一条指令替换为该短指令,该短指令的长度不超过该第一条入口指令的长度,那么在替换过程中不会影响到其他指令,可以保证在线补丁顺利激活,也可以保证操作系统安全运行。其中,该短指令中的寄存器标识和索引都较短,可以保证该短指令的长度不超过该第一条入口指令的长度。
[0073] 在该待打补丁函数被调用时,作为该待打补丁函数入口处第一条指令的短指令被执行,该短指令会被解析,根据解析的内容去访问默认的或者短指令记录的基址寄存器,获取该基址寄存器中存储的跳转表首地址,根据该跳转表首地址和该短指令中记录的补丁函数地址在跳转表中的索引,获得补丁函数入口地址,跳转到补丁函数入口,并执行函数补丁,使得补丁函数被激活。
[0074] 从上可知,使用本发明实施例提供的在线补丁激活的方法,可以在只替换程序中待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0075] 图3描述了本发明实施例的另一种在线补丁激活的方法,该方法具体包括:
[0076] 301、定位补丁函数地址和待打补丁函数的第一条入口指令。
[0077] 在线补丁是指程序运行中不需要重启程序而生效的补丁,广泛应用于各类软件。在待打补丁程序的运行时,在线补丁激活线程定位补丁函数的地址以及该程序中待打补丁函数的第一条入口指令。其中,在线补丁激活线程可以是程序内部的线程,也可以是一个用于激活补丁的应用程序的线程。
[0078] 302、将跳转到补丁函数地址的跳转指令写入跳转表,并获取该跳转指令在该跳转表中的索引。
[0079] 跳转表是在线补丁激活线程在内存中开辟的一块空间,可以存储跳转到补丁函数地址的跳转指令。使用跳转表可以实现多个补丁函数同时激活。
[0080] 获取该跳转指令在该跳转表中的索引。将该跳转指令写入跳转表后,获取该跳转指令在该跳转表中的索引或者序号。可以通过该序号或索引定位该跳转指令在该跳转表中的位置。
[0081] 303、将该跳转表地址写入寄存器中。
[0082] 将跳转表地址写入寄存器中,无论跳转表放置在内存中什么位置,都可以通过访问寄存器,读取跳转表的地址,再通过跳转表获得各跳转指令。其中,可以将跳转表的首地址写入寄存器中,寄存器可以是基址寄存器。
[0083] 304、获取该待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引。
[0084] 在不同操作系统中,实现相同功能的指令的长度也有可能是不同的。获取该待打补丁函数的第一条入口指令的长度,构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引。其中,在该短指令被执行时,可以获取寄存器中的跳转表首地址,通过跳转表的首地址和索引便可以定位补丁函数入口地址。
[0085] 在跳转表只有一张的时候,可以通过一个基址寄存器记录该跳转表的首地址,在短指令中可以写跳转指令在跳转表中的索引。在该短指令被执行时,就会去默认的基址寄存器获取跳转表的首地址,结合该跳转指令在该跳转表中的索引就可以定位补丁函数的入口。其中,跳转表可存储一定量的跳转指令,从而使得索引的长度较短,例如每个跳转表最多记录10条指令。在跳转表有多张时,需要通过多个基址寄存器来记录多张跳转表的首地址,在短指令中就需要写入跳转表所对应的基址寄存器和跳转指令在该跳转表中的索引。在该短指令被执行时,通过短指令中的记录的基址寄存器获取跳转表的首地址,结合包含跳转指令在跳转表中的索引定位补丁函数入口。
[0086] 该短指令通过基址寄存器实现了长跳转,由于该短指令小于待打补丁函数入口处第一条指令长度,可保证顺利实现在线补丁的激活。
[0087] 305、将该待打补丁函数的第一条入口指令替换为该短指令,使得该待打补丁函数被调用时,该短指令被执行,该补丁函数被激活。
[0088] 由于程序中待打补丁函数的入口处有很多条指令,如果要替换多条指令,那么在替换过程中,可能出现某些需要替换的指令在被某些线程执行,则可能造成线程执行未知指令,引起操作系统异常。
[0089] 将程序中待打补丁函数入口处的第一条指令替换为该短指令,该短指令的长度不超过该第一条入口指令的长度,那么在替换过程中不会影响到其他指令,可以保证在线补丁顺利激活,也可以保证操作系统安全运行。其中,该短指令中的寄存器标识和索引都较短,可以保证该短指令的长度不超过该第一条入口指令的长度。
[0090] 在该待打补丁函数被调用时,作为该待打补丁函数入口处第一条指令的短指令被执行,该短指令会被解析,根据解析的内容去访问默认的或者短指令记录的基址寄存器,获取该基址寄存器中存储的跳转表首地址,根据该跳转表首地址和该短指令中记录的跳转指令在跳转表中的索引,获得跳转指令,再根据跳转指令跳转到补丁函数入口,并执行函数补丁,使得补丁函数被激活。
[0091] 从上可知,使用本发明实施例提供的在线补丁激活的方法,可以在只替换程序中待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0092] 图4描述了本发明实施例的一种在线补丁激活的装置,该装置具体包括:
[0093] 定位单元401、写入单元402、获取单元403、构造单元404、替换单元405、执行单元406。
[0094] 定位单元401,用于定位补丁函数地址和待打补丁函数的第一条入口指令。
[0095] 在待打补丁程序的运行时,定位单元401定位补丁函数的地址以及待打补丁函数的入口地址,以便可以通过后续的操作使得待打补丁函数的第一条入口指令与补丁函数地址发生关联。
[0096] 写入单元402,用于在定位单元401定位补丁函数的地址时,将包含该补丁函数地址的信息写入跳转表,将该跳转表地址写入寄存器,该补丁函数地址是由定位单元401定位的。
[0097] 在定位单元401定位补丁函数的地址时,写入单元402将包含补丁函数地址的信息写入跳转表,再将该跳转表的地址写入寄存器。其中包含补丁函数地址的信息可以是补丁函数地址,也可以是跳转到补丁函数地址的跳转指令。无论跳转表放置在内存中什么位置,都可以通过访问寄存器,读取跳转表的地址,再通过跳转表获得各个补丁函数的入口地址。其中,可以将跳转表的首地址写入寄存器中,寄存器可以是基址寄存器。其中,该跳转表可以用来存储至少一个补丁函数的地址,可以实现多个在线补丁同时激活。
[0098] 获取单元403,用于获取写入单元402写入的包含补丁函数地址的信息在该跳转表中的索引;获取定位单元401定位的待打补丁函数的第一条入口指令的长度。
[0099] 获取单元403获取写入单元402写入的包含补丁函数地址的信息在该跳转表中的索引。将该信息写入跳转表后,获取该信息在该跳转表中的索引或者序号。可以通过该序号定位该信息在该跳转表中的位置。
[0100] 获取单元403获取定位单元401定位的待打补丁函数的第一条入口指令的长度。在不同操作系统中,实现相同功能的指令的长度也有可能是不同的,因此需要获取该待打补丁函数的第一条入口指令的长度。
[0101] 构造单元404,用于构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引,该待打补丁函数的第一条入口指令是由该定位单元定位的。
[0102] 构造单元404构造一条可以实现长跳转的短指令,该短指令包含该寄存器的标识和该索引,可通过该寄存器的标识获取寄存器中的跳转表首地址,通过跳转表的首地址和该索引便可以定位补丁函数入口地址。其中,该短指令的长度小于或者等于该待打补丁函数的第一条入口指令长度。
[0103] 在跳转表只有一张的时候,可以通过一个基址寄存器记录该跳转表的首地址,在短指令中可以写包含补丁函数地址的信息在跳转表中的索引。在该短指令被执行时,就会去默认的基址寄存器获取跳转表的首地址,结合该信息在该跳转表中的索引就可以定位补丁函数的入口。其中,跳转表可存储一定量的包含补丁函数地址的信息,从而使得索引的长度较短。在跳转表有多张时,需要通过多个基址寄存器来记录多张跳转表的首地址,在短指令中就需要写入跳转表所对应的基址寄存器和包含补丁函数地址的信息在该跳转表中的索引。在该短指令被执行时,通过短指令中的记录的基址寄存器获取跳转表的首地址,结合包含补丁函数地址的信息在跳转表中的索引定位补丁函数入口。
[0104] 该短指令通过基址寄存器实现了长跳转,由于该短指令小于待打补丁函数入口处第一条指令长度,可保证顺利实现在线补丁的激活。
[0105] 替换单元405,用于将该待打补丁函数入口位置处的第一条指令替换为构造单元404构造的短指令。
[0106] 由于待打补丁函数入口处有很多条指令,如果需要替换多条指令,那么在替换过程中,可能出现某些需要替换的指令在被某些线程执行,则可能造成线程执行未知指令,引起操作系统异常。
[0107] 替换单元405将待打补丁函数入口处的第一条指令替换为构造单元404构造的短指令,该短指令的长度不超过该第一条指令的长度,那么在替换过程中不会影响到其他指令,可以保证在线补丁顺利激活,也可以保证操作系统安全运行。
[0108] 执行单元406,用于在该待打补丁函数被调用时,执行替换单元405替换的短指令,激活补丁函数。
[0109] 在该待打补丁函数被调用时,作为该待打补丁函数入口处第一条指令的短指令被执行,该短指令会被解析,根据解析的内容去访问默认的或者短指令记录的基址寄存器,获取该基址寄存器中存储的跳转表首地址,根据该跳转表首地址和该短指令中记录的包含补丁函数地址的信息在跳转表中的索引,获得补丁函数入口地址,跳转到补丁函数入口,并执行函数补丁,使得补丁函数被激活。
[0110] 从上可知,使用本发明实施例提供的在线补丁激活的装置,可以在只替换程序旧版本待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0111] 图5描述了本发明实施例的一种在线补丁激活的装置,该装置具体包括:
[0112] 定位单元501,第一写入单元502、获取单元503、构造单元504、替换单元505、执行单元506。
[0113] 定位单元501,用于定位补丁函数地址和待打补丁函数的第一条入口指令。
[0114] 在待打补丁程序的运行时,定位单元501定位补丁函数的地址以及待打补丁函数的入口地址,以便可以通过后续的操作使得待打补丁函数的第一条入口指令与补丁函数地址发生关联。
[0115] 第一写入单元502,用于在定位单元501定位补丁函数的地址时,将补丁函数地址写入跳转表,将该跳转表地址写入寄存器。
[0116] 在定位单元501定位补丁函数的地址时,第一写入单元502将该补丁函数地址写入跳转表,再将该跳转表的地址写入寄存器。其中,无论跳转表放置在内存中什么位置,都可以通过访问寄存器,读取跳转表的地址,再通过跳转表获得各个补丁函数的入口地址。其中,可以将跳转表的首地址写入寄存器中,寄存器可以是基址寄存器。其中,该跳转表可以用来存储至少一个补丁函数的地址,可以实现多个在线补丁同时激活。
[0117] 获取单元503,用于获取第一写入单元502写入的该补丁函数地址在该跳转表中的索引;获取定位单元501定位的待打补丁函数的第一条入口指令的长度。
[0118] 各个程序的补丁函数地址在跳转表的索引可以确定各个补丁函数地址在该跳转表的位置,通过该跳转表的首地址和各个补丁函数地址的索引,可以确定各个补丁函数在内存中的具体位置。
[0119] 获取第一写入单元502写入的补丁函数地址在该跳转表中的索引。将该补丁函数地址写入跳转表后,获取该补丁函数地址在该跳转表中的索引或者序号。可以通过该序号定位该补丁函数地址在该跳转表中的位置。
[0120] 获取定位单元501定位的待打补丁函数的第一条入口指令的长度。在不同操作系统中,实现相同功能的指令的长度也有可能是不同的,因此需要获取该待打补丁函数的第一条入口指令的长度。
[0121] 构造单元504,用于构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引,该待打补丁函数的第一条入口指令是由该定位单元定位的。
[0122] 构造单元504构造一条可以实现长跳转的短指令,该短指令包含该寄存器的标识和该索引,可通过该寄存器的标识获取寄存器中的跳转表首地址,通过跳转表的首地址和该索引便可以定位补丁函数入口地址。其中,该短指令的长度小于或者等于该待打补丁函数的第一条入口指令长度。
[0123] 在跳转表只有一张的时候,可以通过一个基址寄存器记录该跳转表的首地址,在短指令中可以写补丁函数地址在跳转表中的索引。在该短指令被执行时,就会去默认的基址寄存器获取跳转表的首地址,结合补丁函数地址在该跳转表中的索引就可以定位补丁函数的入口。其中,跳转表可存储一定量的补丁函数地址,从而使得索引的长度较短。在跳转表有多张时,需要通过多个基址寄存器来记录多张跳转表的首地址,在短指令中就需要写入跳转表所对应的基址寄存器和补丁函数地址在该跳转表中的索引。在该短指令被执行时,通过短指令中的记录的基址寄存器获取跳转表的首地址,结合补丁函数地址在跳转表中的索引定位补丁函数入口。
[0124] 该短指令通过基址寄存器实现了长跳转,由于该短指令小于或等于待打补丁函数入口处第一条指令长度,可保证顺利实现在线补丁的激活。
[0125] 替换单元505,用于将该待打补丁函数入口位置处的第一条指令替换为构造单元504构造的短指令。
[0126] 由于待打补丁函数入口处有很多条指令,如果需要替换多条指令,那么在替换过程中,可能出现某些需要替换的指令在被某些线程执行,则可能造成线程执行未知指令,引起操作系统异常。
[0127] 替换单元505,将待打补丁函数入口处的第一条指令替换为构造单元504构造的短指令,该短指令的长度不超过该第一条指令的长度,那么在替换过程中不会影响到其他指令,可以保证在线补丁顺利激活,也可以保证操作系统安全运行。
[0128] 执行单元506,用于在该待打补丁函数被调用时,执行替换单元505替换的短指令,激活补丁函数。
[0129] 在该待打补丁函数被调用时,作为该待打补丁函数入口处第一条指令的短指令被执行,该短指令会被解析,根据解析的内容去访问默认的或者短指令记录的基址寄存器,获取该基址寄存器中存储的跳转表首地址,根据该跳转表首地址和该短指令中记录的补丁函数地址在跳转表中的索引,获得补丁函数入口地址,跳转到补丁函数入口,并执行函数补丁,使得补丁函数被激活。
[0130] 从上可知,使用本发明实施例提供的在线补丁激活的装置,可以在只替换程序待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0131] 图6描述了本发明实施例的一种在线补丁激活的装置,该装置具体包括:
[0132] 定位单元601、第二写入单元602、获取单元603、构造单元604、替换单元605、跳转单元606。
[0133] 定位单元601,用于定位补丁函数地址和待打补丁函数的第一条入口指令。
[0134] 在待打补丁程序的运行时,定位单元601定位补丁函数的地址以及待打补丁函数的入口地址,以便可以通过后续的操作使得待打补丁函数的第一条入口指令与补丁函数地址发生关联。
[0135] 第二写入单元602,用于在定位单元601定位补丁函数的地址时,将跳转到补丁函数地址的跳转指令写入跳转表,将该跳转表地址写入寄存器。
[0136] 在定位单元601定位补丁函数的地址时,第一写入单元602将跳转到补丁函数地址的跳转指令写入跳转表,再将该跳转表的地址写入寄存器。其中,无论跳转表放置在内存中什么位置,都可以通过访问寄存器,读取跳转表的地址,再通过跳转表获得各个跳转指令。其中,可以将跳转表的首地址写入寄存器中,寄存器可以是基址寄存器。其中,该跳转表可以用来存储至少一个跳转指令,可以实现多个在线补丁同时激活。
[0137] 获取单元603,用于获取第二写入单元602写入的跳转到该补丁函数地址的跳转指令在该跳转表中的索引;获取定位单元601定位的待打补丁函数的第一条入口指令的长度。
[0138] 获取第二写入单元602写入的跳转指令在该跳转表中的索引。将该跳转指令写入跳转表后,获取该跳转指令在该跳转表中的索引或者序号。可以通过该序号或该索引定位该跳转指令在该跳转表中的位置。
[0139] 获取定位单元601定位的待打补丁函数的第一条入口指令的长度。在不同操作系统中,实现相同功能的指令的长度也有可能是不同的,因此需要获取该待打补丁函数的第一条入口指令的长度。
[0140] 构造单元604,用于构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引,该待打补丁函数的第一条入口指令是由该定位单元定位的。
[0141] 构造单元604构造一条可以实现长跳转的短指令,该短指令包含该寄存器的标识和该索引,可通过该寄存器的标识获取寄存器中的跳转表首地址,通过跳转表的首地址和该索引便可以定位跳转指令,再通过跳转指令定位补丁函数的地址。其中,该短指令的长度小于或者等于该待打补丁函数的第一条入口指令长度。
[0142] 在跳转表只有一张的时候,可以通过一个基址寄存器记录该跳转表的首地址,在短指令中可以写跳转到补丁函数地址的跳转指令在跳转表中的索引。在该短指令被执行时,就会去默认的基址寄存器获取跳转表的首地址,结合跳转指令在该跳转表中的索引就可以定位补丁函数的入口。其中,跳转表可存储一定量的跳转指令,从而使得索引的长度较短。在跳转表有多张时,需要通过多个基址寄存器来记录多张跳转表的首地址,在短指令中就需要写入跳转表所对应的基址寄存器和跳转指令在该跳转表中的索引。在该短指令被执行时,通过短指令中的记录的基址寄存器获取跳转表的首地址,结合跳转指令在跳转表中的索引定位补丁函数入口。
[0143] 该短指令通过基址寄存器实现了长跳转,由于该短指令小于或等于待打补丁函数入口处第一条指令长度,可保证顺利实现在线补丁的激活。
[0144] 替换单元605,用于将该待打补丁函数入口位置处的第一条指令替换为构造单元604构造的短指令。
[0145] 由于待打补丁函数入口处有很多条指令,如果需要替换多条指令,那么在替换过程中,可能出现某些需要替换的指令在被某些线程执行,则可能造成线程执行未知指令,引起操作系统异常。
[0146] 替换单元605将待打补丁函数入口处的第一条指令替换为构造单元604构造的短指令,该短指令的长度不超过该第一条指令的长度,那么在替换过程中不会影响到其他指令,可以保证在线补丁顺利激活,也可以保证操作系统安全运行。
[0147] 执行单元606,用于在该待打补丁函数被调用时,执行替换单元605替换的短指令,激活补丁函数。
[0148] 在该待打补丁函数被调用时,作为该待打补丁函数入口处第一条指令的短指令被执行,该短指令会被解析,根据解析的内容去访问默认的或者短指令记录的基址寄存器,获取该基址寄存器中存储的跳转表首地址,根据该跳转表首地址和该短指令中记录的跳转指令在跳转表中的索引,获得补丁函数入口地址,跳转到补丁函数入口,并执行函数补丁,使得补丁函数被激活。
[0149] 从上可知,使用本发明实施例提供的在线补丁激活的装置,可以在只替换程序待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0150] 图7描述了本发明另一个实施例提供的运行驱动设备的结构,包括至少一个处理器701(例如CPU),存储器702,内存703和至少一个通信总线704,用于实现这些装置之间的连接通信。处理器701用于执行存储器702中存储的可执行模块,例如计算机程序。存储器702可能包含高速随机存取存储器(RAM:Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。通过至少一个处理器访问内存中的地址。
[0151] 在一些实施方式中,存储器702存储了程序7021,程序7021可以被处理器701执行,这个程序包括:定位补丁函数地址和待打补丁函数的第一条入口指令;将包含补丁函数地址的信息写入跳转表,并获取该信息在该跳转表中的索引;将该跳转表地址写入寄存器;获取该待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引;将该待打补丁函数的第一条入口指令替换为该短指令,使得该待打补丁函数被调用时,该短指令被执行,该补丁函数被激活。具体的实施步骤与图1所示的实施例相同,此处不再赘述。
[0152] 从本发明实施例提供的以上技术方案可以看出,使用本发明实施例提供的在线补丁激活的装置,可以在只替换程序待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0153] 图8描述了本发明另一个实施例提供的运行驱动设备的结构,包括至少一个处理器801(例如CPU),存储器802,内存803和至少一个通信总线804,用于实现这些装置之间的连接通信。处理器801用于执行存储器802中存储的可执行模块,例如计算机程序。存储器802可能包含高速随机存取存储器(RAM:Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。通过至少一个处理器访问内存中的地址。
[0154] 在一些实施方式中,存储器802存储了程序8021,程序8021可以被处理器801执行,这个程序包括:定位补丁函数地址和待打补丁函数的第一条入口指令;将补丁函数地址写入跳转表,并获取该补丁函数地址在该跳转表中的索引;将该跳转表地址写入寄存器;获取该待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引;将该待打补丁函数的第一条入口指令替换为该短指令,使得该待打补丁函数被调用时,该短指令被执行,该补丁函数被激活。具体的实施步骤与图2所示的实施例相同,此处不再赘述。
[0155] 从本发明实施例提供的以上技术方案可以看出,使用本发明实施例提供的在线补丁激活的装置,可以在只替换程序待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0156] 图9描述了本发明另一个实施例提供的运行驱动设备的结构,包括至少一个处理器901(例如CPU),存储器902,内903,和至少一个通信总线904,用于实现这些装置之间的连接通信。处理器901用于执行存储器902中存储的可执行模块,例如计算机程序。存储器902可能包含高速随机存取存储器(RAM:Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。通过至少一个处理器访问内存中的地址。
[0157] 在一些实施方式中,存储器902存储了程序9021,程序9021可以被处理器901执行,这个程序包括:定位补丁函数地址和待打补丁函数的第一条入口指令;将跳转到补丁函数地址的跳转指令写入跳转表,并获取该跳转指令在该跳转表中的索引;将该跳转表地址写入寄存器;获取该待打补丁函数的第一条入口指令的长度,并构造一条长度小于或等于该待打补丁函数的第一条入口指令长度的短指令,该短指令包含该寄存器的标识和该索引;将该待打补丁函数的第一条入口指令替换为该短指令,使得该待打补丁函数被调用时,该短指令被执行,该补丁函数被激活。具体的实施步骤与图3所示的实施例相同,此处不再赘述。
[0158] 从本发明实施例提供的以上技术方案可以看出,使用本发明实施例提供的在线补丁激活的装置,可以在只替换程序待打补丁函数入口处第一条指令的情况下,实现在线补丁激活,提高了操作系统的安全性;进一步,由于本发明实施例提供了跳转表,跳转表中可以记录多个补丁函数的信息,从而实现多个在线补丁同时更新,提高了用户体验。
[0159] 需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
[0160] 上述装置和系统内的各模块之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
[0161] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,上述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,上述的存储介质可为磁碟、光盘、只读存储记忆体(ROM:Read-Only Memory)或随机存储记忆体(RAM:Random Access Memory)等。
[0162] 本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。