CN101482834B - 在线补丁激活方法、通信装置及系统 - Google Patents
在线补丁激活方法、通信装置及系统 Download PDFInfo
- Publication number
- CN101482834B CN101482834B CN2009101052002A CN200910105200A CN101482834B CN 101482834 B CN101482834 B CN 101482834B CN 2009101052002 A CN2009101052002 A CN 2009101052002A CN 200910105200 A CN200910105200 A CN 200910105200A CN 101482834 B CN101482834 B CN 101482834B
- Authority
- CN
- China
- Prior art keywords
- thread
- patch
- signal
- professional
- critical section
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开了一种在线补丁的激活方法,包括:向至少一个业务线程发送触发信号,使得至少一个业务线程检查本业务线程被信号打断的地址是否位于待打补丁函数的临界区并输出至少一个业务线程对应的检查结果;其中打断业务线程的信号包括触发信号;获得检查结果;当根据检查结果,确定业务线程被信号打断的地址均未位于待打补丁函数的临界区内时,修改待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令。通过本发明实施例,提高了应用软件在线补丁激活时的安全性和可靠性。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种在线补丁的激活方法、通信装置及系统。
背景技术
在线补丁是指程序运行中不重启程序而生效的补丁,广泛应用于各类软件。参见图1,激活在线补丁的基本原理是将要原函数(即待打补丁的函数)的入口处的指令替换为跳转指令,然后通过替换的跳转指令将调用原函数的程序跳转到的补丁函数中执行。随着Linux X86系统在电信领域的广泛应用,同样要求对Linux系统中的应用软件能够在线打补丁,但由于X86系统的指令特点以及Linux的调度方式,使得简单的将被替换函数的入口处指令改为跳转指令的补丁激活方式变得不完全可靠,不能满足电信软件对可靠性的要求。
参见图2,在Linux X86系统中,无条件跳转指令占5个字节,激活在线补丁时绝大多数情况下都会覆盖原函数入口处的3条指令,称原函数中这3条指令占用的5个字节的区域为临界区。如果激活在线补丁时直接将原函数入口处的指令替换为跳转指令,则当进程中有多个线程时,有可能出现某线程执行到临界区处(如执行到第一条或第二条指令)时刚好发生线程切换的情况,若此时激活在线补丁,该线程切换回来后由于原函数的临界区代码已被新的跳转指令覆盖,程序便会发生异常。
现有技术一般使用Pannus补丁技术,具体包括以下步骤:
(1)使用函数ptrace将原函数的进程暂停;
(2)检查原函数所有线程的EIP值是否在临界区;
(3)如果没有线程的EIP值在临界区,则在补丁函数入口写入跳转指令,恢复进程的执行;
(4)如果有线程的EIP值在临界区,则恢复进程执行一段时间,重新暂停进程进行检查;
(5)检查若干次(可自定义,如10次)后,如果还不能激活补丁,则返回激活补丁失败。
由于Pannus先暂停原函数进程,再检查所有线程的EIP值是否在临界区,因此,可以在一定程度上避免因直接写入而发生的程序异常。
发明人在实现本发明过程中,发现现有技术中:
替换函数前只检查当前线程EIP值是否在临界区,假设有线程被某个信号打断后,被打断的地址位于临界区,则线程处理完信号处理函数后返回时,由于临界区已被跳转指令覆盖,这时将会导致程序出错,因此这种方法仍然不能保证激活补丁时安全可靠。
发明内容
本发明实施例在于提供一种在线补丁的激活方法、通信装置及系统,以提高应用软件在线补丁激活时的安全性和可靠性。
本发明实施例是通过以下技术方案实现的:
本发明一个实施例提供了一种在线补丁激活方法,包括:向至少一个业务线程发送触发信号,使得所述至少一个业务线程检查本业务线程被信号打 断的地址是否位于待打补丁函数的临界区并输出所述至少一个业务线程对应的检查结果;其中打断所述业务线程的信号包括所述触发信号;
获得所述检查结果;
当根据所述检查结果,确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内时,修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令。
本发明另一个实施例提供了一种在线补丁激活方法,包括:
在接收到补丁激活线程发送的触发信号后,获得本业务线程被信号打断的地址,其中打断所述业务线程的信号包括所述触发信号;
检查所述本业务线程被信号打断的地址是否位于待打补丁函数的临界区内,并输出检查结果,使得补丁激活线程根据所述检查结果,确定本业务线程被信号打断的地址均未位于待打补丁函数的临界区内时,修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令。
以及,本发明另一个实施例提供了一种通信设备,包括:
发送单元,用于向至少一个业务线程发送触发信号;
结果获得单元,用于获得与所述触发信号关联的所述至少一个业务线程的检查结果;
确定单元,用于根据所述至少一个业务线程的检查结果,确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,其中打断所述业务线程的信号包括所述触发信号;
改写单元,用于修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令。
以及,本发明另一个实施例提供了一种通信设备,包括:
接收单元,用于接收触发信号;
地址获得单元,用于获得本端被信号打断的地址,其中打断所述业务线程的信号包括所述触发信号;
检查单元,用于检查本端被信号打断的地址是否位于待打补丁函数的临界区内;
输出单元,用于输出所述检查单元的关联本端的检查结果,使得接收到所述检查结果的通信设备根据所述检查结果确定本端被信号打断的地址均未位于待打补丁函数的临界区内。
以及,本发明另一个实施例提供了一种通信系统,该系统包括至少一个CPU,所述CPU上运行有操作系统,所述操作系统之上运行有补丁管理线程和至少一个业务线程,其中:
所述补丁管理线程,用于向所述至少一个业务线程发送触发信号,根据获得的与所述触发信号关联的所述至少一个业务线程的检查结果,确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,其中打断所述业务线程的信号包括所述触发信号;并修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令;
所述业务线程,用于在接收触发信号后,获得本业务线程被信号打断的地址,其中打断所述业务线程的信号包括所述触发信号;并检查本业务线程被信号打断的地址是否位于待打补丁函数的临界区内,并输出所述业务线程的检查结果。
本发明实施例中,通过向至少一个业务线程发送触发信号,使得接收到该触发信号的业务线程检查本业务线程被信号打断的地址是否位于待打补丁函数的临界区内;并根据获得的所述至少一个业务线程的检查结果,确定所 述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,再修改所述待打补丁函数临界区内的入口指令为跳转到补丁函数的跳转指令的技术方案,从而避免了当至少一个业务线程被信号打断后,如果处理完信号处理函数后所返回的地址(即业务线程被信号打断的地址)在临界区内,而由于临界区已被跳转指令覆盖所导致程序出错的问题,从而提高了应用软件在线补丁激活时的安全性和可靠性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1为现有技术中的补丁激活原理示意图;
图2为现有技术中的临界区示意图;
图3为本发明实施例的一种在线补丁激活方法的交互示意图;
图4为本发明实施例的另一种在线补丁激活方法的流程示意图;
图5为图4中S150-160的一种具体流程示意图;
图6为本发明实施例的另一种在线补丁激活方法的流程示意图;
图7为本发明实施例的用户态调用栈的示意图;
图8为本发明实施例的再一种在线补丁激活方法的流程示意图;
图9为本发明实施例的一种通信装置的结构示意图;
图10为本发明实施例的另一种通信装置的结构示意图;
图11为本发明实施例的通信系统的一种逻辑示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下将通过具体实施例和相关附图,对本发明作进一步详细说明。
本发明实施例提供一种在线补丁的激活方法、通信装置及通信系统,在应用程序内部通过补丁线程激活补丁,并保证多线程条件下在线补丁激活的安全性和可靠性。
方法实施例
参见图3,为本发明实施例的一种在线补丁激活方法,包括如下步骤:
S101、补丁激活线程向至少一个业务线程发送触发信号;
具体的,这里的触发信号可以是无法被所述至少一个业务线程所屏蔽的特定信号;为了方便描述,下面以一个业务线程的角度来介绍。
S102、业务线程收到该触发信号后,获得本业务线程被信号打断的地址;
需要说明的是,这里打断业务线程的信号可以是该触发信号,也可以是包含该触发信号的嵌套信号,即本业务线程在收到该触发信号之前,也收到了信号,如信号1、信号2等,应当理解的是,业务线程一旦收到信号,就执行信号处理函数,在执行完信号处理函数后,返回到之前该业务线程被信号打断的地址(即该信号处理函数返回的地址)后,继续执行业务;
应当理解的是,调用栈包括内核态调用栈和用户态调用栈,本发明实施例中,S102在一种实现下包括:解析本业务线程的用户态调用栈,得到本业务线程被信号打断的地址。
以及,如果打断本业务线程的信号为所述触发信号,则所述解析本业务线程的用户态调用栈包括:根据所述用户态调用栈的栈顶往栈底的方向,从 所述用户态调用栈中解析出第一假帧,从所述第一假帧中获得EIP信息,所述EIP信息表示本业务线程被所述触发信号打断的地址;
或者,如果打断本业务线程的信号为包含所述触发信号的嵌套信号,则所述解析本业务线程的用户态调用栈包括:根据所述用户态调用栈的栈顶往栈底的方向,从所述用户态调用栈中解析出所有假帧,从所述假帧中获得EIP值,所述EIP值表示本业务线程被所述信号打断的地址。
需要说明的是,这里的EIP是X86架构CPU的一个寄存器,存放该CPU要执行的下一条指令的地址。
S103、检查本业务线程被信号打断的地址是否位于待打补丁函数的临界区内,并输出检查结果;
输出检查结果,在一种实现下,当所述EIP值处于所述待打补丁函数的临界区内时,则在用户态存储区中对应线程标识(如线程ID)设置临界区标志,或者对应线程标识设置响应标志和临界区标志,例如:将对应线程标识的临界区标志置1,将对应线程标识的响应标志置1。当所述EIP值处于所述待打补丁函数的临界区外时,则在用户态存储区中对应线程标识(如线程ID)设置临界区标志,或者对应线程标识设置响应标志和临界区标志,例如:将对应线程标识的临界区标志置0,将对应线程标识的响应标志置1。
其中所述临界区标志表示本业务线程被信号打断的地址是否位于待打补丁函数的临界区内;所述响应标志表示本业务线程是否响应所述触发信号。
或者,在另一种实现下,也可以返回与所述触发信号对应的响应信号,所述响应信号包含有检查结果信息。
S104、补丁激活线程获得至少一个业务线程的检查结果;
具体的,在一种实现下,补丁激活线程读取用户态存储区中对应线程标 识的临界区标志;或者,对应线程标识的响应标志和临界区标志;
在另一种实现下,接收业务线程返回的与所述触发信号对应的响应信号,所述响应信号包含有检查结果信息。
S105、补丁激活线程根据所述至少一个业务线程的检查结果,确定至少一个业务线程被信号打断的地址均未位于待打补丁函数的临界区内;
在一种实现下,S105可以包括:根据对应业务线程标识的临界区标志,或,对应业务线程标识的响应标志确定所述至少一个业务线程均已响应;需要说明的是,这个步骤不是必须的,可以省去。
根据所述对应线程标识的临界区标志,确定所述业务线程被信号打断的地址均未位于所述临界区内。
在另一种实现下,S105可以包括:根据接收到的所述至少一个响应信号中包含的检查结果信息,确定所述业务线程被信号打断的地址均未位于所述临界区内。
S106、补丁激活线程将待打补丁函数临界区的入口指令修改为跳转到补丁函数的跳转指令。从而通过跳转指令跳转到的补丁函数中执行。
具体可以是,先将所述补丁函数地址写入所述路障指令后,再将所述路障指令修改为跳转指令。从而进一步具有安全性和可靠性。
以及,本发明实施例中,在S101步骤前进一步可以包括:在所述待打补丁函数入口设置路障指令,所述路障指令用于防止不在临界区的业务线程进入所述临界区。这里的路障指令包括但不限于HLT,从而通过路障指令阻止不在临界区的线程进入临界区执行,从而进一步提高在线补丁激活的安全可靠性。
以及,当根据所述至少一个业务线程的检查结果确定存在至少一个业务 线程被信号打断的地址位于所述临界区内时,则返回激活失败信息或一预设时间后,向位于临界区内的业务线程发送触发信号。
需要说明的是,这里的补丁激活线程和至少一个业务线程可以属于同一个进程,即补丁操作能在单进程内完成;这样,单进程的所有线程能共享访问用户态存储区(即进程空间),在单进程内,补丁激活线程将路障指令(如HLT指令)写入待打补丁函数的入口地址;
另一种实现下,这里的补丁激活线程和所述至少一个业务线程也可以分别属于不同的进程,例如:补丁激活线程属于进程A,所述至少一个业务线程属于进程B,进程A向进程B信号,使得进程B自身将路障指令(如HLT指令)写入待打补丁函数的入口地址。
可见,本发明实施例中,通过检查至少一个业务线程被信号打断的地址是否均未位于临界区内,在确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,再修改所述待打补丁函数临界区内的入口指令为跳转到补丁函数的跳转指令的技术方案,从而避免了当至少一个业务线程被信号打断后,如果处理完信号处理函数后所返回的地址(即业务线程被信号打断的地址)在临界区内,而由于临界区已被跳转指令覆盖所导致程序出错的问题,从而提高了应用软件在线补丁激活时的安全性和可靠性;
以及,由于在打补丁前设置路障指令,从而通过路障指令阻止其它当前不在临界区的线程进入临界区执行,从而进一步提高在线补丁激活的安全可靠性。
业务线程检查被信号打断的地址是否位于被打补丁函数的临界区可以通过解析用户态调用栈,并根据用户态调用栈假帧中的EIP来获得,并输出检查结果;业务线程向补丁激活对象输出检查结果可采用多种方法,包括更改 用户态存储区中的相关记录表中的相应标志,或者返回与触发信号对应的响应信号,在响应信号中包含有业务线程检查结果信息。
下面以补丁激活线程和业务线程属于单进程,且业务线程通过解析用户态调用栈获得本业务线程被信号打断的地址为例来对本发明实施例进行详细说明。
本发明具体实施例一:
在本发明实施例中,补丁激活线程向本进程中的除自身以外的其它所有线程(即业务线程)发送触发信号,其它线程收到触发信号后解析自己的用户态调用栈,检查自身被信号打断的地址是否位于待打补丁函数的临界区内,并输出结果,补丁激活线程根据该输出结果确定其它所有线程均未位于临界区,将待打补丁函数临界区内的入口指令修改为跳转到补丁函数的跳转指令。
下面分别描述补丁激活线程和其它线程的具体步骤:
1.补丁激活线程
参见图4,为本发明实施例的一种在线补丁激活方法的流程图,下面对流程图中各步骤进行具体说明:
S110.保存待打补丁函数(原函数)的入口地址;
得到原函数入口地址以确定临界区的地址,临界区的范围为从原函数入口地址起的前5个字节;
S120.将路障指令(如HLT指令)写入待打补丁函数的入口地址;
写路障指令的作用是阻止当前处于临界区外的线程进入临界区执行,线程执行到路障指令(如HLT指令)处时便会进行循环等待,而不会继续执行。在本实施例中,写路障指令前可以申请一个信号量,当线程执行到路障指令处时接管该信号,转到相应的信号处理函数,并在信号处理函数中去申请上 述信号量,由于信号量已经被补丁激活线程申请,因此所述其它线程由于申请不到所述信号量而处于挂起状态。
可见,通过写入路障指令,可以保证在激活补丁的过程中,没有其它线程进入临界区。应当理解的是,如果当前处于一个特殊环境下,即不会有其他线程再进入临界区内,则可以不用设置路障指令。
S130.初始化相关信息;
初始化的相关信息包括:响应记录表和临界区记录表等;应当理解的是,也可以为一个记录表,包含前述两个表中的所有信息。
响应记录表中包括线程标识和线程是否响应的响应标志,在初始化时设所有的响应标志为0(或其它数值),表示线程都没有响应;
临界区记录表中记录有线程被信号打断的地址是否在临界区的临界区标志,与响应记录表类似,在初始化时临界区记录表中的临界区标志也为0(或其它数值),表示没有线程被信号打断的地址在临界区。
在响应记录表和临界区记录表中,线程用线程ID来标识,线程ID可以从proc文件(虚拟文件系统中的一个文件,用于提供有关系统中进程的信息)中获取。
S140.补丁激活线程向业务线程(即本进程中除自身以外的其他线程)发送触发信号;
补丁激活线程向业务线程发送触发信号,使得业务线程收到该触发信号后解析自身的用户态调用栈(参见图6,业务线程中的步骤S360),以得到本业务线程被信号打断的地址。
S150.检查是否所有业务线程均已响应触发信号,如果是,执行步骤S160;如果否,则继续检查;
检查是否所有业务线程均已响应触发信号的具体方法如下:
响应记录表中包括表示线程是否响应的响应标志,若有线程响应,则该线程会将标识本线程的响应标志置1(或用户指定的其它数值,只要区别于初始值即可),当检查响应记录表中所有的响应标志都为1时,则表明所有业务线程都已响应;
在业务线程更新响应记录表时可能会出现一个问题:当补丁激活线程发出触发信号后恰好有线程退出,这时就会出现响应记录表中退出线程的响应标志一直为初始值或为空null。为了解决这个问题,可以采用图5所示的补偿方案:
S1501-1502.第一次检查响应记录表,判断是否所有业务线程均已响应触发信号,如果有线程没有响应,则执行S1503;反之,如果所有业务线程均已响应该触发信号,则执行步骤S160;
S1503.获得当前有效业务线程的数量与标识,检查当前有效业务线程的线程ID与响应记录表中的线程ID是否匹配(即检查有无退出或新增的线程),如果匹配,返回执行S1501.继续检查响应记录表;反之,则说明已经有线程退出或有新的线程加入,执行S1504;
S1504.将已退出的线程在响应记录表中的响应标志置为1进行补偿(也可以将该标志位从响应记录表中删除);再释放CPU(让其它线程得到调度执行)后再开始检查响应记录表。新加入的线程由于路障指令的存在使得其不会进入临界区,因此可以不对其进行处理。
S160.确认所有业务线程被信号打断的地址是否均未在临界区内,若有在临界区内,执行步骤S161;若均未在临界区内,执行步骤S170;
具体的,补丁激活线程可以通过读取临界区记录表中的临界区标志来确 认。业务线程在收到补丁激活线程发送的触发信号后解析线程自身的用户态调用栈,以得到本线程被信号打断的地址(即信号处理函数的返回地址),并检查该地址是否在临界区内,如果是,则在临界区记录表中置对应线程ID的临界区标志为1(或其它数值,只要区别于初始值即可)。补丁激活线程通过读取临界区记录表中的临界区标志就可以获得是否有线程、并且是哪几个线程被信号中断的地址在临界区内。
S170.写JMP指令,即修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令;
JMP指令包括操作码和操作数,其中操作码共一个字节;操作数为补丁函数的地址,共4个字节。写JMP指令时先将JMP指令4个字节的操作数写入,然后再将入口处的路障指令改写为JMP指令的操作码。
这样做可以防止先写操作码,再写操作数时可能会出现的一个问题:如果先将函数入口处的路障指令改写为JMP操作码(占一个字节),再写4个字节的操作数,由于没有了路障指令(已被JMP操作码覆盖),使得其它线程都可以进入原函数的临界区,这时,如果有一线程A进入临界区执行了两条指令,紧接着程序又转去写JMP指令后的4字节地址,那么5字节的JMP指令将覆盖临界区,当又回到线程A执行的时,原来的代码已被新的JMP指令覆盖,便会导致程序出错。
S180.唤醒所有挂起线程。
写完JMP指令后,便清除了路障指令(已被JMP指令覆盖),这时可以向业务线程发送线程恢复信号,即释放掉在步骤S120中申请到的信号量,这时,其它挂起的线程得到信号量后可以继续执行。
S161.检查是否继续检查,如果是,执行步骤S162,如果否,执行步骤 S164;
具体的,检查是否继续检查以及检查的次数都可以由用户预先设定。
S162.重置相应标志位,唤醒所有线程;
如果继续检查,则重置响应记录表和临界区记录表中的相应标志位,即将所有标志位的值设为初始值0,并唤醒所有挂起的线程,唤醒所有线程的方法可以参考步骤S180。
S163.释放CPU;接着执行步骤S140;
释放CPU(即放弃本线程的时间片,转去执行其它线程),让其它线程得到执行的机会,并重新向其它线程发送触发信号重新检查是否有线程被信号打断的地址在临界区。
S164.激活失败;
如果不继续检查,则表示此次补丁激活失败,激活失败时可以返回补丁激活失败的信息或者进行一些其它操作;接着执行步骤S180。
2.业务线程执行
业务线程为补丁激活线程所在进程中除补丁激活线程外的其它线程,参见图6,来具体说明其执行步骤:
S310.线程初始化;
用来完成业务线程的初始化工作;
S320.执行业务;
业务线程开始执行相关业务;
S330.检查是否碰到路障指令,如果是,执行步骤S340,如果否,继续执行步骤S320;
由于通过补丁激活线程在原函数中设置了路障指令,因此,如果其它线 程调用原函数时就会碰到路障指令。
S340.业务线程挂起;
如果碰到路障指令,线程就会挂起,防止其进入原函数(需要打补丁的函数)临界区。
S341.收到线程恢复信号,接着执行步骤S342;
业务线程收到补丁激活线程发送的线程恢复信号。
S342.恢复挂起的线程,继续执行业务;
业务线程收到线程恢复信号后恢复被挂起的线程,继续执行业务,直到程序结束。
S350.收到触发信号;
补丁激活线程运行过程中,会给其它线程(即业务线程)发送触发信号,使得业务线程解析自己的用户态调用栈,以获得线程被信号打断的地址。
S360.解析自身的用户态调用栈;
业务线程收到补丁激活线程发送的触发信号后开始解析自己的用户态调用栈。如图7所示,线程在调用其它函数时会在栈中存放相关参数,内核还会在用户态调用栈中放入假帧,在解析用户态调用栈时可以通过pretcode找到该假帧,假帧中uc字段中记录的eip的值就是信号打断线程的地址。
在解析用户态调用栈时,还会碰到信号嵌套的情况,即在处理某个信号处理函数时,线程又被另一个信号打断,这时,在用户态调用栈中又会出现一个假帧,因此,需要分析整个用户态调用栈,找到所有假帧,并根据假帧中uc字段中记录的eip的值来得到线程被信号打断的地址。
S370.将响应记录表中对应线程ID的响应标志位置1;
S380.检查eip值是否在临界区内,若有信号的返回地址在临界区,则临 界区记录表中的标志位置1;如果返回地址没有在临界区,则临界区记录表中的标志位不变,接着继续步骤S320。
可见,本发明实施例中,通过检查至少一个业务线程被信号打断的地址是否均未位于临界区内,在确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,再修改所述待打补丁函数临界区内的入口指令为跳转到补丁函数的跳转指令的技术方案,从而避免了当至少一个业务线程被信号打断后,如果处理完信号处理函数后所返回的地址(即业务线程被信号打断的地址)在临界区内,而由于临界区已被跳转指令覆盖所导致程序出错的问题,从而提高了应用软件在线补丁激活时的安全性和可靠性;
以及,由于在打补丁前设置路障指令,从而通过路障指令阻止其它当前不在临界区的线程进入临界区执行,从而进一步提高在线补丁激活的安全可靠性。
本发明具体实施例二
在本发明具体实施例一中,补丁激活线程执行到步骤S160时,如果有线程返回地址在临界区时,且继续检查,可以不清除路障,先更新响应记录表和临界区记录表中的信息,再释放CPU,最后根据更新后的记录表中的信息向需要检查的线程发送触发信号。
参见图5,本发明具体实施例二的在线补丁激活的方法步骤如下所示:
S510.保存待打补丁函数地址;
S520.写路障指令(如HLT);
S530.初始化相关信息,包括线程ID、响应标志和临界区标志,所述信息可以放入一个记录表中;
S540.向业务线程发送触发信号;
S550.确定是否所有业务线程均已响应该触发信号,如果是,执行步骤S560;如果否,继续执行步骤S550进行检查;
S560.确认所有的业务线程被信号打断的地址是否均未位于临界区内,
如果有业务线程被信号打断的地址在临界区内,执行步骤S561;反之,执行步骤S570;
S570.写JMP指令;
S580.清除路障指令,向业务线程发送线程恢复信号,唤醒所有挂起线程;
S561.是否继续检查,如果是,执行步骤S562;如果否,执行步骤S565;
S562.更新相关记录表及需检查的线程集合;
由于响应记录表中存有线程被信号打断的地址在临界区的线程,这些被信号打断的地址在临界区的线程为需检查的线程集合,更新具体可以通过以下几个方法:
(1)将原响应记录表中线程被信号打断的地址不在临界区的线程清除,同时置需要重新检查的线程(即线程被信号打断的地址在临界区的线程)的响应标志位为0;
(2)不清除原响应记录表中的记录,将需要重新检查的线程(即线程被信号打断的地址在临界区的线程)的响应标志位为0;
S563.释放CPU;
S564.向需检查的线程发送触发信号,然后继续执行步骤S550;
S565.激活失败;接着执行步骤S580,结束。
本发明具体实施例二的业务线程执行步骤与实施例一中类似,可以参考 实施例一中的业务线程的执行步骤,故不再赘述。
可见,本发明实施例中,通过确定所有业务线程被信号打断的地址均未位于临界区内,之后写入跳转到补丁函数的跳转指令,从而避免了当至少一个业务线程被信号打断后,如果处理完信号处理函数后所返回的地址(即业务线程被信号打断的地址)在临界区内,而由于临界区已被跳转指令覆盖所导致程序出错的问题,从而提高了应用软件(Linux X86系统中软件)在线补丁激活时的安全性和可靠性,满足电信软件的在线补丁机制所要求的安全可靠。
同时,补丁激活可以在单进程内完成,且在补丁激活过程中,并且只有在补丁激活过程中试图进入临界区的线程才会被暂停很短的时间,对业务的影响小。
装置实施例一
本发明实施例的通信设备,在应用程序内部通过补丁线程激活补丁,并保证多线程条件下激活补丁的安全性和可靠性。应当理解的是:本发明实施例的通信设备安装有应用程序,该应用程序运行时,表现为补丁激活管理线程。
参见图9,为本发明实施例的一种通信装置的结构示意图,本发明实施例的通信设备,包括:
发送单元801,用于向至少一个业务线程发送触发信号,这里的业务线程可以是一个进程中除补丁激活管理线程以外的其他线程;这里的触发信号可以是无法被所述至少一个业务线程所屏蔽的特定信号;
结果获得单元802,用于获得与所述触发信号关联的所述至少一个业务线 程的检查结果,该检查结果可以位于用户态存储区中;这样,同一个进程的不同线程均可以访问。
确定单元803,用于根据所述至少一个业务线程的检查结果,确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,其中打断所述业务线程的信号包括所述触发信号;
改写单元804,用于将所述待打补丁函数临界区内的入口指令修改为跳转到补丁函数的跳转指令。具体的,改写单元804为第一改写单元,用于将所述补丁函数地址写入所述路障指令后,并将所述路障指令修改为跳转指令。
在一种实现下,改写单元804,进一步用于,在所述待打补丁函数入口设置路障指令,所述路障指令用于防止不在临界区内的业务线程进入所述临界区。
以及,在一种实现下,结果获得单元802为第一结果获得单元,用于读取用户态存储区中对应线程标识的临界区标志;或者,对应线程标识的响应标志和临界区标志;相应的,确定单元803为第一确定单元,用于根据所述对应线程标识的临界区标志,确定所述业务线程被信号打断的地址均未位于所述临界区内。
以及,在另一种实现下,结果获得单元802为第二结果获得单元,用于接收业务线程返回的与所述触发信号对应的响应信号,所述响应信号包含有检查结果信息。相应的,确定单元803为第二确定单元,用于根据接收到的所述至少一个响应信号中包含的检查结果信息,确定所述业务线程被信号打断的地址均未位于所述临界区内。
需要说明的是,本发明实施例在应用程序内部通过补丁线程激活补丁,因此应当理解的是,本发明实施例保护通信设备,该通信设备安装有应用程 序,当该应用程序执行时,该通信设备具有如上描述的功能从而实现在线补丁的激活。
可见,本发明实施例中,通过检查至少一个业务线程被信号打断的地址是否均未位于临界区内,在确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,再修改所述待打补丁函数临界区内的入口指令为跳转到补丁函数的跳转指令的技术方案,从而避免了当至少一个业务线程被信号打断后,如果处理完信号处理函数后所返回的地址(即业务线程被信号打断的地址)在临界区内,而由于临界区已被跳转指令覆盖所导致程序出错的问题,从而提高了应用软件在线补丁激活时的安全性和可靠性;
以及,由于在打补丁前设置路障指令,从而通过路障指令阻止其它当前不在临界区的线程进入临界区执行,从而进一步提高在线补丁激活的安全可靠性。
装置实施例二
本发明实施例的通信设备,在应用程序内部通过补丁线程激活补丁,并保证多线程条件下激活补丁的安全性和可靠性。应当理解的是:本发明实施例的通信设备安装有应用程序,该应用程序运行时,表现为业务线程。
参见图10,为本发明实施例的一种通信装置的结构示意图,本发明实施例的通信设备,包括:
接收单元901,用于接收触发信号;
地址获得单元902,用于获得本端被信号打断的地址,其中打断所述业务线程的信号包括所述触发信号;获得本端被信号打断的地址可以通过解析本端用户态调用栈,通过找到假帧中的EIP值来得到本端被信号打断的地址;
检查单元903,用于检查本端被信号打断的地址是否位于待打补丁函数的临界区内;
输出单元904,用于输出所述检查单元的与本端关联的检查结果,使得接收到所述检查结果的通信设备根据所述检查结果确定本端被信号打断的地址均未位于待打补丁函数的临界区内,检查结果可以存入在用户态存储区中,如内存或硬盘等区域。或者,返回包含检查结果信息的响应信号。
以及,在一种实现下,地址获得单元902为第一地址获得单元,用于根据对本端的用户态调用栈的解析结果,得到本端被信号打断的地址。
需要说明的是,打断业务线程的信号可以是该触发信号,也可以是包含该触发信号的嵌套信号,即本业务线程在收到该触发信号之前,也收到了信号,如信号1、信号2等;则,在一种实现下,如果打断本业务线程的信号为所述触发信号,则第一地址获得单元,具体用于根据所述用户态调用栈的栈顶往栈底的方向,从所述用户态调用栈中解析出第一假帧,从所述第一假帧中获得EIP信息,所述EIP信息表示本业务线程被所述触发信号打断的地址;
或者,如果打断本业务线程的信号为包含所述触发信号的嵌套信号,则第一地址获得单元,具体用于根据所述用户态调用栈的栈顶往栈底的方向,从所述用户态调用栈中解析出所有假帧,从所述假帧中获得EIP值,所述EIP值表示本业务线程被所述信号打断的地址。
以及,在一种实现下,输出单元904为第一输出单元,用于在用户态存储区中记录对应所述业务线程标识的临界区标志,或者,对应所述业务线程标识的临界区标志和响应标志;
或者,在另一种实现下,输出单元904为第二输出单元,用于返回与所述触发信号对应的响应信号,所述响应信号包含有所述业务线程的检查结果 信息。
需要说明的是,本发明实施例在应用程序内部通过补丁线程激活补丁,因此应当理解的是,本发明实施例保护通信设备,该通信设备安装有应用程序,当该应用程序执行时,该通信设备具有如上描述的功能从而实现在线补丁的激活。
可见,本发明实施例中,在接收到触发信号后,获得被信号打断的地址并输出,使得发送触发信号的对端在确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,再修改所述待打补丁函数临界区内的入口指令为跳转到补丁函数的跳转指令的技术方案,从而避免了当至少一个业务线程被信号打断后,如果处理完信号处理函数后所返回的地址(即业务线程被信号打断的地址)在临界区内,而由于临界区已被跳转指令覆盖所导致程序出错的问题,从而提高了应用软件在线补丁激活时的安全性和可靠性。
系统实施例一
参见图11,为本发明实施例的一种通信系统的逻辑示意图,需要说明的是,图11中包括多个CPU,应当理解的是,本发明实施例的通信系统中可以包括一个CPU,即单CPU的通信系统。
本发明实施例的通信系统,包括至少一个CPU,所述CPU上运行有操作系统,所述操作系统之上运行有补丁管理线程和至少一个业务线程,其中:
所述补丁管理线程,用于向所述至少一个业务线程发送触发信号,根据获得的与所述触发信号关联的所述至少一个业务线程的检查结果,确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,其中打断所述业务线程的信号包括所述触发信号;并将所述待打补丁函数临界区的入口 指令修改为跳转到补丁函数的跳转指令;
所述业备线程,用于在接收触发信号后,获得本业务线程被信号打断的地址,其中打断所述业务线程的信号包括所述触发信号;并检查本业务线程被信号打断的地址是否位于待打补丁函数的临界区内,输出本业务线程的检查结果。
在一种实现方式下,所述业务线程为第一业务线程,用于在收到触发信号后,根据对本业务线程的用户态调用栈的解析结果检查本业务线程被信号打断的地址是否位于待打补丁函数的临界区内,并输出所述业务线程的检查结果。
需要说明的是,这里的补丁激活线程和至少一个业务线程可以属于同一个进程,即补丁操作能在单进程内完成;应当理解的是,程序需要线程来执行才会发生作用。本发明实施例在应用程序内部通过补丁线程激活补丁,因此应当理解的是,本发明实施例保护通信系统,该通信系统包括至少一个CPU,所述CPU上运行有操作系统,所述操作系统之上运行应用程序,当该应用程序执行时,该通信系统具有如上描述的功能从而实现在线补丁的激活。
这里的补丁激活线程和至少一个业务线程可以认为是补丁激活管理逻辑实体、业务逻辑实体。
进一步的,本发明实施例的通信系统具体可以是X86系统,在X86系统下,包括至少一个x86架构的CPU,CPU上运行有Linux操作系统,所述Linux操作系统之上运行有补丁管理线程和至少一个业务线程(具体功能同上,故不再赘述)。应用软件的在线补丁激活时,由于X86采用复杂指令集,跳转指令会覆盖函数入口的多条指令,Linux的多线程调度机制使得补丁激活时存在安全性问题。本发明实施例的X86系统,通过如上功能,在应用程序内部 通过补丁线程激活补丁,并保证多线程条件下激活补丁的安全性和可靠性。
可见,本发明实施例中,通过检查至少一个业务线程被信号打断的地址是否均未位于临界区内,在确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内,再修改所述待打补丁函数临界区内的入口指令为跳转到补丁函数的跳转指令的技术方案,从而避免了当至少一个业务线程被信号打断后,如果处理完信号处理函数后所返回的地址(即业务线程被信号打断的地址)在临界区内,而由于临界区已被跳转指令覆盖所导致程序出错的问题,从而提高了应用软件在线补丁激活时的安全性和可靠性。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-OnlyMemory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上举较佳实施例,对本发明的目的、技术方案和优点进行了进一步详细说明,所应理解的是,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (11)
1.一种在线补丁激活方法,其特征在于,包括:
向至少一个业务线程发送触发信号,使得所述至少一个业务线程检查本业务线程被信号打断的地址是否位于待打补丁函数的临界区并输出所述至少一个业务线程对应的检查结果;其中打断所述业务线程的信号包括所述触发信号;
获得所述检查结果;
当根据所述检查结果,确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内时,修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令。
2.如权利要求1所述的在线补丁激活方法,其特征在于,在所述向业务线程发送触发信号步骤前还包括:
在所述待打补丁函数入口设置路障指令,所述路障指令用于防止不在临界区的业务线程进入所述临界区。
3.如权利要求1所述的在线补丁激活方法,其特征在于,所述获得所述检查结果包括:读取用户态存储区中与线程标识对应的临界区标志;
则所述当根据所述检查结果,确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内时,修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令的步骤,包括:
当根据与所述线程标识对应的临界区标志,确定所述业务线程被信号打断的地址均未位于所述临界区内时,修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令。
4.如权利要求1所述的在线补丁激活方法,其特征在于,所述获得所述检查结果包括:接收所述至少一个业务线程返回的与所述触发信号对应的响应信号,所述响应信号包含有检查结果信息;
则所述当根据所述检查结果,确定所述业务线程被信号打断的地址均未位于待打补丁函数的临界区内时,修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令的步骤包括:
当根据接收到的响应信号中包含的检查结果信息,确定所述业务线程被信号打断的地址均未位于所述临界区内时,修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令。
5.如权利要求3所述的在线补丁激活方法,其特征在于,如果从用户态存储区中进一步读取到对应线程标识的响应标志,则所述方法进一步包括:
当根据所述对应线程标识的响应标志确定所述至少一个业务线程中有业务线程未响应时,获得当前有效业务线程的标识,根据所述当前有效业务线程的标识与读取到的信息的匹配结果,将退出的业务线程的响应标志置位或者删除用户态存储区中与所述退出的业务线程相关的信息。
6.如权利要求1所述的在线补丁激活方法,其特征在于,所述方法进一步包括:
当根据所述检查结果确定存在至少一个业务线程被信号打断的地址位于所述临界区内时,则返回激活失败信息,或在一预设时间后,向位于临界区内的业务线程发送触发信号。
7.如权利要求2所述的在线补丁激活方法,其特征在于,所述将所述待打补丁函数临界区内的入口指令修改为跳转到补丁函数的跳转指令的步骤,包括:
将所述待打补丁函数地址写入所述路障指令后,并将所述路障指令修改为跳转指令。
8.一种在线补丁激活方法,其特征在于,包括:
在接收到补丁激活线程发送的触发信号后,获得本业务线程被信号打断的地址,其中打断所述业务线程的信号包括所述触发信号;
检查本业务线程被信号打断的地址是否位于待打补丁函数的临界区内,并输出检查结果,使得补丁激活线程根据所述检查结果,确定本业务线程被信号打断的地址均未位于待打补丁函数的临界区内时,修改所述待打补丁函数临界区的入口指令为跳转到补丁函数的跳转指令。
9.如权利要求8所述的在线补丁激活方法,其特征在于,所述获得本业务线程被信号打断的地址的步骤包括:解析本业务线程的用户态调用栈,得到本业务线程被信号打断的地址。
10.如权利要求9所述的在线补丁激活方法,其特征在于,如果打断本业务线程的信号为所述触发信号,则所述解析本业务线程的用户态调用栈包括:根据所述用户态调用栈的栈顶往栈底的方向,从所述用户态调用栈中解析出第一假帧,从所述第一假帧中获得EIP信息,所述EIP信息表示本业务线程被所述触发信号打断的地址;
或者,如果打断本业务线程的信号为包含所述触发信号的嵌套信号,则所述解析本业务线程的用户态调用栈包括:根据所述用户态调用栈的栈顶往栈底的方向,从所述用户态调用栈中解析出所有假帧,从所述假帧中获得EI P值,所述EIP值表示本业务线程被所述嵌套信号打断的地址。
11.如权利要求8所述的在线补丁激活方法,其特征在于,所述输出检查结果,包括:
在用户态存储区中记录与所述业务线程标识对应的临界区标志,或者,与所述业务线程标识对应的临界区标志和响应标志;
或者,返回与所述触发信号对应的响应信号,所述响应信号包含有所述业务线程的检查结果信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101052002A CN101482834B (zh) | 2009-01-20 | 2009-01-20 | 在线补丁激活方法、通信装置及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101052002A CN101482834B (zh) | 2009-01-20 | 2009-01-20 | 在线补丁激活方法、通信装置及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101482834A CN101482834A (zh) | 2009-07-15 |
CN101482834B true CN101482834B (zh) | 2012-02-22 |
Family
ID=40879958
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009101052002A Expired - Fee Related CN101482834B (zh) | 2009-01-20 | 2009-01-20 | 在线补丁激活方法、通信装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101482834B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102156661B (zh) * | 2010-02-11 | 2013-06-12 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN101794272B (zh) * | 2010-03-26 | 2012-07-25 | 成都市华为赛门铁克科技有限公司 | 为共享代码段打补丁的方法及装置 |
CN102547740B (zh) | 2011-12-31 | 2015-03-25 | 华为技术有限公司 | 干扰消除方法、设备及通信系统 |
CN102663298B (zh) * | 2012-04-06 | 2014-12-17 | 北京空间飞行器总体设计部 | 面向终端计算机的安全在线检查系统 |
CN103530184B (zh) * | 2013-10-24 | 2017-04-12 | 华为技术有限公司 | 一种在线补丁激活的方法及装置 |
US9934024B2 (en) | 2014-01-24 | 2018-04-03 | Hewlett Packard Enterprise Development Lp | Dynamically patching kernels using storage data structures |
CN105607937B (zh) * | 2015-12-25 | 2019-01-18 | 京信通信系统(中国)有限公司 | 一种热补丁方法及设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6260157B1 (en) * | 1999-02-16 | 2001-07-10 | Kurt Schurecht | Patching of a read only memory |
CN1475909A (zh) * | 2002-08-16 | 2004-02-18 | 华为技术有限公司 | 一种嵌入式系统软件补丁的实现和控制方法 |
CN1696911A (zh) * | 2004-05-11 | 2005-11-16 | 微软公司 | 有效地打补丁 |
CN1737773A (zh) * | 2004-08-16 | 2006-02-22 | 上海华为技术有限公司 | 对嵌入式系统进行在线监测的方法及其系统 |
CN101004681A (zh) * | 2006-12-22 | 2007-07-25 | 中兴通讯股份有限公司 | 嵌入式系统动态补丁长跳转的实现方法 |
CN101154187A (zh) * | 2006-09-29 | 2008-04-02 | 英特尔公司 | 用于为程序打补丁的方法、产品、服务处理器和系统 |
-
2009
- 2009-01-20 CN CN2009101052002A patent/CN101482834B/zh not_active Expired - Fee Related
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6260157B1 (en) * | 1999-02-16 | 2001-07-10 | Kurt Schurecht | Patching of a read only memory |
CN1475909A (zh) * | 2002-08-16 | 2004-02-18 | 华为技术有限公司 | 一种嵌入式系统软件补丁的实现和控制方法 |
CN1696911A (zh) * | 2004-05-11 | 2005-11-16 | 微软公司 | 有效地打补丁 |
CN1737773A (zh) * | 2004-08-16 | 2006-02-22 | 上海华为技术有限公司 | 对嵌入式系统进行在线监测的方法及其系统 |
CN101154187A (zh) * | 2006-09-29 | 2008-04-02 | 英特尔公司 | 用于为程序打补丁的方法、产品、服务处理器和系统 |
KR20080029949A (ko) * | 2006-09-29 | 2008-04-03 | 인텔 코오퍼레이션 | 서비스 프로세서 코드의 실행 시간 인메모리 패칭 방법 및시스템 |
EP1909171A1 (en) * | 2006-09-29 | 2008-04-09 | Intel Corporation | Method and apparatus for run-time in-memory patching of code from a service processor |
CN101004681A (zh) * | 2006-12-22 | 2007-07-25 | 中兴通讯股份有限公司 | 嵌入式系统动态补丁长跳转的实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101482834A (zh) | 2009-07-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101482834B (zh) | 在线补丁激活方法、通信装置及系统 | |
CN101154180B (zh) | 一种任务栈溢出的监测方法 | |
US7039779B2 (en) | Access monitor and access monitoring method for monitoring access between programs | |
CN102971715B (zh) | 处理器装置以及程序 | |
US7934129B2 (en) | Network hang recovery | |
CN101023411A (zh) | 用于最小化计算机应用程序中的丢失的方法和系统 | |
EP1760559A1 (en) | Method and apparatus for synchronizing an industrial controller with a redundant controller | |
CN104685508A (zh) | 具有安全域和次安全域的数据处理装置中的异常处理 | |
CN103279706A (zh) | 拦截在移动终端中安装安卓应用程序的方法和装置 | |
CN102150105A (zh) | 虚拟容器的部署和管理 | |
CN100465893C (zh) | 一种嵌入式操作系统驱动程序动态升级方法 | |
UA55438C2 (uk) | Спосіб контролю приписаного виконання програм | |
CN100561384C (zh) | 控制系统组态的增量式在线下载方法 | |
CN104809045B (zh) | 监控脚本的运行方法及装置 | |
CN104156298A (zh) | 一种应用监控方法及装置 | |
CN100590599C (zh) | 一种flash的写操作处理方法、系统及设备 | |
CN102754079A (zh) | 多核处理器系统、控制程序、以及控制方法 | |
CN103559450A (zh) | 一种基于内核驱动钩子技术的电子标签数据保护方法 | |
CN105427098A (zh) | 一种不同应用之间信息共享的实现方法及装置 | |
US6697971B1 (en) | System and method for detecting attempts to access data residing outside of allocated memory | |
CN104992116B (zh) | 基于intent sniffer的监测方法及系统 | |
CN104123499A (zh) | 一种利用Android设备管理器对抗卸载的软件的识别方法及装置 | |
CN101233495A (zh) | 用于在具有快闪程序存储器的微控制器中提供程序断点的机制 | |
CN113868023A (zh) | 存储系统的快照方法、装置、电子设备及可读存储介质 | |
CN101231599B (zh) | 一种定位特定内存被函数非法改写的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120222 Termination date: 20170120 |