CN105528231B - 一种基于中间辅助函数的软件动态升级方法及系统 - Google Patents

一种基于中间辅助函数的软件动态升级方法及系统 Download PDF

Info

Publication number
CN105528231B
CN105528231B CN201610039757.0A CN201610039757A CN105528231B CN 105528231 B CN105528231 B CN 105528231B CN 201610039757 A CN201610039757 A CN 201610039757A CN 105528231 B CN105528231 B CN 105528231B
Authority
CN
China
Prior art keywords
function
updated
update
intermediate auxiliary
source file
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.)
Active
Application number
CN201610039757.0A
Other languages
English (en)
Other versions
CN105528231A (zh
Inventor
邹德清
代炜琦
陈志坤
金海�
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huazhong University of Science and Technology
Original Assignee
Huazhong University of Science and Technology
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Huazhong University of Science and Technology filed Critical Huazhong University of Science and Technology
Priority to CN201610039757.0A priority Critical patent/CN105528231B/zh
Publication of CN105528231A publication Critical patent/CN105528231A/zh
Application granted granted Critical
Publication of CN105528231B publication Critical patent/CN105528231B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/656Updates while running

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于中间辅助函数的软件动态升级方法,通过分析整合后的新/旧版本代码源文件中的待更新函数,生成中间辅助函数;利用中间辅助函数及二进制重写机制,分别对处于函数调用栈的待更新函数、未处于函数调用栈的待更新函数及待更新静态变量进行更新。相应地,本发明还提出了对应的系统。本发明有效解决了插入多个检查点带来的系统损耗和死锁问题,在确保更新升级安全性的同时,能够对程序进行实时动态更新,显著降低了用户的操作复杂性及系统开销,同时,可在更新出现任何异常时完成回滚,保证更新过程的可靠性。本发明适用于需要高可靠持续性需求的应用服务,能够减少因版本更新导致系统重启引起的损失。

Description

一种基于中间辅助函数的软件动态升级方法及系统
技术领域
本发明属于云软件可靠性研究中的安全领域,更具体地,涉及一种基于中间辅助函数的软件动态升级方法及系统。
背景技术
软件在使用过程中需要不断的升级更新来修复漏洞和添加功能,然而传统的软件更新需要先关闭软件,更新完成后再重新启动软件。这样一方面软件服务会宕机一段时间,另一方面软件服务将会丢失更新前的状态。这对于需要7/24小时的软件服务而言,无疑是降低了服务的可用性。但是如果不采用更新的话,无疑会降低软件的安全性和服务可靠性。针对这个问题,软件动态升级方法能够在程序不停止服务的情况下完成程序的更新升级工作,并且能够保证软件更新前后服务状态不丢失,从而提高系统的可用性和可靠性。
现有的动态软件升级方法中,针对正在调用中函数的更新,一般有两种方法,一种是等待待更新函数返回后再进行更新。另一种方法是基于安全更新点和堆栈重构的方法来完成更新,即等待线程执行到函数中的某个安全更新点时,对线程的函数栈进行堆栈重构工作,使旧版本函数的函数栈转换成新版本函数的函数栈,同时使线程跳转到安全更新点对应的新版本函数位置来进行更新工作。
然而,上述两种方法都存在一定的不足和局限性。(1)等待待更新函数返回后再进行更新的方法无法更新一些不会返回的函数,例如主循环函数,调度函数等等,这些函数会一直处入函数栈中,如果一直得不到更新也会存在安全隐患;(2)基于检查点和堆栈重构的方法虽然可以在函数调用时更新函数,但是,在多线程程序中,很难使所有线程都达到安全更新点。目前有些方法是借助编译器使程序的所有线程可达到安全检查点。然而,这种方法只能针对于特定编译器编译出的程序,不能对通用编译器编译出的一般程序进行升级更新工作。另外有一些方法采取阻塞线程,使线程都到达检查点后再更新,但是这种方法可能导致死锁问题,虽然可以在死锁处强行更新,但被死锁阻塞的线程可能处于不安全的更新位置,此时如果强行更新会影响程序的安全性和正确性。而堆栈重构的方法对于某些更新往往只有很少的改动。有的动态更新方法的安全更新点只能适用于单线程的程序,而多线程程序无法同时到达安全更新点,从而无法对多线程程序实行动态更新。
使用堆栈重构更新调用层次很深的函数(例如递归函数中)开销是很大的,可能函数栈只有上层的数个函数有改动需要更新,但是堆栈重构需要重新构造所有堆栈,并且堆栈重构时程序必须暂停运行。多线程程序中每个线程都有自己独立的栈,如果采用堆栈重构的方法,不仅更新时间会变长,更严重的是更新过程中程序会暂停较长时间。
综上所述,现有的动态软件升级系统的方案存在以下不足:
有的动态软件升级方法(polus)只能更新不处于函数调用栈中的函数,无法对正在执行的函数进行实时更新,如果一些无法在短时间内返回的函数,如主循环函数和调度函数,将无法更新到下一个版本。有的动态升级方法(upstare)需要特定编译器支持,所以无法对使用通用编译器编译的程序进行动态更新。有的动态软件升级方法(Kitsune)以进程为更新单元,在更新过程中需要存储新版本的全部代码数据而导致额外开销较大,而实际更新往往只有很少的改动。有的动态更新方法的安全更新点只能适用于单线程的程序,而多线程程序无法同时到达安全更新点,从而无法对多线程程序实行动态更新。
发明内容
针对现有技术的缺陷或改进需求,本发明提供了一种基于中间辅助函数的软件动态升级方法及系统,其目的在于,解决现有针对已经部署的多线程应用程序进行动态升级方法中出现的上述局限和不足,保证了多线程应用程序动态更新的安全性、实时性和有效性。
为实现上述目的,按照本发明的一个方面,提出了一种基于中间辅助函数的软件动态升级方法,其特征在于,所述方法包括:
(1)获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;
(2)通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;
(3)静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时根据待更新函数,生成中间辅助函数;
(4)根据用户的初始化请求,将步骤(2)中生成的初级动态升级补丁注入到正在运行的待更新程序中;
(5)注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
(6)根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;
(7)恢复因更新而被暂停的进程,更新过程结束。
作为进一步优选的,所述步骤(3)具体包括:
(3-1)分析待更新函数的语义,获取并记录待更新函数的安全更新指令集合,生成函数语义映射表;
(3-2)将待更新函数的参数作为中间辅助函数的参数,构造生成中间辅助函数,所述中间辅助函数包含控制内容、待更新函数新版本内容和待更新函数旧版本内容;其中,
所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;
(3-3)对所述中间辅助函数的待更新函数旧版本内容进行修改,使其利用转换函数访问新版本数据。
作为进一步优选的,若一段指令中任意一条指令前的所有执行路径都能保证新旧版本语义一致,则该段指令为安全更新指令集合。
作为进一步优选的,所述步骤(6)具体包括:
(6-1)根据用户发出的更新请求,暂停所有与更新相关的进程,将所有的旧版本待更新静态变量转换成新版本静态变量;
(6-2)查看待更新函数是否位于函数调用栈,若是,根据步骤(3)的函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程当前执行位置入栈,然后跳转到步骤(3)中生成中间辅助函数的入口地址,利用中间辅助函数进行更新;否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方法进行更新。
作为进一步优选的,所述方法还包括:
(1)在程序更新前保存待更新程序的检查点;
(2)在更新过程中,通过监控程序实时监控待更新程序状态,若待更新程序发生异常时,使用所述检查点进行回滚,将其还原到更新之前的状态。
按照本发明的另一个方面,提出了一种基于中间辅助函数的软件动态升级系统,其特征在于,所述系统包括:
整合模块,用于获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;
补丁生成模块,用于通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;
分析模块,用于静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时用于根据待更新函数,生成中间辅助函数;
注入模块,用于根据用户的初始化请求,将生成的初级动态升级补丁注入到正在运行的待更新程序中;
获取模块,用于在注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
更新模块,用于根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;
恢复模块,用于恢复因更新而被暂停的进程,更新过程结束。
作为进一步优选的,所述分析模块具体包括:
第一分析生成单元,用于分析待更新函数的语义,获取并记录待更新函数的安全更新指令集合,生成函数语义映射表;
第二分析生成单元,用于将待更新函数的参数作为中间辅助函数的参数,构造生成中间辅助函数,所述中间辅助函数包含控制内容、待更新函数新版本内容和待更新函数旧版本内容;其中,
所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;
修改单元,用于对所述中间辅助函数的待更新函数旧版本内容进行修改,使其利用转换函数访问新版本数据。
作为进一步优选的,若一段指令中任意一条指令前的所有执行路径都能保证新旧版本语义一致,则该段指令为安全更新指令集合。
作为进一步优选的,所述更新模块具体包括:
暂停单元,用于根据用户发出的更新请求,暂停所有与更新相关的进程;
静态变量更新单元,用于将所有的旧版本待更新静态变量转换成新版本静态变量;
函数更新单元,用于查看待更新函数是否位于函数调用栈,若是,根据所述函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程当前执行位置入栈,然后跳转到生成中间辅助函数的入口地址,利用中间辅助函数进行更新;否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方法进行更新。
作为进一步优选的,所述系统还包括:
存储模块,用于在程序更新前保存待更新程序的检查点;
监控模块,用于在更新过程中,通过监控程序实时监控待更新程序状态;
回滚模块,用于在待更新程序发生异常时,使用所述存储模块中保存的检查点进行回滚,将所述待更新程序还原到更新之前的状态。
总体而言,按照本发明点的以上技术方案与现有技术相比,主要具备以下的技术优点:
(1)通用性。本发明无需预先对待更新程序进行特殊的改动,通过跟踪工具来修改运行中的程序,仅需要修改原程序中部分二进制跳转,而不需要特定编译器的帮助,提高了软件动态升级方法的通用性;
(2)实时性。本发明可以任意时刻在程序任意位置直接进行更新,无需等待程序运行到安全更新点,从而有效避免了调用中的函数无法更新的情况,同时当多线程程序进行更新时,也不必等待全部线程到达安全更新点后再进行更新;
(3)多线程安全性。本发明通过中间辅助函数和转换函数,使多线程程序能在同一时刻完成动态更新,在保证多线程更新的安全性的同时,也确保了多线程更新的数据一致性,进一步避免了使用安全更新点后发生死锁带来的更新不安全问题,也避免了新旧版本数据的不一致问题;
(4)用户可操作性。本发明方法重要的工作都在更新之前完成,更新时的工作都是由监控程序完成,无需用户协助。而那些由用户来判断更新时机或由用户设定更新条件的传统动态更新方法,则需要用户掌握大量动态升级相关的知识,因此本发明方法无需用户掌握任何动态升级相关的知识即可完成软件动态升级;
(5)可靠性。软件动态更新出错时,很多动态升级系统无法恢复到更新前的状态,尤其是更新失败导致进程崩溃的时候,这无疑降低了软件动态更新的可靠性,但通过本发明的方法可以使更新程序出现错误时快速回滚,以保证软件动态升级的可靠性;
(6)低开销。原来的软件动态升级方法在程序更新过程中往往有过多的安全更新点和大量代码修改工作,如堆栈重构等。而本发明的绝大部分工作都是在更新之前进行,在更新过程中只需很少的工作量,从而大大提高了更新的效率,降低了更新开销;
附图说明
图1是本发明基于中间辅助函数的软件动态升级方法的流程图;
图2为本发明基于中间辅助函数的软件动态升级系统框图;
图3为安全更新指令集合的原理示意图;
图4为中间辅助函数的构成原理示意图;
图5(a)和(b)为本发明方法中回滚工作流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明的整体思路在于,开发者根据新旧版本的源代码生成包含新函数和中间辅助函数的初级动态升级补丁,利用中间辅助函数解决传统多线程动态更新需要修改旧版本源码或者使用特定编译器来改造旧版本源码的问题。然后在更新时加载动态升级补丁,暂停所有线程,通过修改函数入口地址实现间接跳转来实现更新未处于函数调用栈的待更新函数。通过修改函数当前执行指令下一条指令使其跳转入中间辅助函数,通过运行中间辅助函数来完成代码和变量的更新处于函数调用栈的待更新函数。
如图1所示,本发明基于异步检查点的多线程软件动态升级方法包括以下步骤:
(1)获取旧版本代码源文件以及新版本代码源文件,通过通用中间语言CIL(Common Intermediate Language)的合并功能对其分别整合,得到整合后的旧版本代码源文件和新版本代码源文件;
(2)通过在线升级系统Polus(Powerful Live Updating System)的动态补丁生成工具将整合后的旧版本代码源文件和新版本的代码源文件进行对比,生成初级动态升级补丁;
(3)静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时根据待更新函数,生成中间辅助函数;本步骤具体包括以下子步骤:
(3-1)分析待更新函数的语义,获取并记录待更新函数的安全更新指令集合。安全更新指令集合是指若一段指令中任意一条指令前的所有执行路径都能保证新旧版本函数语义一致,则该段指令为安全更新指令集合。在本发明方法中,本发明的生成工具判断函数语义一致是指新旧函数执行路径上只有代码的顺序和版本不一致,其余全部相同。将所有待更新函数的全部安全更新指令集合记录下来,生成函数语义映射表。开发者也可以根据自身的需要修改函数语义映射表的安全更新指令集合。
(3-2)将待更新函数的参数作为中间辅助函数的参数,构造生成中间辅助函数。中间辅助函数包含控制内容、待更新函数新版本内容和待更新函数旧版本内容。
其中,所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;
也就是说控制内容首先将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,然后从栈中获得运行时线程当前执行地址,查询步骤(3-1)中的函数语义映射表,预计来判断运行时线程当前指令是否处于安全更新指令集合中,若是,可以通过步骤(3-1)中的函数语义映射表得到当前执行的地址在待更新函数新版本内容对应的位置,然后跳转到该位置,即在运行时线程当前指令进入安全更新指令集合中(包括顺序进入,通过分支、循环、跳转进入)的语句后加入跳转语句,使其跳转到中间辅助函数中待更新函数新版本内容的对应位置。;否则,跳转入待更新函数旧版本内容对应位置;
(3-3)对所述中间辅助函数的待更新函数旧版本内容进行修改,使其利用转换函数访问新版本静态变量、局部变量和参数。也就是说,对待更新函数旧版本内容进行改造,将待更新函数旧版本内容访问的待更新数据都使用转换函数(即适配器函数)间接访问。中间辅助函数中待更新函数旧版本内容则是通过读写适配函数的方式来访问新版本数据(包括静态变量、局部变量和参数)。
(4)根据用户的初始化请求,将步骤(2)中生成的初级动态升级补丁注入到正在运行的待更新程序中;
(5)注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
(6)根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;本步骤包括下列子步骤:
(6-1)根据用户发出的更新请求,暂停所有与更新相关的进程,将所有的旧版本待更新静态变量转换成新版本静态变量;对于静态变量的更新,通过一般类型,指针类型,数组类型三种不同的类型分别实现三种不同的转换函数,将旧版本待更新静态变量转换成新版本静态变量;
(6-2)查看待更新函数是否位于函数调用栈,若是,根据步骤(3)的函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程当前执行位置入栈,然后跳转到步骤(3)中生成中间辅助函数的入口地址,利用中间辅助函数进行更新;否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方法进行更新。
使用修改函数入口地址的方法更新未处于函数调用栈的待更新函数。当程序运行到待更新函数时,直接跳转到对应的新版本函数进行更新。具体而言,将待更新函数开头的二进制代码替换成jmp指令,使执行路径跳转到新版本函数,函数的参数和局部变量则采用重定向的方式映射到新版本函数的内存地址。
对处于函数调用栈的待更新函数,修改线程当前执行位置后的下一条执行指令,使其跳转到中间辅助函数来完成更新正在调用的函数。具体将待更新函数当前执行位置下一条(一般情况为顺序下一条,如果当前指令为跳转指令,则为跳转的目标地址)的二进制指令替换成jmp指令,使执行路径跳转到中间辅助函数。函数的参数和局部变量则采用重定向的方式映射到中间辅助函数的内存地址,同时将线程当前执行位置记录到中间辅助函数的堆栈中。
(7)恢复因更新而被暂停的进程,更新过程结束。
本发明方法还包括:在更新过程中发生错误时,通过监控程序使其回滚到更新前的状态。具体包括:
(1)在程序更新前保存待更新程序的检查点;
(2)在更新过程中,通过监控程序实时监控待更新程序状态,若待更新程序发生异常时,使用所述检查点进行回滚,将其还原到更新之前的状态。
图2所示为与上述方法对应的一种基于中间辅助函数的软件动态升级系统,所述系统包括:
整合模块,用于获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;
补丁生成模块,用于通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;
分析模块,用于静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时用于根据待更新函数,生成中间辅助函数;
所述分析模块具体包括:
第一分析生成单元,用于分析待更新函数的语义,获取并记录待更新函数的安全更新指令集合,生成函数语义映射表;其中,安全更新指令集合是指若一段指令中任意一条指令前的所有执行路径都能保证新旧版本语义一致,则该段指令为安全更新指令集合。
第二分析生成单元,用于将待更新函数的参数作为中间辅助函数的参数,构造生成中间辅助函数,所述中间辅助函数包含控制内容、待更新函数新版本内容和待更新函数旧版本内容;其中,
所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;
修改单元,用于对所述中间辅助函数的待更新函数旧版本内容进行修改,使其利用转换函数访问新版本数据。
注入模块,用于根据用户的初始化请求,将生成的初级动态升级补丁注入到正在运行的待更新程序中;
获取模块,用于在注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
更新模块,用于根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;
所述更新模块具体包括:
暂停单元,用于根据用户发出的更新请求,暂停所有与更新相关的进程;
静态变量更新单元,用于将所有的旧版本待更新静态变量转换成新版本静态变量;
函数更新单元,用于查看待更新函数是否位于函数调用栈,若是,根据所述函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程当前执行位置入栈,然后跳转到生成中间辅助函数的入口地址;否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方法进行更新。
恢复模块,用于恢复因更新而被暂停的进程,更新过程结束。
作为进一步优选的,所述系统还包括:
存储模块,用于在程序更新前保存待更新程序的检查点;
监控模块,用于在更新过程中,通过监控程序实时监控待更新程序状态;
回滚模块,用于在待更新程序发生异常时,使用所述存储模块中保存的检查点进行回滚,将所述待更新程序还原到更新之前的状态。
如图3所示,在更新过程中,一些更新位置是能够保证新函数中有与之对应安全更新的位置,如更新点a,c。但是在一些更新位置,新函数中是没有与之对应的安全更新位置的,例如更新点b。如果在非安全更新位置强行更新的话,会导致函数fun会执行两次,从而导致各种不可知的错误。经过分析,当更新点之前所有分支的新旧版本函数执行路径都语义一致时,此时更新时不会发生因为语句遗漏执行或者多余执行导致的更新不安全行为。在实际中,安全更新位置往往是连续的,所以可以把其变成范围的方式记录下来,形成函数语义映射表。这样就可以通过查询函数语义映射表,可以判断一个运行位置是否为安全更新位置,也可以通过查询函数语义映射表获得任意一个安全位置对应的跳转位置。
中间辅助函数的构造如图4所示,首先将旧版本局部变量和参数转换成新版本局部变量和参数,然后从栈中获得函数当前执行地址,查询步骤(3-1)中的函数语义映射表,来判断线程当前执行地址的指令是否处于安全更新指令集合,若函数当前执行地址的指令处于安全更新指令集合,可以通过步骤(3-1)中的函数语义映射表得到函数当前执行的地址在中间辅助函数中待更新函数新版本内容对应的位置,然后跳转到该位置。若函数当前执行地址不处于安全更新指令集合,则跳转入中间辅助函数中待更新函数旧版本内容对应位置。中间辅助函数接下来的部分是完整的新版本的待更新函数和经过改造后的旧版本待更新函数。待更新函数旧版本内容进入安全更新指令集合(包括顺序进入,通过分支、循环、跳转进入)的语句后加入跳转语句,使其跳转到中间辅助函数待更新函数新版本内容对应部分。在更新过程中,假设函数更新情况如图2所示,函数当前执行语句statement4时,跳转到中间辅助函数后,查询语句statement4为非安全位置,所以跳转到待更新函数旧版本内容继续执行,当在待更新函数旧版本内容执行到statement6位置时进入了安全更新范围,从而跳转到待更新函数新版本内容,完成了该函数的更新工作。中间函数中待更新函数旧版本内容访问的待更新数据都使用转换函数间接访问,这样保证多线程程序中所有线程都访问同一份数据,从而保证多线程程序数据一致性
回滚的步骤示意图如图5所示,图5(a)表示更新程序工作步骤,图5(b)表示监控程序工作步骤。更新前,监控程序保存待更新程序的检查点。更新过程中,有两种机制来发现异常,一种是由更新程序出错通知监控程序进行回滚。可是,若更新错误为严重错误(进程崩溃)时,更新程序就无法通知监控程序更新过程发生异常。所以本发明提供另一种机制:由监控程序定时获取更新程序的状态,若发现异常便进行回滚。回滚过程是使用事先保存的检查点将程序还原到更新前的状态。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (6)

1.一种基于中间辅助函数的软件动态升级方法,其特征在于,所述方法包括:
(1)获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;
(2)通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;
(3)静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时根据待更新函数,生成中间辅助函数;
(4)根据用户的初始化请求,将步骤(2)中生成的初级动态升级补丁注入到正在运行的待更新程序中;
(5)注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
(6)根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;
(7)恢复因更新而被暂停的进程,更新过程结束;
所述步骤(3)具体包括:
(3-1)分析待更新函数的语义,获取并记录待更新函数的安全更新指令集合,生成函数语义映射表;
(3-2)将待更新函数的参数作为中间辅助函数的参数,构造生成中间辅助函数,所述中间辅助函数包含控制内容、待更新函数新版本内容和待更新函数旧版本内容;其中,
所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;
(3-3)对所述中间辅助函数的待更新函数旧版本内容进行修改,使其利用转换函数访问新版本数据;
若一段指令中任意一条指令前的所有执行路径都能保证新旧版本语义一致,则该段指令为安全更新指令集合。
2.根据权利要求1所述的方法,其特征在于,所述步骤(6)具体包括:
(6-1)根据用户发出的更新请求,暂停所有与更新相关的进程,将所有的旧版本待更新静态变量转换成新版本静态变量;
(6-2)查看待更新函数是否位于函数调用栈,若是,根据步骤(3)的函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程当前执行位置入栈,然后跳转到步骤(3)中生成中间辅助函数的入口地址;否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方法进行更新。
3.如权利要求1-2任一项所述的方法,其特征在于,所述方法还包括:
(1)在程序更新前保存待更新程序的检查点;
(2)在更新过程中,通过监控程序实时监控待更新程序状态,若待更新程序发生异常时,使用所述检查点进行回滚,将其还原到更新之前的状态。
4.一种基于中间辅助函数的软件动态升级系统,其特征在于,所述系统包括:
整合模块,用于获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;
补丁生成模块,用于通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;
分析模块,用于静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时用于根据待更新函数,生成中间辅助函数;
注入模块,用于根据用户的初始化请求,将生成的初级动态升级补丁注入到正在运行的待更新程序中;
获取模块,用于在注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
更新模块,用于根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;
恢复模块,用于恢复因更新而被暂停的进程,更新过程结束;
所述分析模块具体包括:
第一分析生成单元,用于分析待更新函数的语义,获取并记录待更新函数的安全更新指令集合,生成函数语义映射表;
第二分析生成单元,用于将待更新函数的参数作为中间辅助函数的参数,构造生成中间辅助函数,所述中间辅助函数包含控制内容、待更新函数新版本内容和待更新函数旧版本内容;其中,
所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;
修改单元,用于对所述中间辅助函数的待更新函数旧版本内容进行修改,使其利用转换函数访问新版本数据;
若一段指令中任意一条指令前的所有执行路径都能保证新旧版本语义一致,则该段指令为安全更新指令集合。
5.根据权利要求4所述的系统,其特征在于,所述更新模块具体包括:
暂停单元,用于根据用户发出的更新请求,暂停所有与更新相关的进程;
静态变量更新单元,用于将所有的旧版本待更新静态变量转换成新版本静态变量;
函数更新单元,用于查看待更新函数是否位于函数调用栈,若是,根据所述函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程当前执行位置入栈,然后跳转到生成中间辅助函数的入口地址;否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方法进行更新。
6.如权利要求4-5任一项所述的系统,其特征在于,所述系统还包括:
存储模块,用于在程序更新前保存待更新程序的检查点;
监控模块,用于在更新过程中,通过监控程序实时监控待更新程序状态;
回滚模块,用于在待更新程序发生异常时,使用所述存储模块中保存的检查点进行回滚,将所述待更新程序还原到更新之前的状态。
CN201610039757.0A 2016-01-21 2016-01-21 一种基于中间辅助函数的软件动态升级方法及系统 Active CN105528231B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610039757.0A CN105528231B (zh) 2016-01-21 2016-01-21 一种基于中间辅助函数的软件动态升级方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610039757.0A CN105528231B (zh) 2016-01-21 2016-01-21 一种基于中间辅助函数的软件动态升级方法及系统

Publications (2)

Publication Number Publication Date
CN105528231A CN105528231A (zh) 2016-04-27
CN105528231B true CN105528231B (zh) 2019-03-05

Family

ID=55770478

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610039757.0A Active CN105528231B (zh) 2016-01-21 2016-01-21 一种基于中间辅助函数的软件动态升级方法及系统

Country Status (1)

Country Link
CN (1) CN105528231B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106980515B (zh) * 2016-10-28 2020-04-14 阿里巴巴集团控股有限公司 一种应用升级方法及装置
CN108134763B (zh) * 2016-12-01 2021-07-13 南宁富桂精密工业有限公司 攻击应对方法及系统
CN107092496A (zh) * 2016-12-28 2017-08-25 北京小度信息科技有限公司 一种应用软件的升级方法及装置
CN111124444B (zh) * 2018-11-01 2023-12-19 百度在线网络技术(北京)有限公司 代码注入的方法及其装置、计算机程序产品、存储介质
CN109445823A (zh) * 2018-11-02 2019-03-08 长虹美菱股份有限公司 一种mcu固件快速升级方法
CN112114848A (zh) * 2020-09-11 2020-12-22 北京达佳互联信息技术有限公司 驱动更新方法、装置、系统、电子设备及存储介质
CN112764788B (zh) * 2021-01-19 2023-06-16 南京大学 基于程序源码切片重组的软件动态更新热补丁合成方法
CN113204356B (zh) * 2021-06-02 2023-11-07 吉林大学 一种面向车载嵌入式设备的应用程序动态更新方法
CN113608846A (zh) * 2021-07-20 2021-11-05 阿里巴巴(中国)有限公司 进程栈的数据检查方法、装置及设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101799763A (zh) * 2009-02-10 2010-08-11 华为技术有限公司 内核在线补丁的方法、装置和系统
US8793662B2 (en) * 2008-03-25 2014-07-29 Microsoft Corporation Runtime code hooking for print driver and functionality testing
CN103984582A (zh) * 2014-06-04 2014-08-13 网易(杭州)网络有限公司 一种热更新方法和装置
CN104111848A (zh) * 2014-06-27 2014-10-22 华中科技大学 一种基于异步检查点的多线程软件动态升级方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8793662B2 (en) * 2008-03-25 2014-07-29 Microsoft Corporation Runtime code hooking for print driver and functionality testing
CN101799763A (zh) * 2009-02-10 2010-08-11 华为技术有限公司 内核在线补丁的方法、装置和系统
CN103984582A (zh) * 2014-06-04 2014-08-13 网易(杭州)网络有限公司 一种热更新方法和装置
CN104111848A (zh) * 2014-06-27 2014-10-22 华中科技大学 一种基于异步检查点的多线程软件动态升级方法

Also Published As

Publication number Publication date
CN105528231A (zh) 2016-04-27

Similar Documents

Publication Publication Date Title
CN105528231B (zh) 一种基于中间辅助函数的软件动态升级方法及系统
Lawall et al. Coccinelle: 10 years of automated evolution in the Linux kernel
EP4004738B1 (en) Time-travel debugging with hot code replacement
CN104111848B (zh) 一种基于异步检查点的多线程软件动态升级方法
Padioleau et al. Documenting and automating collateral evolutions in Linux device drivers
US8689191B2 (en) Correct refactoring of concurrent software
US20080244544A1 (en) Using hardware checkpoints to support software based speculation
US8423970B2 (en) Method, computer program product, and hardware product for handling breakpoints in an asynchronous debug model
CN101446918B (zh) 一种实现用户态调试器调试单个函数的方法及系统
Liu et al. FCatch: Automatically detecting time-of-fault bugs in cloud systems
WO2000029937A2 (en) Computer system, computer-readable storage medium and method of operating same, and method of operating that system
WO2015117434A1 (zh) 补丁的制作方法及装置、补丁的激活方法及装置
CN100349131C (zh) 一种应用程序故障的定位方法
CN103077111A (zh) 一种持续集成失败用例的定位方法及系统
Kim et al. Dual execution for on the fly fine grained execution comparison
Visan et al. URDB: a universal reversible debugger based on decomposing debugging histories
US9740597B2 (en) Transactional execution of native methods
Spall et al. Build scripts with perfect dependencies
Zhao et al. Synthesizing object state transformers for dynamic software updates
US20100229167A1 (en) Testing operating system isolation using error injection
Desnoyers et al. Multi-core systems modeling for formal verification of parallel algorithms
Huang et al. {PYLIVE}:{On-the-Fly} Code Change for Python-based Online Services
Bradbury et al. Defining a catalog of programming anti-patterns for concurrent java
Ma et al. Efficient Scheduler Live Update for Linux Kernel with Modularization
Baur Instrumenting Java bytecode to replay execution traces of multithreaded programs

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant