一种热补丁注入方法及装置与流程

文档序号:12718907阅读:220来源:国知局
一种热补丁注入方法及装置与流程

本发明涉及计算机软件领域,尤其涉及一种热补丁注入方法及装置。



背景技术:

对于正在运行的软件系统,想要进行一些功能扩展或者修补一些软件问题,而又要求不能复位系统,这就需要给系统打热补丁。

热补丁就是把原来软件系统中的想要替换的函数单独修改重新编译组成热补丁单元,再通过热补丁加载工具加载到运行的目标软件系统中,替换原始函数。

然而,目前使用的热补丁技术有两个问题,一是需要在被注入的进程中有事先编译进去的代码负责补丁函数对被补函数的替换;二是当将被替换函数的头几条指令修改为跳转到新的补丁函数时,补丁加载存在风险,解决这个风险的现有方案都存在应用面窄,不通用,增加额外的内存与cpu的消耗的问题。



技术实现要素:

本发明提供一种热补丁注入方法及装置,以实现不依赖被注入的进程中有事先编译进去的代码进行热补丁注入,并减小热补丁注入时的消耗。

依据本发明的一个方面,提供一种热补丁注入方法,包括:

将补丁代码加载到目标进程中;

确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行,所述N大于或等于目标体系结构中跳转到内存任意地址所需要的最小指令数;

将所述N行指令修改为跳转到补丁代码的首地址的指令。

进一步,所述确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行,具体包括:

暂停目标进程内的所有线程;

确定被替换的代码中首地址开始的连续N行指令为目标指令,并将该目标指令之外的至少一条指令修改为异常指令;

让所有指针处于目标指令中的线程继续执行,当所有线程均被异常捕获工具捕捉时,确定所述目标指令没有被任何线程运行;

此时,所述将所述N行指令修改为跳转到补丁代码的首地址的指令后,还包括:

将所述修改为异常指令的至少一条指令恢复为原指令;

继续执行目标进程内的所有线程。

更进一步,所述将该目标指令之外的至少一条指令修改为异常指令,具体包括:

将该目标指令的后一条指令修改为异常指令。

较佳的,所述将补丁代码加载到目标进程中,具体包括:

通过代码注入将补丁代码加载到目标进程中。

本发明实施例还相应提供一种热补丁注入装置,包括:

加载单元,用于将补丁代码加载到目标进程中;

确定单元,用于确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行,所述N大于或等于目标体系结构中跳转到内存任意地址所需要的最小指令数;

修改单元,用于将所述N行指令修改为跳转到补丁代码的首地址的指令。

进一步,所述确定单元具体用于:

暂停目标进程内的所有线程;

确定被替换的代码中首地址开始的连续N行指令为目标指令,并将该目标指令之外的至少一条指令修改为异常指令;

让所有指针处于目标指令中的线程继续执行,当所有线程均被异常捕获工具捕捉时,确定所述目标指令没有被任何线程运行;

此时,所述修改单元还用于:

将所述N行指令修改为跳转到补丁代码的首地址的指令后,将所述修改为异常指令的至少一条指令恢复为原指令,并继续执行目标进程内的所有线程。

更进一步,所述确定单元将该目标指令之外的至少一条指令修改为异常指令,具体包括:

将该目标指令的后一条指令修改为异常指令。

较佳的,所述加载单元具体用于:

通过代码注入将补丁代码加载到目标进程中。

本发明有益效果如下:通过本发明实施例提供的热补丁注入方法及装置,将补丁代码加载到目标进程中,在确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行时,将该N行指令修改为跳转到补丁代码的首地址的指令,在运行过程中即可实现由被替换的代码跳转到补丁代码,从而实现热补丁注入,不需要被注入的进程中有事先编译,也减小了热补丁注入时的消耗。由于在将该N行指令修改为跳转到补丁代码的首地址的指令前,确定了被替换的代码中首地址开始的连续N行指令没有被任何线程运行,也减小了补丁加载时的运行风险。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的热补丁注入方法流程图;

图2为本发明实施例提供的具体实例中的热补丁注入方法流程图;

图3为本发明实施例提供的热补丁注入装置结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1所示,本发明实施例提供的热补丁注入方法,包括:

步骤S101、将补丁代码加载到目标进程中;

步骤S102、确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行,N大于或等于目标体系结构中跳转到内存任意地址所需要的最小指令数;

步骤S103、将N行指令修改为跳转到补丁代码的首地址的指令。

由于在确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行时,将该N行指令修改为跳转到补丁代码的首地址的指令,在运行过程中即可实现由被替换的代码跳转到补丁代码,从而实现热补丁注入,不需要被注入的进程中有事先编译,也减小了热补丁注入时的消耗。由于在将该N行指令修改为跳转到补丁代码的首地址的指令前,确定了被替换的代码中首地址开始的连续N行指令没有被任何线程运行,也减小了补丁加载时的运行风险。

该方法可以由程序员执行,也可以由热补丁注入工具或者包含热补丁注入工具的装置来执行。

具体的,可以利用异常捕获工具来确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行,此时,步骤S102中,确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行,具体包括:

暂停目标进程内的所有线程;

确定被替换的代码中首地址开始的连续N行指令为目标指令,并将该目标 指令之外的至少一条指令修改为异常指令;

让所有指针处于目标指令中的线程继续执行,当所有线程均被异常捕获工具捕捉时,确定目标指令没有被任何线程运行;

此时,步骤S103中,将N行指令修改为跳转到补丁代码的首地址的指令后,还包括:

将修改为异常指令的至少一条指令恢复为原指令;

继续执行目标进程内的所有线程。

当然,本领域技术人员也可以采用其它的方法或利用其它工具来确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行,此处不再一一说明。

进一步,为提高异常捕获的效率,可以将该目标指令的后一条指令修改为异常指令,此时异常捕获的效率较高,修改量较少。此时,将该目标指令之外的至少一条指令修改为异常指令,具体包括:

将该目标指令的后一条指令修改为异常指令。

较佳的,可以通过代码注入等工具来实现补丁代码的加载,此时,步骤S101中,将补丁代码加载到目标进程中,具体包括:

通过代码注入将补丁代码加载到目标进程中。

下面,通过一个具体的实例对本发明实施例提供的热补丁注入方法进行说明:

下面假设目的进程PROC中存在函数FUNC1,热补丁PATCH模块中存在函数FUNC2,目标体系结构中跳转到内存任意地址需要N条指令,欲将FUNC1替换为补丁函数FUNC2,如图2所示,详细实施步骤如下:

步骤S201、通过目标操作系统提供的基础api组合实现代码注入,把补丁模块PATCH加载到PROC的进程空间;

步骤S202、暂停进程PROC内的所有线程;

步骤S203、遍历所有线程,确定是否有pc指针处于欲替换指令区域中前N 条指令的线程,如果是,执行步骤S204,否则,执行步骤S208;

步骤S204、找到函数FUNC1的首地址,将首地址开始的第N+1条指令先记录下来,再修改为异常指令,其中,N等于目标体系结构中跳转到内存任意地址所需要的最小指令数;

步骤S205、让所有pc指针处于欲替换指令区域中前N条指令的线程继续执行;

步骤S206、确定继续执行的线程都被异常捕获工具捕捉到;

步骤S207、把FUNC1的第N+1条指令恢复为原始的正常指令;

步骤S208、将FUNC1的前N条指令修改为跳转到补丁函数FUNC2首地址的指令;

正在执行函数FUNC1前N条指令的线程执行到FUNC1的第N+1条指令时,会触发刚才放置的异常指令从而产生异常,当所有这样的线程都被异常捕获工具捕捉到时,此时进程PROC内已经没有任何线程在运行FUNC1的前N条指令了,因此可以安全的去修改FUNC1的前N条指令了,此时即可将这N条指令修改为跳转到补丁函数FUNC2首地址的指令,并把FUNC1的第N+1条指令恢复为原始的正常指令;

步骤S209、让进程PROC内的所有线程恢复正常运行,至此安全的完成了任意条指令的替换。

上述步骤可以由程序员执行,也可以由热补丁注入工具或者包含热补丁注入工具的装置来执行。

本发明实施例还相应提供一种热补丁注入装置,该装置可以具体为热补丁注入工具,也可以具体为包含热补丁注入工具的装置,如图3所示,该装置包括:

加载单元301,用于将补丁代码加载到目标进程中;

确定单元302,用于确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行,N大于或等于目标体系结构中跳转到内存任意地址所需要的 最小指令数;

修改单元303,用于将N行指令修改为跳转到补丁代码的首地址的指令。

进一步,确定单元302具体用于:

暂停目标进程内的所有线程;

确定被替换的代码中首地址开始的连续N行指令为目标指令,并将该目标指令之外的至少一条指令修改为异常指令;

让所有指针处于目标指令中的线程继续执行,当所有线程均被异常捕获工具捕捉时,确定目标指令没有被任何线程运行;

此时,修改单元303还用于:

将N行指令修改为跳转到补丁代码的首地址的指令后,将修改为异常指令的至少一条指令恢复为原指令,并继续执行目标进程内的所有线程。

更进一步,为提高热补丁注入的效率,确定单元302将该目标指令之外的至少一条指令修改为异常指令,具体包括:

将该目标指令的后一条指令修改为异常指令。

较佳的,加载单元301具体用于:

通过代码注入将补丁代码加载到目标进程中。

通过本发明实施例提供的热补丁注入方法及装置,将补丁代码加载到目标进程中,在确定被替换的代码中首地址开始的连续N行指令没有被任何线程运行时,将该N行指令修改为跳转到补丁代码的首地址的指令,在运行过程中即可实现由被替换的代码跳转到补丁代码,从而实现热补丁注入,不需要被注入的进程中有事先编译,也减小了热补丁注入时的消耗。由于在将该N行指令修改为跳转到补丁代码的首地址的指令前,确定了被替换的代码中首地址开始的连续N行指令没有被任何线程运行,也减小了补丁加载时的运行风险。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是其与其他实施例的不同之处。尤其对于装置实施例而言,由于其基本相似与方法实施例,所以,描述的 比较简单,相关之处参见方法实施例的部分说明即可。

虽然通过实施例描述了本申请,本领域的技术人员知道,本申请有许多变形和变化而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1