函数调用关系确定方法、热补丁升级方法及装置的制作方法

文档序号:6384298阅读:346来源:国知局
专利名称:函数调用关系确定方法、热补丁升级方法及装置的制作方法
技术领域
本发明实施例涉及通信技术,尤其涉及一种函数调用关系确定方法、热补丁升级方法及装置。
背景技术
系统中运行的程序可能存在一些漏洞或安全隐患,补丁是一种用于修复这些问题的程序。常规情况下,如果要使用一个新的补丁就需要将程序打上补丁后编译,安装,然后重新启动系统。对一些关键性的业务,重新启动系统会造成业务的中断。热补丁技术就是针对这种需求设计的,它可以实现在不重启系统的情况下对系统打补丁。在热补丁项目中,寻找打入补丁的时机,确保系统稳定运行是一项关键技术。热补丁的特点是不重启系统应用补丁,如果补丁对一个尚未完成调用的函数进行了修改,待系统继续执行该函数的剩余部分时就有可能发生系统崩溃。安全性检测的目的是确保打入补丁时,系统所有任务都没有调用补丁所涉及的函数。现在通行的安全性检测方法是解析系统的内核栈,得到当前任务所调用的函数。将分析结果与补丁修改的函数列表进行对比,如果存在冲突就放弃这次补丁升级。过一定的时间后再次尝试这种安全性检测,直到冲突消失,安全地使用补丁代码。在实现本发明实施例的过程中,发明人发现现有技术中,针对系统在调用函数时不向栈中压入父函数栈帧起始地址的情况,并没有可以较为精确确定函数调用关系的方法,进一步会导致热补丁升级的安全性无法保证或者热补丁升级效率低。

发明内容
本发明实施例提供一种函数调用关系确定方法及装置,以实现较为精确确定函数调用关系。本发明实施例还提供一种热补丁升级方法及装置,用以保证热补丁升级的安全性,进而提高热补丁升级的效率。第一方面,提供一种函数调用关系确定方法,包括若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找,所述栈中包括所述至少一个返回地址;每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的所述被调用的该函数的父函数为所述返回地址对应的函数。在第一方面的第一种可能的实现方式中,所述记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示所述函数名的前一个函数名对应的函数的父函数,也表示所述函数名的后一个函数名对应的函数的子函数;所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的处于所述被调用的函数之后的所有函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中所述被调用的函数的函数名之后的位置上,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的所述被调用的函数的函数名以及处于所述被调用的函数的函数名之前的所有函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名作为所述被调用的该函数的父函数的函数名被记录在所述被调用的函数的函数名的后面;其中,所述对所述栈中的至少一个返回地址依次进行查找,包括若所述第二记录表中没有记录所述被调用的函数的函数名,则查找所述栈中的下一个返回地址。根据第一方面,在第一方面的第二种可能的实现方式中,所述记录表包括第一记录表和第二记录表;其中,所述第一记录表或第二记录表包括所述被调用的函数的函数名、所述被调用的函数的子函数的函数名以及所述被调用的该函数的父函数的函数名;所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的所述被调用的该函数的父函数的函数名,以及所述被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的函数调用关系中的所述被调用的函数的函数名、所述被调用的函数的子函数的函数名、所述被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名为所述被调用的该函数的父函数的函数名;其中,所述对所述栈中的至少一个返回地址依次进行查找,包括若所述第二记录表中没有记录所述被调用的函数的函数名,则查找所述栈中的下一个返回地址。
结合第一方面的第一种或第二种可能的实现方式,在第一方面的第三种可能的实现方式中,所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,还包括若所述操作码的寻址类型为直接寻址,则将所述返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在所述第二记录表中。结合第一方面的第一种、第二种或第三种可能的实现方式,在第一方面的第四种可能的实现方式中,所述方法还包括若查找完所述栈,且所述第二记录表不为空,则将所述第二记录表中记录的函数名添加到所述第一记录表中,并将所述第二记录表中记录的函数名清空。结合第一方面的第一种、第二种或第三种可能的实现方式,在第一方面的第五种可能的实现方式中,所述对所述栈中的至少一个返回地址依次进行查找之前,所述方法还包括确定所述系统调用的最后一个函数的函数名,将所述被调用的最后一个函数的函数名记录在初始状态为空的第一记录表中。结合第一方面的第一种、第二种、第三种、第四种或第五种可能的实现方式,在第一方面的第六种可能的实现方式中,所述根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,包括将所述当前查找到的返回地址减去预设字节数,得到查找地址,从所述查找地址开始读取所述预设字节数的数据,根据所述数据确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码。结合第一方面的第一种、第二种、第三种、第四种、第五种或第六种可能的实现方式,在第一方面的第七种可能的实现方式中,所述方法还包括若判断出所述系统在调用函数时,向所述栈中压入被调用的所述函数的父函数的栈帧起始地址,则根据所述栈中的父函数的栈帧起始地址确定所述函数调用关系。第二方面,提供一种热补丁升级方法,包括若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找,所述栈中包括所述至少一个返回地址;每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的所述被调用的该函数的父函数为所述返回地址对应的函数。对比修正后的记录表中记录的函数调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级。在第二方面的第一种可能的实现方式中,所述记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示所述函数名的前一个函数名对应的函数的父函数,也表示所述函数名的后一个函数名对应的函数的子函数;所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的处于所述被调用的函数之后的所有函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中所述被调用的函数的函数名之后的位置上,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的所述被调用的函数的函数名以及处于所述被调用的函数的函数名之前的所有函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名作为所述被调用的该函数的父函数的函数名被记录在所述被调用的函数的函数名的后面;其中,所述对所述栈中的至少一个返回地址依次进行查找,包括若所述第二记录表中没有记录所述被调用的函数的函数名,则查找所述栈中的下一个返回地址。根据第二方面,在第二方面的第二种可能的实现方式中,所述记录表包括第一记录表和第二记录表;其中,所述第一记录表或第二记录表包括所述被调用的函数的函数名、所述被调用的函数的子函数的函数名以及所述被调用的该函数的父函数的函数名;所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的所述被调用的该函数的父函数的函数名,以及所述被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的函数调用关系中的所述被调用的函数的函数名、所述被调用的函数的子函数的函数名、与所述被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名为所述被调用的该函数的父函数的函数名;其中,所述对所述栈中的至少一个返回地址依次进行查找,包括若所述第二记录表中没有记录所述被调用的函数的函数名,则查找所述栈中的下一个返回地址。结合第二方面的第一种或第二种可能的实现方式,在第二方面的第三种可能的实现方式中,所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,还包括若所述操作码的寻址类型为直接寻址,则将所述返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在所述第二记录表中。结合第二方面的第一种、第二种或第三种可能的实现方式,在第二方面的第四种可能的实现方式中,所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,还包括若查找完所述栈,且所述第二记录表不为空,则将所述第二记录表中记录的函数名添加到所述第一记录表中,并将所述第二记录表中记录的函数名清空。结合第二方面的第一种、第二种或第三种可能的实现方式,在第二方面的第五种可能的实现方式中,所述方法还包括确定所述系统调用的最后一个函数的函数名,将所述最后一个函数的函数名记录在初始状态为空的第一记录表中。结合第二方面的第一种、第二种、第三种、第四种或第五种可能的实现方式,在第二方面的第六种可能的实现方式中,所述根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,包括将所述当前查找到的返回地址减去预设字节数,得到查找地址,从所述查找地址开始读取所述预设字节数的数据,根据所述数据确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码。结合第二方面的第一种、第二种、第三种、第四种、第五种或第六种可能的实现方式,在第二方面的第七种可能的实现方式中,所述方法还包括若判断出系统在调用函数时,向所述栈中压入被调用的所述函数的父函数的栈帧起始地址,则根据所述栈中的父函数的栈帧起始地址确定所述函数调用关系。第三方面,提供一种函数调用关系确定装置,包括查找模块,用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找,所述栈中包括所述至少一个返回地址;处理模块,与所述查找模块连接,用于每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的所述被调用的该函数的父函数为所述返回地址对应的函数。在第三方面的第一种可能的实现方式中,所述记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示所述函数名的前一个函数名对应的函数的父函数,也表示所述函数名的后一个函数名对应的函数的子函数;所述处理模块具体用于每次查找到所述至少一个返回地址中的一个返回地址时,根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;
若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的处于所述被调用的函数之后的所有函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中所述被调用的函数的函数名之后的位置上,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的所述被调用的函数的函数名以及处于所述被调用的函数的函数名之前的所有函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名作为所述被调用的该函数的父函数的函数名被记录在所述被调用的函数的函数名的后面;其中,所述查找模块具体用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找的过程中,若所述第二记录表中没有记录所述被调用的函数的函数名,则查找所述栈中的下一个返回地址。根据第三方面,在第三方面的第二种可能的实现方式中,所述记录表包括第一记录表和第二记录表;其中,所述第一记录表或第二记录表包括所述被调用的函数的函数名、所述被调用的函数的子函数的函数名以及所述被调用的该函数的父函数的函数名;所述处理模块具体用于每次查找到所述至少一个返回地址中的一个返回地址时,根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的所述被调用的该函数的父函数的函数名,以及所述被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的函数调用关系中的所述被调用的函数的函数名、所述被调用的函数的子函数的函数名、与所述被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名为所述被调用的该函数的父函数的函数名;其中,所述查找模块具体用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找的过程中,若所述第二记录表中没有记录所述被调用的函数的函数名,则查找所述栈中的下一个返回地址。结合第三方面的第一种或第二种可能的实现方式,在第三方面的第三种可能的实现方式中,所述处理模块,还用于若所述操作码的寻址类型为直接寻址,则将所述返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在所述第二记录表中。结合第三方面的第一种、第二种或第三种可能的实现方式,在第三方面的第四种可能的实现方式中,所述处理模块,还用于若查找完所述栈,且所述第二记录表不为空,则将所述第二记录表中的内容添加到所述第一记录表中,并将所述第二记录表中记录的函数名清空。结合第三方面的第一种、第二种或第三种可能的实现方式,在第三方面的第五种可能的实现方式中,所述查找模块,还用于在所述对所述栈中的至少一个返回地址依次进行查找之前,确定所述函数调用中调用的最后一个函数的函数名,将所述最后一个函数的函数名记录在初始状态为空的第一记录表中。结合第三方面的第一种、第二种、第三种、第四种或第五种可能的实现方式,在第三方面的第六种可能的实现方式中,所述处理模块,具体用于将所述当前查找到的返回地址减去预设字节数,得到查找地址,从所述查找地址开始读取所述预设字节数的数据,根据所述数据确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码。结合第三方面的第一种、第二种、第三种、第四种、第五种或第六种可能的实现方式,在第三方面的第七种可能的实现方式中,所述处理模块,还用于若判断出系统在调用函数时,向所述栈中压入被调用的所述函数的父函数的栈帧起始地址,则根据所述栈中的父函数的栈帧起始地址确定所述函数调用关系。第四方面,提供一种计算机系统,包括总线;与所述总线相连的处理器;与所述总线相连的存储器;其中,所述处理器通过所述总线,调用所述存储器中存储的代码,以用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找,所述栈中包括所述至少一个返回地址;每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的所述被调用的该函数的父函数为所述返回地址对应的函数。在第四方面的第一种可能的实现方式中,所述处理器,还用于若判断出所述系统在调用函数时,向所述栈中压入被调用的所述函数的父函数的栈帧起始地址,则根据所述栈中的父函数的栈帧起始地址确定所述函数调用关系。结合第四方面或者第四方面的第一种可能的实现方式,在第四方面的第二种可能的实现方式中,所述处理器,还用于对比修正后的记录表中记录的函数调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级。本发明实施例提供的函数调用关系确定方法及装置,针对系统在调用函数时,未向栈中压入被调用的该函数的父函数的栈帧起始地址的情况,对该栈中的至少一个返回地址依次进行查找,每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的该函数的父函数为返回地址对应的函数,可见,通过逐步修正了记录表中原先记录的不准确的函数调用关系中的父函数,从而提高了函数调用关系的准确性,进而可以根据修正后记录表中记录的函数名较为精确确定函数调用关系。本实施例提供的热补丁升级方法及装置,通过对函数调用关系的较为精确确定,并对比确定的函数的调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级,由于函数调用关系是较为精确的,可以一定程度上避免由于函数调用关系的不准确而导致的热补丁升级不安全或热补丁升级效率低的问题,从而保证热补丁升级的安全性并提高热补丁升级的效率。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本发明提供的函数调用关系确定方法实施例一的流程图;图2为本发明提供的函数调用关系确定方法实施例二的流程图。图3为利用重定位原理确定函数调用的被调用的函数的函数名的示意图;图4为本发明提供的函数调用关系确定方法实施例三的流程图;图5为本发明提供的热补丁升级方法实施例一的流程图;图6为热补丁升级的整体流程示意图;图7为本发明提供的热补丁升级方法实施例二的流程图;图8为本发明提供的热补丁升级方法实施例三的流程图;图9为本发明提供的函数调用关系确定装置实施例一的结构示意图;图10为本发明提供的计算机系统实施例一的结构示意图。
具体实施例方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。图1为本发明提供的函数调用关系确定方法实施例一的流程图,如图1所示,本实施例提供的函数调用关系确定方法可以应用于通过栈分析函数调用关系的过程,该栈可以为内核栈、中断栈或异常栈等,本实施例提供的函数调用关系确定方法包括步骤110、若判断出系统在调用函数时,未向栈中压入被调用的该函数的父函数的栈帧起始地址,则对栈中的至少一个返回地址依次进行查找,该栈中包括至少一个返回地址。
需要说明的是,该栈可以为内核栈、中断栈或异常栈等。这里的返回地址可以理解为父函数在调用子函数时,将该父函数中该子函数所在代码的下一条代码的地址作为返回地址。这里的栈帧起始地址即栈空间的起始地址。具体来说,系统可以为LINUX系统也可以为Windows系统,以LINUX系统为例,通过设置编译选项C0NFIG_FRAME_P0INTER,可以选择系统在调用函数时是否往栈中压入被调用的该函数的父函数的栈帧起始地址。举例来说,可以通过读取具体函数的代码段起始部分的数据,根据汇编语言的特征机器码来判断系统在函数调用时是否会往栈中压入父函数的栈帧起始地址。可选的,本实施例中函数调用关系确定方法还包括若判断出系统在调用函数时,向栈中压入被调用的该函数的父函数的栈帧起始地址,则根据栈中的多个父函数的栈帧起始地址确定函数的调用关系。具体来说,在函数调用关系中,父函数和子函数是相对而言的,例如“A调用B,B调用C”可以指A为B的父函数,B为A的子函数;B为C的父函数,C为B的子函数。对于系统在调用函数时往栈中压入被调用的该函数的父函数栈帧的起始地址的情况,当父函数调用一个函数时,系统首先会向栈中压入一个返回地址,然后会压入父函数的栈帧起始地址,通过系统压入栈中的栈帧起始地址可以直接计算出父函数执行时所使用的栈帧长度,这样就能够比较准确地推算出任务的函数调用关系。然而,对于系统在函数调用时未向栈中压入父函数的栈帧起始地址的情况,则对栈中的至少一个返回地址依次进行查找,该栈中包括至少一个返回地址,父函数在调用子函数时会把父函数中子函数所在代码的下一条代码的地址作为返回地址压入栈中。进一步的,由这些返回地址可以推算出函数名。步骤120、每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的该函数的父函数为返回地址对应的函数。具体来说,返回地址对应的函数可以是引起查找到的返回地址入栈的函数调用关系中的父函数,依次确定查找到的至少一个返回地址对应的函数可以按照从栈低地址向高地址方向依次确定查找,确定至少一个返回地址对应的函数的方法可以是根据返回地址的数据通过查找符号表计算出返回地址对应的函数。举例来说,根据至少一个返回地址对应的函数对记录表中记录的函数调用关系进行修正的方法具体可以是根据当前查找到的返回地址确定引起该当前查找到的返回地址入栈的、表示函数调用的操作码,若操作码的寻址类型为间接寻址,则根据操作码确定被调用的函数,若被调用的函数的函数名和任务调用的最后一个确定的函数的函数名相同,则认为找到了一个确定的函数调用关系,并将返回地址对应的函数的函数名记录在一个记录表中;继续查找栈中的下一个返回地址,同样根据当前查找到的返回地址确定引起该当前查找到的返回地址入栈的、表示函数调用的操作码,若操作码的寻址类型为间接寻址,则根据操作码确定被调用的函数,若上述记录表中记录有被调用的函数的函数名,则将上述记录表中记录的被调用的该函数的父函数的函数名删除,并将返回地址对应的函数的函数名记录在上述记录表中,依此对栈内返回地址进行遍历直至栈顶。具体来说,记录表用来存放可能存在调用关系的函数的函数名,其可以是任意可用来存放数据的数据结构,例如可以是链表,本发明并不以此为限制。经上述步骤查找修正后的记录表中的函数名为被系统所调用的、存在调用关系的函数。本实施例提供的函数调用关系确定方法,针对系统在调用函数时,未向栈中压入被调用的函数的父函数的栈帧起始地址的情况,对该栈中的至少一个返回地址依次进行查找,每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的函数的父函数为返回地址对应的函数,可见,通过逐步修正了记录表中原先记录的不准确的函数调用关系中的父函数,从而提高了函数调用关系的准确性,进而可以根据修正后记录表中记录的函数名较为精确确定函数调用关系。图2为本发明提供的函数调用关系确定方法实施例二的流程图,记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示函数名的前一个函数名对应的函数的父函数,也表示函数名的后一个函数名对应的函数的子函数,如图2所示,本实施例提供的函数调用关系确定方法中步骤210和图1所示实施例中的步骤110相同,本实施例提供的方法包括步骤210、若判断出系统在调用函数时,未向栈中压入被调用的该函数的父函数的栈帧起始地址,则对栈中的至少一个返回地址依次进行查找,栈中包括至少一个返回地址。步骤221、每次查找到至少一个返回地址中的一个返回地址时,根据当前查找到的返回地址确定引起当前查找到的返回地址入栈的、表示函数调用的操作码,若操作码的寻址类型为间接寻址,则根据操作码确定被调用的函数。具体来说,操作码可以是一条机器码,用于表示函数调用指令,如机器码“e8”代表汇编语言的“call”指令,“e9”代表汇编语言的“ jmp”指令,程序编译后会被转变成一系列操作码,由计算机执行,只有当前的函数调用采用的是间接寻址时才能通过分析操作码确定被调用的函数的函数名。在一种实现方式下,根据当前查找到的返回地址确定引起当前查找到的返回地址入栈的、表示函数调用的操作码,具体为将当前查找到的返回地址减去预设字节数,生成查找地址,从查找地址开始读取预设字节数的数据,根据该数据确定引起当前查找到的返回地址入栈的、表示函数调用的操作码。举例来说,表示函数调用的操作码可以是0Xe8、0Xff、0X9a中的一种,可将当前查找到的返回地址减去7,生成查找地址,从该查找地址开始读取7个字节的数据,用读取的数据与上述三种表示函数调用的操作码的特定格式作比较,确定查找到的返回地址对应的表示函数调用的操作码,若可以匹配上其中任意一种,可以认为该返回地址可能是函数调用时压入栈内的返回地址。x86 64架构中的表示函数调用的操作码“0xe8”的类型为间接寻址,另外两种表示函数调用的操作码“Oxff”和“0x9a”的类型为直接寻址。若表示函数调用的操作码的寻址类型为间接寻址,则可以根据表示函数调用的操作码使用重定位原理确定被调用的函数,被调用的函数可能是函数调用关系中被调用的函数,需通过本发明实施例后续步骤进一步匹配确定。
图3为利用重定位原理确定函数调用的被调用的函数的函数名的示意图,如图3所示为一条函数调用指令“call”的机器码格式,由表示函数调用的操作码“0xe8”和接下来四个字节的操作数组成整条指令。在x86_64架构下,通过操作码“0xe8”可以判定这是一条重定位类型为“R_X86_64_PC32”的函数调用语句“call xx”,“R_X86_64_PC32”类型重定位使用的公式是val=A+S_P。在这个公式中val是操作码“0xe8”后面四个字节的数据,A是一个与体系相关的偏移量,在x86_64架构下为_4,P是被重定位的位置,也就是“0xe8”后面第一个字节数据的地址,S是重定位后的位置,val、A、P这三项的值已知时,将公式变换为S=val+P-A可以计算出被调用的函数的地址,查找符号表可找到被调用的函数的函数名。步骤222、若第一记录表中记录有被调用的函数的函数名,则将第一记录表中记录的处于被调用的函数之后的所有函数名删除,将返回地址对应函数的函数名作为被调用的该函数的父函数的函数名记录在第一记录表中被调用的函数的函数名之后的位置上,并将第二记录表中记录的函数名清空。具体来说,本实施例中的记录表可以包括第一记录表和第二记录表,其中,第一记录表用于记录函数调用中调用的最后一个函数的函数名和确定存在调用关系的函数的函数名;第二记录表用于记录暂定为或假设为存在调用关系的函数的函数名,若第一记录表中记录有被调用的函数的函数名,则说明查找到的返回地址对应的函数为被调用的该函数的真正的父函数,而第一记录表中原先记录的被调用的该函数的父函数是不准确的,将不准确的父函数的函数名以及连带的与该不准确的父函数存在父亲关系的其他父函数的函数名从第一记录表中删除,由于已经确定查找到的返回地址对应的函数与被调用的函数存在调用关系,所以清空第二记录表。具体来说,第一记录表和第二记录表中记录的函数名中,每一个后面的函数名都被认为是前一个函数的父函数的函数名,所以将第一记录表中记录的处于被调用的函数之后的所有函数名删除,将返回地址对应函数的函数名作为被调用的该函数的父函数的函数名记录在第一记录表中被调用的函数的函数名之后的位置上,并将第二记录表中记录的函数名清空。步骤223、若第一记录表中没有记录被调用的函数的函数名,且第二记录表中记录有被调用的函数的函数名,则将第二记录表中记录的被调用的函数的函数名以及处于被调用的函数的函数名之前的所有函数名以及返回地址对应的函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空;其中返回地址对应的函数的函数名作为被调用的该函数的父函数的函数名被记录在被调用的函数的函数名的后面。其中,步骤210中的对栈中的至少一个返回地址依次进行查找,可以包括若第二记录表中没有记录被调用的函数的函数名,则查找栈中的下一个返回地址。较优的,在查找栈的时候一般都是从低地址开始往高地址处查找的。具体来说,若第二记录表中记录有被调用的函数的函数名,则确定查找到的返回地址对应的函数的函数名为被调用的函数后面的函数名,所以将返回地址对应函数的函数名作为被调用的该函数的父函数的函数名记录在第一记录表中被调用的函数的函数名之后的位置上,,并清空第二记录表。本实施例提供的函数调用关系确定方法,通过第一记录表和第二记录表的设置,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示函数名的前一个函数名对应的函数的父函数,也表示函数名的后一个函数名对应的函数的子函数,根据当前查找到的栈内返回地址确定被调用的函数和返回地址对应的函数,使用被调用的函数对第一记录表和第二记录表进行查找、匹配,根据查找、匹配的不同结果,采用不同方法对第一记录表和第二记录表进行修正,依此对栈进行重复查找直至将栈遍历,由于经过修正的第一记录表中删除了调用关系不准确的函数,从而得到的第一记录表中记录的函数调用关系(即被系统调用、存在调用关系的函数的函数名)的准确性得以提高。图4为本发明提供的函数调用关系确定方法实施例三的流程图,记录表包括第一记录表和第二记录表;其中,第一记录表或第二记录表包括被调用的函数的函数名、被调用的函数的子函数的函数名以及被调用的该函数的父函数的函数名,如图4所示,本实施例提供的函数调用关系确定方法中步骤410和图1所示实施例中的步骤110相同,本实施例提供的方法包括步骤410、若判断出系统在调用函数时,未向栈中压入被调用的该函数的父函数的栈帧起始地址,则对栈中的至少一个返回地址依次进行查找,栈中包括至少一个返回地址。步骤421、根据当前查找到的返回地址确定引起当前查找到的返回地址入栈的、表示函数调用的操作码,若操作码的寻址类型为间接寻址,则根据操作码确定被调用的函数。步骤422、若第一记录表中记录有被调用的函数的函数名,则将第一记录表中记录的被调用的该函数的父函数的函数名,以及被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将返回地址对应函数的函数名作为被调用的该函数的父函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空。具体来说,删除父函数的原因是在第一记录表中会记录大量不准确的父函数,这里的删除及下一句描述的添加过程可以找到真正的函数调用关系,即先删除所有不准确的父函数(一个或多个),然后记录一个正确的父函数。步骤423、若第一记录表中没有记录被调用的函数的函数名,且第二记录表中记录有被调用的函数的函数名,则将第二记录表中记录的函数调用关系中的被调用的函数的函数名、被调用的函数的子函数的函数名、被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及返回地址对应的函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空;其中返回地址对应的函数的函数名为被调用的该函数的父函数的函数名。其中,步骤410中的对栈中的至少一个返回地址依次进行查找,可以包括若第二记录表中没有记录被调用的函数的函数名,则查找栈中的下一个返回地址。较优的,在分析栈的时候一般都是从低地址开始往高地址处分析的,子函数的返回地址在栈中的位置是在父函数的返回地址的下面的,所以首先分析出来的是子函数,记录进记录表,接着分析出父函数,再写入记录表。但可以理解的是,在分析栈的时候,也可以从高地址的方向开始分析内核栈。本实施例提供的函数调用关系确定方法,通过第一记录表和第二记录表的设置,第一记录表或第二记录表包括被调用的函数的函数名、被调用的函数的子函数的函数名以及被调用的该函数的父函数的函数名,根据当前查找到的栈内返回地址确定被调用的函数和返回地址对应的函数,使用被调用的函数对第一记录表和第二记录表进行查找、匹配,根据查找、匹配的不同结果,采用不同方法对第一记录表和第二记录表进行修正,依此对栈进行重复查找直至将栈遍历,由于经过修正的第一记录表中删除了调用关系不准确的函数,从而得到的第一记录表中记录的函数调用关系(即被系统调用、存在调用关系的函数的函数名)的准确性得以提高。可选地,在图2和图4所示实施例的基础上,若操作码的寻址类型为直接寻址,则将返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在第二记录表中。应当理解的是,这里暂定返回地址对应的函数为上一个返回地址对应的函数的父函数,然后通过后续不断的验证或修正。具体来说,若用于函数调用操作码为直接寻址,例如为“Oxff”和“0x9a”,由于无法直接通过直接寻址类型的表示函数调用的操作码判断出被调用的函数,所以暂不确定查找到的返回地址是否为函数调用时压入栈中的,先将其返回地址对应的函数的函数名记录在第二记录表中待后续修正处理。可选地,在上述实施例的基础上,本实施例的函数调用关系确定方法,还包括若查找完栈,且第二记录表不为空,则将第二记录表中记录的函数名添加到第一记录表中,并将第二记录表中记录的函数名清空。具体来说,若遍历完栈,第二记录表不为空,则说明第二记录表中记录的函数可能存在调用关系,所以将第二记录表中的内容添加到第一记录表中,将第二记录表中记录的函数调用关系清空。本实施例中,遍历完栈,清空第二记录表后,得到的第一记录表为修正后的记录表,第一记录表中记录的函数名为被系统调用、存在调用关系的函数的函数名。可选地,在图2和图4所示实施例的基础上,对栈中的至少一个返回地址依次进行查找之前,本实施例提供的方法还包括确定系统调用的最后一个函数的函数名,将最后一个函数的函数名记录在初始状态为空的第一记录表中。在上述实施例的基础上,本实施例提供的方法还包括若判断出系统在调用函数时,向栈中压入被调用的该函数的父函数的栈帧起始地址,则根据栈中的父函数的栈帧起始地址确定函数调用关系。以被换出任务为例,由于一个任务运行完成后,最后一个被调用的函数的函数名可以确定,将系统调用的最后一个确定的函数的函数名记录在初始状态为空的第一记录表中,作为后续判断修正的基准。可选地,上述栈为内核栈,可以理解的是,上述栈也可以是中断栈、异常栈等。本实施例提供的函数调用关系确定方法,通过第一记录表和第二记录表的设置,第一记录表或第二记录表包括被调用的函数的函数名、被调用的函数的子函数的函数名以及被调用的该函数的父函数的函数名,对栈中的至少一个返回地址依次进行查找之前,确定系统在调用函数中调用的最后一个函数的函数名,将最后一个函数的函数名记录在初始状态为空的第一记录表中,根据当前查找到的栈内返回地址确定被调用的函数和返回地址对应的函数,使用被调用的函数对第一记录表和第二记录表进行查找、匹配,根据查找、匹配的不同结果,采用不同方法对第一记录表和第二记录表进行修正,依此对栈进行重复查找直至将栈遍历,由于经过修正的第一记录表中删除了调用关系不准确的函数,从而得到的第一记录表中记录的函数调用关系(即被系统调用、存在调用关系的函数的函数名)的准确性得以提高。可以理解的是,本发明提供的函数调用关系确定方法可以应用于对系统进行热补丁升级的安全性检测,还可以应用于其他需要分析确定函数调用关系的场景,例如当安装有kdump工具的系统发生崩溃时,kdump工具会将系统崩溃时的内存数据保存下来,而利用本发明提供的函数调用关系确定方法可以分析出每个进程的函数调用关系,分析确定出的函数调用关系中涉及的函数和调用关系,可以用于确定发生系统崩溃的原因,除此之外,在系统正常运行的过程中也可以读取当前的内存数据,并采用本发明提供的函数调用关系确定方法分析确定进程实时的函数调用关系,分析确定出的函数调用关系中涉及的函数和调用关系,对函数的调用关系进行优化,可以用于提升调试效率。本发明实施例针对将上述函数调用关系确定方法应用于对系统进行补丁升级的安全性检测的场景,提供了一种热补丁升级方法。图5为本发明提供的热补丁升级方法实施例一的流程图,如图5所示,本实施例的热补丁升级方法包括步骤510、若判断出系统在调用函数时,未向栈中压入被调用的该函数的父函数的栈帧起始地址,则对栈中的至少一个返回地址依次进行查找,栈中包括至少一个返回地址。可选的,本实施例中的热补丁升级方法还包括若判断出系统在调用函数时,向栈中压入被调用的该函数的父函数的栈帧起始地址,则根据栈中的父函数的栈帧起始地址确定函数调用关系。具体来说,对于系统在调用函数时往栈中压入父函数栈帧的起始地址的情况,当父函数调用一个函数时,系统首先会向栈中压入一个返回地址,然后会压入父函数的栈帧起始地址,通过系统压入栈中的栈帧起始地址可以直接计算出父函数执行时所使用的栈帧长度,这样就能够比较准确地推算出任务的函数调用关系,再根据推算出任务的函数调用关系进行热补丁升级的安全性检测。步骤520、每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的该函数的父函数为返回地址对应的函数。可选地,记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示函数名的前一个函数名对应的函数的父函数,也表示函数名的后一个函数名对应的函数的子函数,步骤520具体可以包括根据当前查找到的返回地址确定引起当前查找到的返回地址入栈的、表示函数调用的操作码,若操作码的寻址类型为间接寻址,则根据操作码确定被调用的函数;可选地,根据当前查找到的返回地址确定引起当前查找到的返回地址入栈的、表示函数调用的操作码,具体可以为将当前查找到的返回地址减去预设字节数,生成查找地址,从查找地址开始读取预设字节数的数据,根据该数据确定引起当前查找到的返回地址入栈的、表示函数调用的操作码。举例来说,表示函数调用的操作码可以是0Xe8、0Xff、0X9a中的一种,可将当前查找到的返回地址减去7,生成查找地址,从该查找地址开始读取7个字节的数据,用读取的数据与上述三种表示函数调用的操作码的特定格式作比较,确定查找到的返回地址对应的表示函数调用的操作码,若可以匹配上其中任意一种,可以认为该返回地址可能是函数调用时压入栈内的返回地址。若第一记录表中记录有被调用的函数的函数名,则将第一记录表中记录的处于被调用的函数之后的所有函数名删除,将返回地址对应函数的函数名作为被调用的该函数的父函数的函数名记录在第一记录表中被调用的函数的函数名之后的位置上,并将第二记录表中记录的函数名清空;若第一记录表中没有记录被调用的函数的函数名,且第二记录表中记录有被调用的函数的函数名,则将第二记录表中记录的被调用的函数的函数名以及处于被调用的函数的函数名之前的所有函数名以及返回地址对应的函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空;其中返回地址对应的函数的函数名作为被调用的该函数的父函数的函数名被记录在被调用的函数的函数名的后面;其中,步骤510中对栈中的至少一个返回地址依次进行查找,可以包括若第二记录表中没有记录被调用的函数的函数名,则从低地址开始往高地址的方向,查找栈中的下一个返回地址。可选地,记录表包括第一记录表和第二记录表;其中,第一记录表或第二记录表包括被调用的函数的函数名、被调用的函数的子函数的函数名以及被调用的该函数的父函数的函数名,步骤520具体可以包括根据当前查找到的返回地址确定引起当前查找到的返回地址入栈的、表示函数调用的操作码,若操作码的寻址类型为间接寻址,则根据操作码确定被调用的函数;若第一记录表中记录有被调用的函数的函数名,则将第一记录表中记录的被调用的该函数的父函数的函数名,以及被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将返回地址对应函数的函数名作为被调用的该函数的父函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空;若第一记录表中没有记录被调用的函数的函数名,且第二记录表中记录有被调用的函数的函数名,则将第二记录表中记录的函数调用关系中的被调用的函数的函数名、被调用的函数的子函数的函数名、与被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及返回地址对应的函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空;其中返回地址对应的函数的函数名为被调用的该函数的父函数的函数名;其中,步骤510中对栈中的至少一个返回地址依次进行查找,可以包括若第二记录表中没有记录被调用的函数的函数名,则从低地址开始往高地址的方向,查找栈中的下一个返回地址。进一步地,步骤520还可以包括若操作码的寻址类型为直接寻址,则将返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在第二记录表中。更近一步地,本实施例的热补丁升级方法还可以包括若查找完栈,且第二记录表不为空,则将第二记录表中记录的函数名添加到第一记录表中,并将第二记录表中记录的函数名清空。
再进一步地,对栈中的至少一个返回地址依次进行查找之前,本实施例的热补丁升级方法还可以包括确定系统调用的最后一个函数的函数名,将最后一个函数的函数名记录在初始状态为空的第一记录表中。以被换出任务为例,由于一个任务运行完成后,最后一个被调用的函数的函数名可以确定,将系统调用的最后一个确定的函数的函数名记录在初始状态为空的第一记录表中,作为后续判断修正的基准。步骤530、对比确定的函数的调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级。可选地,上述栈为内核栈,可以理解的是,上述栈也可以是中断栈、异常栈等。在上述实施例的基础上,本实施例的热补丁升级方法,还包括若判断出系统在调用函数时,向栈中压入被调用的该函数的父函数的栈帧起始地址,则根据栈中的父函数的栈帧起始地址确定函数调用关系。具体来说,本实施例是以上述函数调用关系确定方法实施例中确定的函数调用关系为基础,确定进行热补丁升级的时机。在热补丁升级中,寻找打入补丁的时机,确保系统稳定运行是一项关键技术。热补丁的特点是不重启系统应用补丁,如果补丁对一个尚未完成调用的函数进行了修改,待系统继续执行该函数的剩余部分时就有可能发生系统崩溃,安全性检测的目的是确保打入补丁时,系统所有任务都没有调用补丁所涉及的函数,使用本发明实施例提供的热补丁升级方法,得到的修正后的记录表中记录的函数的函数名为当前任务的函数调用所涉及的函数,将修正后记录表中的函数名与补丁修改的函数列表中的函数名进行对比,若补丁修改的函数列表中有修正后记录表中的一个或多个函数的函数名,说明当前系统调用了补丁所涉及的函数,则放弃这次补丁升级,提示暂时不能进行补丁升级,过一段时间再次进行对比,若补丁修改的函数列表中没有任何一个修正后记录表中的函数的函数名,则可以对系统进行补丁升级。现有技术由于不能较为精确确定任务的函数调用关系,会导致两种情况一是安全性检测不全面,无法保证升级的安全性;二是安全性检测过度,致使可以进行的热补丁升级被阻止,降低热补丁升级的效率。本实施例提供的热补丁升级方法,通过对函数调用关系的较为精确确定,并对比确定的函数的调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级,由于函数调用关系是较为精确的,可以一定程度上避免由于函数调用关系的不准确而导致的热补丁升级不安全或热补丁升级效率低的问题,从而保证热补丁升级的安全性并提高热补丁升级的效率。图6为热补丁升级的整体流程示意图,如图6所示,热补丁升级的整体过程如下首先在内核源码中增加内核补丁,得到打上补丁的内核源码;步骤601、对打上补丁的内核源码进行编译,并提取出补丁对源码的修改,得到编译后的.ο文件;编译后的.O文件中除内核补丁和内核源码外,还包括有一段用于记录补丁对源码的哪些部分进行修改的数据;
步骤602、解析编译后的.O文件中的提取信息,并增加一组控制结构体用于实现内核补丁的应用,得到处理后的.ο文件;处理后的.O文件中除内核补丁和内核源码外,还包括有一组控制结构体;步骤603、将处理后的.O文件做成模块文件加载到内核中;步骤604、进行安全性检测,判断补丁涉及的函数是否正在运行;步骤605、提示暂时不能升级补丁;步骤606、使用内核补丁。本发明的热补丁升级方法主要是针对对步骤604中的安全性检测,安全性检测的目的是确保打入补丁时,系统所有任务都没有调用补丁所涉及的函数,使用本发明实施例提供的热补丁升级方法,得到的修正后的记录表中记录的函数的函数名为当前任务的函数调用所涉及的函数,将修正后记录表中的函数名与补丁修改的函数列表中的函数名进行对比,若补丁修改的函数列表中有修正后记录表中的一个或多个函数的函数名,说明当前系统调用了补丁所涉及的函数,则放弃这次补丁升级,提示暂时不能进行补丁升级,过一段时间再次进行对比,若补丁修改的函数列表中没有任何一个修正后记录表中的函数的函数名,则可以对系统进行补丁升级。本实施例提供的热补丁升级方法,通过对函数调用关系的较为精确确定,并对比确定的函数的调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级,可以保证热补丁升级的安全性并提高热补丁升级的效率。为使得本发明实施例提供的方法更加清楚,以下实施例将对本发明提供的热补丁升级方法作进一步说明,图7为本发明提供的热补丁升级方法实施例二的流程图,如图7所示,本实施例中热补丁升级方法可以包括首先,从栈的低地址开始;步骤701、判断系统在调用函数时是否向栈中压入被调用的该函数的父函数的栈帧起始地址,若是执行步骤702,否则执行步骤703 ;具体来说,选取几个典型函数,读取其代码段起始部分的数据,根据汇编语言的特征机器码判断系统在函数调用时是否会往栈中压入栈帧起始地址。步骤702、利用找巾贞起始地址确定函数调用关系;具体来说,对压入栈帧起始地址的情况,利用压在栈中的栈帧起始地址可以找到每次函数调用的栈帧长度,可以依此实现精确的函数调用关系解析;对不压入栈帧起始地址的情况,设置第一记录表和第二记录表分别用于存放经检测匹配的函数和暂时不确定是否正确的函数,上述第一记录表和第二记录表可以是链表。步骤703、将函数调用中最后一个被调用的函数的函数名记录在初始状态为空的第一记录表中,并向栈的高地址方向继续查找;步骤704、判断是否到达栈顶,若是执行步骤715,否则执行步骤705 ;步骤705、在栈内查找到一条返回地址;将上述返回地址减去7,生成查找地址,从该查找地址开始读取7个字节的数据,用读取的数据与0Xe8、0Xff、0X9a三种函数调用操作码的特定格式作比较,如果能匹配上其中一种,认为这个返回地址可能是函数调用时压入的返回地址,判断其函数调用操作码类型,根据函数调用操作码可以确定被调用的函数,否则退出这次判断,继续分析栈中的下
一条数据。步骤706、判断返回地址对应的函数调用操作码类型是否为间接寻址,若是执行步骤707,否则执行步骤713 ;举例来说,x86_64架构中的“0xe8”函数调用操作码的类型为间接寻址另外两种“Oxff”和“0x9a”函数调用操作码的类型为直接寻址。步骤707、利用重定位原理确定被调用的函数的函数名,对第一记录表进行查找;步骤708、判断第一记录表中是否记录有被调用的函数的函数名,若是执行步骤709,否则执行步骤710 ;步骤709、删除记录在第一记录表中的被调用的该函数的父函数,将返回地址对应的函数的函数名记录到第一记录表中,清空第二记录表;步骤710、对第二记录表进行查找;步骤711、判断第二记录表中是否记录有被调用的函数的函数名,若是执行步骤712,否则返回步骤703继续重新查找;步骤712、将第二记录表中的被调用的函数及其所有子函数的函数名以及返回地址对应的函数的函数名记录到第一记录表中,清空第二记录表;步骤713、判断返回地址对应的函数调用操作码类型是否为直接寻址,若是执行714,否则返回步骤703继续重新查找;步骤714、将返回地址对应的函数的函数名记录到第二记录表中;步骤715、判断第二记录表是否为空,若是转向步骤717之前,否则执行步骤716 ;步骤716、将第二记录表的内容记录到第一记录表中,并清空第二记录表;步骤717、根据第一记录表中内容确定函数调用关系,根据确定的函数的调用关系中的函数名进行安全性检测。具体来说,根据第一记录表中内容确定函数调用关系,对比确定的函数的调用关系中的函数名与获取到的热补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行热补丁升级。本实施例提供的热补丁升级方法,通过第一记录表和第二记录表的设置,第一记录表用于记录函数调用中调用的最后一个函数的函数名和确定存在调用关系的函数的函数名,第二记录表用于记录暂定为或假设为存在调用关系的函数的函数名,根据当前查找到的栈内返回地址确定被调用的函数和返回地址对应的函数,使用被调用的函数对第一记录表和第二记录表进行查找、匹配,根据查找、匹配的不同结果,采用不同方法对第一记录表和第二记录表进行修正,依此对栈进行重复查找直至将栈遍历,可以得到记录有被系统调用、存在调用关系的函数的函数名的第一记录表,根据第一记录表中内容确定函数调用关系,对比确定的函数的调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级,由于函数调用关系是较为精确的,可以一定程度上避免由于函数调用关系的不准确而导致的热补丁升级不安全或热补丁升级效率低的问题,保证热补丁升级的安全性并提高热补丁升级的效率。值得注意的是,上述实施例以LINUX系统为例对热补丁升级方法进行了说明,在其他系统下,本领域技术人员也可以通过本发明实施例提供的热补丁升级方法实现热补丁升级,本发明实施例并不以此为限。图8为本发明提供的热补丁升级方法实施例三的流程图,如图8所示,本实施例以被换出的任务为例,数据A、B、C、D为任务内核栈中的数据,沿箭头方向,从内核栈低地址往高地址方向遍历,以确定的函数funEND ()为基准,查找确定上一个被调用的函数,图8描述的场景是一个任务的内核栈中从低地址到高地址依次被压入指令“0xe8”,“Oxff”和“0xe8”执行后的返回地址,本实施例函数调用关系的方法包括步骤801、被换出的任务最后调用的是一个确定的函数,记为funEND O ;步骤802、通过数据A计算出函数调用指令为间接寻址;步骤803、利用重定位原理计算出调用的子函数,记为funAO,判断子函数是否为funEND ();步骤804、若是,利用数据A找出当前所属的函数,记为funB (),将该函数的函数
名记录在第一记录表中;步骤805、通过数据B计算出函数调用指令为直接寻址;步骤806、利用数据B找出当前所属的函数,记为funCO,将该函数的函数名记录
在第二记录表中;步骤807、通过数据C计算出函数调用指令为间接寻址;步骤808、利用重定位原理计算出调用的子函数,记为funD ();步骤809、遍历第一记录表,查找是否记录有与funD ()相同的函数项,若是,删除第一记录表中所有的funD ()的父函数的函数名,根据数据C找出当前所属的函数,记录至
第一记录表中;步骤810、若第一记录表中没有记录有与funD ()相同的项,遍历第二记录表,若查找到与funD ()相同的函数项,将funD ()及其所有子函数以及根据数据C找出当前所属的函数的函数名记录至第一记录表中,清空第二记录表;步骤811、若第一记录表和第二记录表中均没有记录和funD ()相同的函数项,则查找栈中下一条数据;步骤812、若遍历到栈顶发现第二记录表非空,则将第二记录表中记录的内容记录至第一记录表中,将第二记录表清空;步骤813、根据第一记录表中内容确定函数调用关系,根据确定的函数的调用关系中的函数名进行安全性检测。具体来说,对比确定的函数的调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级。本实施例提供的热补丁升级方法,通过第一记录表和第二记录表的设置,第一记录表用于记录函数调用中调用的最后一个函数的函数名和确定存在调用关系的函数的函数名,第二记录表用于记录暂定为或假设为存在调用关系的函数的函数名,根据对栈内返回地址进行查找、匹配得到的结果对第一记录表和第二记录表中记录的内容进行修正,依此对栈进行重复查找直至将栈遍历,可以得到记录有被系统调用、存在调用关系的函数的函数名的第一记录表,根据第一记录表中内容确定函数调用关系,对比确定的函数的调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级,由于函数调用关系是较为精确的,可以一定程度上避免由于函数调用关系的不准确而导致的热补丁升级不安全或热补丁升级效率低的问题,保证热补丁升级的安全性并提高热补丁升级的效率。图9为本发明提供的函数调用关系确定装置实施例一的结构示意图,如图9所示,本实施例的函数调用关系确定装置,包括查找模块91、处理模块92,其中查找模块91用于若判断出系统在调用函数时,未向栈中压入被调用的该函数的父函数的栈帧起始地址,则对栈中的至少一个返回地址依次进行查找,栈中包括至少一个返回地址;处理模块92与查找模块91连接,用于每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的该函数的父函数为返回地址对应的函数。本实施例的装置,可以用于执行图1所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。本发明实施例提供的函数调用关系确定装置,针对系统在调用函数时,未向栈中压入被调用的函数的父函数的栈帧起始地址的情况,对该栈中的至少一个返回地址依次进行查找,每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的函数的父函数为返回地址对应的函数,可见,通过逐步修正了记录表中原先记录的不准确的函数调用关系中的父函数,从而提高了函数调用关系的准确性,进而可以根据修正后记录表中记录的函数名较为精确确定函数调用关系。本发明提供的函数调用关系确定装置实施例二,在图9所示实施例的基础上,记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示函数名的前一个函数名对应的函数的父函数,也表示函数名的后一个函数名对应的函数的子函数,上述处理模块92具体可以用于每次查找到所述至少一个返回地址中的一个返回地址时,根据当前查找到的返回地址确定引起当前查找到的返回地址入栈的、表示函数调用的操作码,若操作码的寻址类型为间接寻址,则根据操作码确定被调用的函数;若第一记录表中记录有被调用的函数的函数名,则将第一记录表中记录的处于被调用的函数之后的所有函数名删除,将返回地址对应函数的函数名作为被调用的该函数的父函数的函数名记录在第一记录表中被调用的函数的函数名之后的位置上,并将第二记录表中记录的函数名清空;若第一记录表中没有记录被调用的函数的函数名,且第二记录表中记录有被调用的函数的函数名,则将第二记录表中记录的被调用的函数的函数名以及处于被调用的函数的函数名之前的所有函数名以及返回地址对应的函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空;其中返回地址对应的函数的函数名作为被调用的该函数的父函数的函数名被记录在被调用的函数的函数名的后面;其中,查找模块91具体用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找的过程中,若第二记录表中没有记录被调用的函数的函数名,则从低地址开始往高地址的方向,查找栈中的下一个返回地址。本实施例的装置,可以用于执行图2所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。本实施例提供的函数调用关系确定装置,通过第一记录表和第二记录表的设置,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示函数名的前一个函数名对应的函数的父函数,也表示函数名的后一个函数名对应的函数的子函数,根据当前查找到的栈内返回地址确定被调用的函数和返回地址对应的函数,使用被调用的函数对第一记录表和第二记录表进行查找、匹配,根据查找、匹配的不同结果,采用不同方法对第一记录表和第二记录表进行修正,依此对栈进行重复查找直至将栈遍历,由于经过修正的第一记录表中删除了调用关系不准确的函数,从而得到的第一记录表中记录的函数调用关系(即被系统调用、存在调用关系的函数的函数名)的准确性得以提高。本发明提供的函数调用关系确定装置实施例三,在图9所示实施例的基础上,记录表包括第一记录表和第二记录表;其中,第一记录表或第二记录表包括被调用的函数的函数名、被调用的函数的子函数的函数名以及被调用的该函数的父函数的函数名,处理模块92具体用于每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括每次查找到所述至少一个返回地址中的一个返回地址时,根据当前查找到的返回地址确定引起当前查找到的返回地址入栈的、表示函数调用的操作码,若操作码的寻址类型为间接寻址,则根据操作码确定被调用的函数;若第一记录表中记录有被调用的函数的函数名,则将第一记录表中记录的被调用的该函数的父函数的函数名,以及被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将返回地址对应函数的函数名作为被调用的该函数的父函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空;若第一记录表中没有记录被调用的函数的函数名,且第二记录表中记录有被调用的函数的函数名,则将第二记录表中记录的函数调用关系中的被调用的函数的函数名、被调用的函数的子函数的函数名、与被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及返回地址对应的函数的函数名记录在第一记录表中,并将第二记录表中记录的函数名清空;其中返回地址对应的函数的函数名为被调用的该函数的父函数的函数名;其中,查找模块91具体用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找的过程中,若第二记录表中没有记录被调用的函数的函数名,则从低地址开始往高地址的方向,查找栈中的下一个返回地址。进一步地,在上述函数调用关系确定装置实施例二和实施例三的基础上,处理模块92,还用于若操作码的寻址类型为直接寻址,则将返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在第二记录表中。处理模块92,还用于若查找完栈,且第二记录表不为空,则将第二记录表中的内容添加到第一记录表中,并将第二记录表中记录的函数名清空。进一步地,查找模块91,还用于在对栈中的至少一个返回地址依次进行查找之前,确定函数调用中调用的最后一个函数的函数名,将最后一个函数的函数名记录在初始状态为空的第一记录表中。可选地,处理模块92,具体用于将当前查找到的返回地址减去预设字节数,得到查找地址,从查找地址开始读取预设字节数的数据,根据数据确定引起当前查找到的返回地址入栈的、表示函数调用的操作码。处理模块92,还用于若判断出系统在调用函数时,向栈中压入被调用的该函数的父函数的栈帧起始地址,则根据栈中的父函数的栈帧起始地址确定函数调用关系。本实施例的装置,可以用于执行图7和图8所示方法实施例的技术方案中确定函数调用关系的部分,其实现原理和技术效果类似,此处不再赘述。本实施例提供的函数调用关系确定装置,通过第一记录表和第二记录表的设置,第一记录表或第二记录表包括被调用的函数的函数名、被调用的函数的子函数的函数名以及被调用的该函数的父函数的函数名,对栈中的至少一个返回地址依次进行查找之前,确定系统在调用函数中调用的最后一个函数的函数名,将最后一个函数的函数名记录在初始状态为空的第一记录表中,根据当前查找到的栈内返回地址确定被调用的函数和返回地址对应的函数,使用被调用的函数对第一记录表和第二记录表进行查找、匹配,根据查找、匹配的不同结果,采用不同方法对第一记录表和第二记录表进行修正,依此对栈进行重复查找直至将栈遍历,由于经过修正的第一记录表中删除了调用关系不准确的函数,从而得到的第一记录表中记录的函数调用关系(即被系统调用、存在调用关系的函数的函数名)的准确性得以提高。图10为本发明提供的计算机系统实施例一的结构示意图,如图10所示,本实施例的计算机系统包括至少一个总线1001、与总线1001相连的至少一个处理器1002以及与总线1001相连的至少一个存储器1003,其中,处理器1002通过总线1001,调用存储器1003中存储的代码,以用于若判断出系统在调用函数时,未向栈中压入被调用的该函数的父函数的栈帧起始地址,则对栈中的至少一个返回地址依次进行查找,栈中包括至少一个返回地址;每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的该函数的父函数为返回地址对应的函数。进一步地,处理器1002,还用于若判断出系统在调用函数时,向栈中压入被调用的该函数的父函数的栈帧起始地址,则根据栈中的父函数的栈帧起始地址确定函数调用关系O进一步地,处理器1002,还用于对比修正后的记录表中记录的函数调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级。本实施例提供的计算机系统,可以用于执行图1-图8任一所示方法实施例的技术方案中计算机系统对应执行的部分,其实现原理和技术效果类似,此处不再赘述。图10仅为本发明提供的计算机系统的结构的一种示意图,具体结构可根据实际进行调整。
本发明实施例提供的计算机系统,针对系统在调用函数时,未向栈中压入被调用的函数的父函数的栈帧起始地址的情况,对该栈中的至少一个返回地址依次进行查找,每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的函数的父函数为返回地址对应的函数,可见,通过逐步修正了记录表中原先记录的不准确的函数调用关系中的父函数,从而提高了函数调用关系的准确性,进而可以根据修正后记录表中记录的函数名较为精确确定函数调用关系。进一步的,通过对函数调用关系的较为精确确定,并对比确定的栈内的函数的调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级,由于函数调用关系是精确的,可以一定程度上避免由于函数调用关系的不准确而导致的热补丁升级不安全或热补丁升级效率低的问题,从而保证热补丁升级的安全性并提高热补丁升级的效率。本领域普通技术人员可以理解实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括R0M、RAM、磁碟或者光盘等各种可以存储程序代码的介质。最后应说明的是以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
权利要求
1.一种函数调用关系确定方法,其特征在于,包括若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找,所述栈中包括所述至少一个返回地址;每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的所述被调用的该函数的父函数为所述返回地址对应的函数。
2.根据权利要求1所述的函数调用关系确定方法,其特征在于,所述记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示所述函数名的前一个函数名对应的函数的父函数,也表示所述函数名的后一个函数名对应的函数的子函数;所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的处于所述被调用的函数之后的所有函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中所述被调用的函数的函数名之后的位置上,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的所述被调用的函数的函数名以及处于所述被调用的函数的函数名之前的所有函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名作为所述被调用的该函数的父函数的函数名被记录在所述被调用的函数的函数名的后面;其中,所述对所述栈中的至少一个返回地址依次进行查找,包括若所述第二记录表中没有记录所述被调用的函数的函数名,则从低地址开始往高地址的方向,查找所述栈中的下一个返回地址。
3.根据权利要求1所述的函数调用关系确定方法,其特征在于,所述记录表包括第一记录表和第二记录表;其中,所述第一记录表或第二记录表包括所述被调用的函数的函数名、所述被调用的函数的子函数的函数名以及所述被调用的该函数的父函数的函数名;所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的所述被调用的函数的父函数的函数名,以及所述被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的函数调用关系中的所述被调用的函数的函数名、所述被调用的函数的子函数的函数名、所述被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名为所述被调用的该函数的父函数的函数名;其中,所述对所述栈中的至少一个返回地址依次进行查找,包括若所述第二记录表中没有记录所述被调用的函数的函数名,则从低地址开始往高地址的方向,查找所述栈中的下一个返回地址。
4.根据权利要求2或3所述的函数调用关系确定方法,其特征在于,所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,还包括若所述操作码的寻址类型为直接寻址,则将所述返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在所述第二记录表中。
5.根据权利要求2或3或4所述的函数调用关系确定方法,其特征在于,所述方法还包括若查找完所述栈,且所述第二记录表不为空,则将所述第二记录表中记录的函数名添加到所述第一记录表中,并将所述第二记录表中记录的函数名清空。
6.根据权利要求2或3或4所述的函数调用关系确定方法,其特征在于,所述对所述栈中的至少一个返回地址依次进行查找之前,所述方法还包括确定所述系统调用的最后一个函数的函数名,将所述被调用的最后一个函数的函数名记录在初始状态为空的第一记录表中。
7.根据权利要求2飞任一项所述的函数调用关系确定方法,其特征在于,所述根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,包括将所述当前查找到的返回地址减去预设字节数,得到查找地址,从所述查找地址开始读取所述预设字节数的数据,根据所述数据确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码。
8.根据权利要求Γ7任一项所述的函数调用关系确定方法,其特征在于,所述方法还包括若判断出所述系统在调用函数时,向所述栈中压入被调用的所述函数的父函数的栈帧起始地址,则根据所述栈中的父函数的栈帧起始地址确定所述函数调用关系。
9.一种热补丁升级方法,其特征在于,包括若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找,所述栈中包括所述至少一个返回地址;每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的所述被调用的该函数的父函数为所述返回地址对应的函数。对比修正后的记录表中记录的函数调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级。
10.根据权利要求9所述的热补丁升级方法,其特征在于,所述记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示所述函数名的前一个函数名对应的函数的父函数,也表示所述函数名的后一个函数名对应的函数的子函数;所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的处于所述被调用的函数之后的所有函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中所述被调用的函数的函数名之后的位置上,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的所述被调用的函数的函数名以及处于所述被调用的函数的函数名之前的所有函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名作为所述被调用的该函数的父函数的函数名被记录在所述被调用的函数的函数名的后面;其中,所述对所述栈中的至少一个返回地址依次进行查找,包括若所述第二记录表中没有记录所述被调用的函数的函数名,则从低地址开始往高地址的方向,查找所述栈中的下一个返回地址。
11.根据权利要求9所述的热补丁升级方法,其特征在于,所述记录表包括第一记录表和第二记录表;其中,所述第一记录表或第二记录表包括所述被调用的函数的函数名、所述被调用的函数的子函数的函数名以及所述被调用的该函数的父函数的函数名;所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,包括根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的所述被调用的该函数的父函数的函数名,以及所述被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的函数调用关系中的所述被调用的函数的函数名、所述被调用的函数的子函数的函数名、与所述被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名为所述被调用的该函数的父函数的函数名;其中,所述对所述栈中的至少一个返回地址依次进行查找,包括若所述第二记录表中没有记录所述被调用的函数的函数名,则从低地址开始往高地址的方向,查找所述栈中的下一个返回地址。
12.根据权利要求10或11所述的热补丁升级方法,其特征在于,所述确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,还包括若所述操作码的寻址类型为直接寻址,则将所述返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在所述第二记录表中。
13.根据权利要求10或11或12所述的热补丁升级方法,其特征在于,所述方法还包括若查找完所述栈,且所述第二记录表不为空,则将所述第二记录表中记录的函数名添加到所述第一记录表中,并将所述第二记录表中记录的函数名清空。
14.根据权利要求10或11或12所述的热补丁升级方法,其特征在于,所述对所述栈中的至少一个返回地址依次进行查找之前,所述方法还包括确定所述系统调用的最后一个函数的函数名,将所述最后一个函数的函数名记录在初始状态为空的第一记录表中。
15.根据权利要求1(Γ14任一项所述的热补丁升级方法,其特征在于,所述根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,包括将所述当前查找到的返回地址减去预设字节数,得到查找地址,从所述查找地址开始读取所述预设字节数的数据,根据所述数据确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码。
16.根据权利要求扩15任一项所述的热补丁升级方法,其特征在于,所述方法还包括:若判断出系统在调用函数时,向所述栈中压入被调用的所述函数的父函数的栈帧起始地址,则根据所述栈中的父函数的栈帧起始地址确定所述函数调用关系。
17.—种函数调用关系确定装置,其特征在于,包括查找模块,用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找,所述栈中包括所述至少一个返回地址;处理模块,与所述查找模块连接,用于每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的所述被调用的该函数的父函数为所述返回地址对应的函数。
18.根据权利要求17所述的函数调用关系确定装置,其特征在于,所述记录表包括第一记录表和第二记录表,其中第一记录表和第二记录表均包括一个或多个函数名,其中一个函数名表示所述函数名的前一个函数名对应的函数的父函数,也表示所述函数名的后一个函数名对应的函数的子函数;所述处理模块具体用于每次查找到所述至少一个返回地址中的一个返回地址时,根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的处于所述被调用的函数之后的所有函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中所述被调用的函数的函数名之后的位置上,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的所述被调用的函数的函数名以及处于所述被调用的函数的函数名之前的所有函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名作为所述被调用的该函数的父函数的函数名被记录在所述被调用的函数的函数名的后面;其中,所述查找模块具体用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找的过程中,若所述第二记录表中没有记录所述被调用的函数的函数名,则从低地址开始往高地址的方向,查找所述栈中的下一个返回地址。
19.根据权利要求17所述的函数调用关系确定装置,其特征在于,所述记录表包括第一记录表和第二记录表;其中,所述第一记录表或第二记录表包括所述被调用的函数的函数名、所述被调用的函数的子函数的函数名以及所述被调用的该函数的父函数的函数名;所述处理模块具体用于每次查找到所述至少一个返回地址中的一个返回地址时,根据当前查找到的返回地址确定引起所述当前查找到的返回地址入栈的、表示函数调用的操作码,若所述操作码的寻址类型为间接寻址,则根据所述操作码确定所述被调用的函数;若所述第一记录表中记录有所述被调用的函数的函数名,则将所述第一记录表中记录的所述被调用的该函数的父函数的函数名,以及所述被调用的该函数的父函数的父函数的函数名,以此类推,直至最后一个父函数的函数名删除,将所述返回地址对应函数的函数名作为所述被调用的该函数的父函数的函数名记录在第一记录表中,并将所述第二记录表中记录的函数名清空;若所述第一记录表中没有记录所述被调用的函数的函数名,且所述第二记录表中记录有所述被调用的函数的函数名,则将所述第二记录表中记录的函数调用关系中的所述被调用的函数的函数名、所述被调用的函数的子函数的函数名、与所述被调用的函数的子函数的子函数的函数名,以此类推,直至最后一个子函数的函数名以及所述返回地址对应的函数的函数名记录在所述第一记录表中,并将所述第二记录表中记录的函数名清空;其中所述返回地址对应的函数的函数名为所述被调用的该函数的父函数的函数名;其中,所述查找模块具体用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找的过程中,若所述第二记录表中没有记录所述被调用的函数的函数名,则从低地址开始往高地址的方向,查找所述栈中的下一个返回地址。
20.根据权利要求18或19所述的函数调用关系确定装置,其特征在于,所述处理模块,还用于若所述操作码的寻址类型为直接寻址,则将所述返回地址对应的函数的函数名作为上一个返回地址对应的函数的父函数的函数名记录在所述第二记录表中。
21.根据权利要求18或19或20所述的函数调用关系确定装置,其特征在于,所述处理模块,还用于若查找完所述栈,且所述第二记录表不为空,则将所述第二记录表中的内容添加到所述第一记录表中,并将所述第二记录表中记录的函数名清空。
22.根据权利要求18或19或20所述的函数调用关系确定装置,其特征在于,所述查找模块,还用于在所述对所述栈中的至少一个返回地址依次进行查找之前,确定所述函数调用中调用的最后一个函数的函数名,将所述最后一个函数的函数名记录在初始状态为空的第一记录表中。
23.根据权利要求17 22任一项所述的函数调用关系确定装置,其特征在于,所述处理模块,还用于若判断出系统在调用函数时,向所述栈中压入被调用的所述函数的父函数的栈帧起始地址,则根据所述栈中的父函数的栈帧起始地址确定所述函数调用关系。
24.一种计算机系统,其特征在于,包括总线;与所述总线相连的处理器;与所述总线相连的存储器;其中,所述处理器通过所述总线,调用所述存储器中存储的代码,以用于若判断出系统在调用函数时,未向栈中压入被调用的所述函数的父函数的栈帧起始地址,则对所述栈中的至少一个返回地址依次进行查找,所述栈中包括所述至少一个返回地址;每次查找到所述至少一个返回地址中的一个返回地址时,确定当前查找到的所述返回地址对应的函数,根据所述返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的所述被调用的该函数的父函数为所述返回地址对应的函数。
25.根据权利要求24所述的计算机系统,其特征在于,所述处理器,还用于若判断出所述系统在调用函数时,向所述栈中压入被调用的所述函数的父函数的栈帧起始地址,则根据所述栈中的父函数的栈帧起始地址确定所述函数调用关系。
26.根据权利要求24或25所述的计算机系统,其特征在于,所述处理器,还用于对比修正后的记录表中记录的函数调用关系中的函数名与获取到的补丁升级所要修改的函数列表中的函数名,若不存在相同项,则进行补丁升级。
全文摘要
本发明实施例提供一种函数调用关系确定方法、热补丁升级方法及装置,该函数调用关系确定方法包括若判断出系统在调用函数时,未向栈中压入被调用的该函数的父函数的栈帧起始地址,则对栈中的至少一个返回地址依次进行查找,栈中包括至少一个返回地址;每次查找到至少一个返回地址中的一个返回地址时,确定当前查找到的返回地址对应的函数,根据返回地址对应的函数对记录表中记录的函数调用关系进行修正,使得修正后的函数调用关系中的被调用的该函数的父函数为返回地址对应的函数。本发明实施例提供的技术方案可以根据记录表中的函数名较为精确确定函数调用关系。
文档编号G06F9/445GK103019787SQ201210544400
公开日2013年4月3日 申请日期2012年12月14日 优先权日2012年12月14日
发明者陶原, 李俊 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1