获取操作系统的内核控制流程图的方法和装置的制造方法

文档序号:10624591阅读:270来源:国知局
获取操作系统的内核控制流程图的方法和装置的制造方法
【专利摘要】本发明提供一种获取操作系统的内核控制流程图的方法和装置,该方法包括:对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件;根据所述操作系统的内核源代码确定与所述操作系统的内核源代码对应的中间代码文件;根据所述反汇编代码文件和所述中间代码文件确定间接函数控制流程图;根据所述反汇编代码文件确定直接函数控制流程图;根据所述间接函数控制流程图和所述直接函数控制流程图确定内核控制流程图。通过使用本发明提供的技术方案,可以提高控制流程图的准确度,从而有效消除对计算机的攻击。
【专利说明】
获取操作系统的内核控制流程图的方法和装置
技术领域
[0001]本发明涉及计算机内核技术,尤其涉及一种获取操作系统的内核控制流程图的方法和装置。
【背景技术】
[0002]随着计算机技术的发展,越来越多的安全问题给人们的带来了极大的损失和困扰。
[0003]在各种网络攻击方式中,利用系统漏洞来实施攻击是较为常见的攻击手段,攻击者利用缓冲区溢出漏洞,篡改操作系统内核中的控制数据,将函数返回地址覆盖为系统库函数的地址,将参数覆盖为系统函数的参数,这样,就能转移操作系统正常的执行流程(或控制流程),获取系统控制权限的目的。
[0004]如果能够对操作系统内核控制流程提供保护,阻止系统正常的执行流被恶意更改,就可以消除(或缓解)这一类攻击的威胁。
[0005]北卡罗来纳州立大学的获取控制流程图系统利用模拟器来引导并运行Linux虚拟机内核,将内核引导和运行过程中内核程序的跳转信息记录下来,包括跳转指令本身的地址及其实际跳转的目标地址,从而构造出内核的控制流程图。
[0006]但北卡罗来纳州立大学的获取控制流程图系统采用了一种折中的方案,对于无法执行到的路径,它假设了一个最大可能性的集合,即假定其目标地址为内核中所有有效函数的入口地址,这种假设使得控制流程图的准确度大大降低,从而不能有效消除对计算机的攻击。

【发明内容】

[0007]本发明实施例提供一种获取操作系统的内核控制流程图的方法和装置,以克服现有技术中得到的控制流程图的准确度太低,从而不能有效消除对计算机的攻击的问题。
[0008]本发明第一方面提供一种获取操作系统的内核控制流程图的方法,包括:
[0009]对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件;
[0010]根据所述操作系统的内核源代码确定与所述操作系统的内核源代码对应的中间代码文件;
[0011]根据所述反汇编代码文件和所述中间代码文件确定间接函数控制流程图;
[0012]根据所述反汇编代码文件确定直接函数控制流程图;
[0013]根据所述间接函数控制流程图和所述直接函数控制流程图确定内核控制流程图。
[0014]在第一方面的第一种实现方式中,所述根据所述反汇编代码文件和所述中间代码文件确定间接函数调用控制流程图,包括:
[0015]根据所述反汇编代码文件和所述中间代码文件确定参数传递表,所述参数传递表用于保存函数名与形式参数的对应关系,以及所述函数名与实际参数的对应关系;
[0016]根据所述中间代码文件和所述参数传递表确定函数指针保存表,所述函数指针保存表用于保存非临时变量与目的函数的对应关系;
[0017]根据所述反汇编代码文件和所述函数指针保存表确定中间结果表,所述中间结果表用于保存主调函数与间接函数调用语句的对应关系,以及所述主调函数与目的函数的对应关系;
[0018]根据所述反汇编代码文件与所述中间结果表确定所述间接函数调用控制流程图。
[0019]结合第一方面的第一种可能的实现方式,在第一方面的第二种可能的实现方式中,所述根据所述反汇编代码文件和所述中间代码文件确定参数传递表,所述参数传递表用于保存函数名与形式参数的对应关系,以及所述函数名与实际参数的对应关系,包括:
[0020]根据所述反汇编代码文件和所述中间代码文件,确定函数表,所述函数表中包括函数名定义语句,所述函数名定义语句同时包含于所述反汇编代码文件和所述中间代码文件中;
[0021]根据所述中间代码文件确定函数指针类型表,所述函数指针类型表用于保存所述中间代码文件中包括函数指针类型的元素的结构体定义;
[0022]若所述函数名定义语句中包括结构体,且所述结构体包含于所述函数指针类型表,则将所述函数名定义语句中的函数名保存至函数传递指针表中;
[0023]确定所述函数传递指针表中的函数名在所述中间代码文件中被调用的语句;
[0024]根据所述被调用的语句确定与所述函数名对应的形式参数和与所述函数名对应的实际参数;
[0025]将所述函数名、与所述函数名对应的形式参数以及与所述函数名对应的实际参数保存至所述参数传递表中。
[0026]结合第一方面的第一或第二种可能的实现方式,在第一方面的第三种可能的实现方式中,所述根据所述中间代码文件和所述参数传递表确定函数指针保存表,所述函数指针保存表用于保存非临时变量与目的函数的对应关系,包括:
[0027]确定所述中间代码文件中的保存store语句;
[0028]确定所述store语句中第一源变量和第一目的变量;
[0029]根据第一代码文件确定所述第一目的变量对应的非临时变量,所述第一代码文件为所述中间代码文件中位于所述store语句之后的代码,所述非临时变量为所述第一目的变量传递的第一最终变量;
[0030]将所述第一源变量与所述第一最终变量的对应关系保存至所述函数指针保存表中,其中所述第一源变量为所述函数指针保存表中的目的函数;
[0031]确定所述中间代码文件中的选择select语句;
[0032]确定所述select语句中的第二源变量、第三源变量和第二目的变量;
[0033]根据第二代码文件确定所述第二目的变量对应的非临时变量,所述第二代码文件为所述中间代码文件中位于所述select语句之后的代码,所述非临时变量为所述第二目的变量传递的第二最终变量;
[0034]将所述第二源变量与所述非临时变量的对应关系以及所述第三源变量与所述非临时变量的对应关系保存至所述函数指针保存表中,其中所述第二源变量和所述第三源变量为所述函数指针保存表中的目的函数。
[0035]结合第一方面的第三种可能的实现方式,在第一方面的第四种可能的实现方式中,若所述临时变量为结构体,所述方法还包括:
[0036]确定所述中间代码文件中对所述函数指针类型表中的结构体执行内存拷贝操作的语句;
[0037]确定所述内存拷贝操作语句中的源结构体与目的结构体;
[0038]确定所述函数指针保存表保存的结构体中与所述源结构体相同的第一结构体;
[0039]根据所述源结构体与目的结构体的对应关系更新所述函数指针保存表中保存的第一结构体为所述目的结构体。
[0040]结合第一方面的第三种可能的实现方式,在第一方面的第五种可能的实现方式中,包括:
[0041]若所述第一目的变量传递的第一最终变量为全局变量,将所述第一源变量与所述全局变量的对应关系保存至函数指针保存表;
[0042]若所述第一目的变量传递的第一最终变量为形式参数,则判断所述参数传递表中是否保存与所述形式参数对应的实际参数,若所述参数传递表中保存与所述形式参数对应的实际参数,则将所述第一源变量与所述实际参数的对应关系保存至函数指针保存表;
[0043]若所述第一目的变量传递的第一最终变量为结构体,将所述第一源变量与所述结构体的对应关系保存至函数指针保存表。
[0044]结合第一方面的第三种可能的实现方式,在第一方面的第六种可能的实现方式中,包括:
[0045]若所述第二目的变量传递的第二最终变量为全局变量,将所述第二源变量与所述全局变量的对应关系保存至函数指针保存表;
[0046]若所述第二目的变量传递的第二最终变量为形式参数,则判断所述参数传递表中是否保存与所述形式参数对应的实际参数,若所述参数传递表中保存与所述形式参数对应的实际参数,则将所述第二源变量与所述实际参数的对应关系保存至函数指针保存表;
[0047]若所述第二目的变量传递的第二最终变量为结构体,将所述第二源变量与所述结构体的对应关系保存至函数指针保存表。
[0048]结合第一方面的第一至第六种任一种可能的实现方式,在第一方面的第七种可能的实现方式中,所述根据所述反汇编代码文件和所述函数指针保存表确定中间结果表,所述中间结果表用于保存主调函数与间接函数调用语句以及目的函数的对应关系,包括:
[0049]根据所述操作系统的内核源代码确定主调函数表,所述主调函数表中包括主调函数和所述主调函数中的间接函数调用语句;
[0050]确定所述反汇编代码文件中是否包含所述主调函数;
[0051]若所述反汇编代码文件中包含所述主调函数,根据所述反汇编代码文件确定所述主调函数是否为内联函数的间接调用;
[0052]若所述主调函数不是内联函数的间接调用,将所述主调函数和所述主调函数中的间接函数调用语句保存至真实主调函数表中;
[0053]根据所述真实主调函数表和所述中间文件代码,确定所述中间结果保存表,所述中间结果保存表用于保存主调函数与所述主调函数中的间接函数调用语句以及目的函数的对应关系。
[0054]结合第一方面的第七种可能的实现方式,在第一方面的第八种可能的实现方式中,所述根据所述真实主调函数表和所述中间文件代码,确定所述中间结果保存表,所述中间结果表用于保存主调函数与所述主调函数中的间接函数调用语句以及与所述主调函数对应的目的函数的对应关系,包括:
[0055]根据所述函数指针保存表确定第二函数指针对应的目的函数,所述第二函数指针为所述真实主调函数表中保存的所述间接函数调用语句中的函数指针;
[0056]将所述主调函数与所述主调函数中的间接函数调用语句以及所述目的函数保存至所述中间结果保存表。
[0057]结合第一方面的第七种可能的实现方式,在第一方面的第九种可能的实现方式中,所述根据所述反汇编代码文件与所述中间结果保存表确定所述间接函数调用控制流程图,包括:
[0058]确定所述反汇编代码文件中的间接函数调用语句;
[0059]根据所述中间结果表确定间接函数调用语句对应的第一目的函数;
[0060]根据所述间接函数调用语句和所述第一目的函数确定所述间接函数控制流程图;
[0061]确定所述反汇编代码文件中所述间接函数调用语句的下一条指令地址;
[0062]根据所述下一条指令确定所述第一目的函数的返回地址;
[0063]根据所述第一目的函数和所述第一目的函数的返回地址确定间接函数的返回控制流程图;
[0064]根据所述间接函数控制流程图和所述间接函数的返回控制流程图确定所述间接函数调用控制流程图。
[0065]结合第一方面、第一方面的第一至第九种可能的实现方式中的任一种可能的实现方式,在第一方面的第十种可能的实现方式中,所述根据所述反汇编代码文件确定直接函数调用控制流程图,包括:
[0066]确定所述反汇编代码中的直接函数调用指令语句;
[0067]根据所述直接函数调用语句中的指令地址和第二目的函数确定直接函数控制流程图;
[0068]确定所述反汇编代码文件中所述直接函数调用语句的下一条指令地址;
[0069]根据所述下一条指令确定所述第二目的函数的返回地址;
[0070]根据所述第二目的函数和所述第二目的函数的返回地址确定直接函数的返回控制流程图;
[0071]根据所述直接函数控制流程图和所述直接函数的返回控制流程图确定所述直接函数调用控制流程图。
[0072]结合第一方面的第九种或第十种可能的实现方式,在第一方面的第^^一种可能的实现方式中,所述根据间接函数调用控制流程图和所述直接函数调用控制流程图确定内核控制流程图,包括:
[0073]将所述间接函数调用控制流程图和所述直接函数调用控制流程图保存至内核控制流程图中。
[0074]本发明第二方面提供一种获取操作系统内核控制流程图的装置,包括:
[0075]反汇编模块,用于对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件;
[0076]第一确定模块,用于根据所述操作系统的内核源代码确定与所述操作系统的内核源代码对应的中间代码文件;
[0077]第二确定模块,用于根据所述反汇编代码文件和所述中间代码文件确定间接函数控制流程图;
[0078]第三确定模块,用于根据所述反汇编代码文件确定直接函数控制流程图;
[0079]第四确定模块,用于根据所述间接函数控制流程图和所述直接函数控制流程图确定内核控制流程图。
[0080]在第二方面的第一种实现方式中,所述第二确定模块具体包括:
[0081]第一确定单元,用于根据所述反汇编代码文件和所述中间代码文件确定参数传递表,所述参数传递表用于保存函数名与形式参数的对应关系,以及所述函数名与实际参数的对应关系;
[0082]第二确定单元,用于根据所述中间代码文件和所述参数传递表确定函数指针保存表,所述函数指针保存表用于保存非临时变量与目的函数的对应关系;
[0083]第三确定单元,用于根据所述反汇编代码文件和所述函数指针保存表确定中间结果表,所述中间结果表用于保存主调函数与间接函数调用语句的对应关系,以及所述主调函数与目的函数的对应关系;
[0084]第四确定单元,用于根据所述反汇编代码文件与所述中间结果表确定所述间接函数调用控制流程图。
[0085]结合第二方面的第一种可能的实现方式,在第二方面的第二种可能的实现方式中,所述第一确定单元,具体用于:
[0086]根据所述反汇编代码文件和所述中间代码文件,确定函数表,所述函数表中包括函数名定义语句,所述函数名定义语句同时包含于所述反汇编代码文件和所述中间代码文件中;
[0087]根据所述中间代码文件确定函数指针类型表,所述函数指针类型表用于保存所述中间代码文件中包括函数指针类型的元素的结构体定义;
[0088]若所述函数名定义语句中包括结构体,且所述结构体包含于所述函数指针类型表,则将所述函数名定义语句中的函数名保存至函数传递指针表中;
[0089]确定所述函数传递指针表中的函数名在所述中间代码文件中被调用的语句;
[0090]根据所述被调用的语句确定与所述函数名对应的形式参数和与所述函数名对应的实际参数;
[0091]将所述函数名、与所述函数名对应的形式参数以及与所述函数名对应的实际参数保存至所述参数传递表中。
[0092]结合第二方面的第一或第二种可能的实现方式,在第二方面的第三种可能的实现方式中,所述第二确定单元,具体用于:
[0093]确定所述中间代码文件中的保存store语句;
[0094]确定所述store语句中第一源变量和第一目的变量;
[0095]根据第一代码文件确定所述第一目的变量对应的非临时变量,所述第一代码文件为所述中间代码文件中位于所述store语句之后的代码,所述非临时变量为所述第一目的变量传递的第一最终变量;
[0096]将所述第一源变量与所述第一最终变量的对应关系保存至所述函数指针保存表中,其中所述第一源变量为所述函数指针保存表中的目的函数;
[0097]确定所述中间代码文件中的选择select语句;
[0098]确定所述select语句中的第二源变量、第三源变量和第二目的变量;
[0099]根据第二代码文件确定所述第二目的变量对应的非临时变量,所述第二代码文件为所述中间代码文件中位于所述select语句之后的代码,所述非临时变量为所述第二目的变量传递的第二最终变量;
[0100]将所述第二源变量与所述非临时变量的对应关系以及所述第三源变量与所述非临时变量的对应关系保存至所述函数指针保存表中,其中所述第二源变量和所述第三源变量为所述函数指针保存表中的目的函数。
[0101]结合第二方面的第三种可能的实现方式,在第二方面的第四种可能的实现方式中,若所述临时变量为结构体,所述第二确定单元还用于:
[0102]确定所述中间代码文件中对所述函数指针类型表中的结构体执行内存拷贝操作的语句;
[0103]确定所述内存拷贝操作语句中的源结构体与目的结构体;
[0104]确定所述函数指针保存表保存的结构体中与所述源结构体相同的第一结构体;
[0105]根据所述源结构体与目的结构体的对应关系更新所述函数指针保存表中保存的第一结构体为所述目的结构体。
[0106]结合第二方面的第三种可能的实现方式,在第二方面的第五种可能的实现方式中,包括:
[0107]若所述第一目的变量传递的第一最终变量为全局变量,将所述第一源变量与所述全局变量的对应关系保存至函数指针保存表;
[0108]若所述第一目的变量传递的第一最终变量为形式参数,则判断所述参数传递表中是否保存与所述形式参数对应的实际参数,若所述参数传递表中保存与所述形式参数对应的实际参数,则将所述第一源变量与所述实际参数的对应关系保存至函数指针保存表;
[0109]若所述第一目的变量传递的第一最终变量为结构体,将所述第一源变量与所述结构体的对应关系保存至函数指针保存表。
[0110]结合第二方面的第三种可能的实现方式,在第二方面的第六种可能的实现方式中,包括:
[0111]若所述第二目的变量传递的第二最终变量为全局变量,将所述第二源变量与所述全局变量的对应关系保存至函数指针保存表;
[0112]若所述第二目的变量传递的第二最终变量为形式参数,则判断所述参数传递表中是否保存与所述形式参数对应的实际参数,若所述参数传递表中保存与所述形式参数对应的实际参数,则将所述第二源变量与所述实际参数的对应关系保存至函数指针保存表;
[0113]若所述第二目的变量传递的第二最终变量为结构体,将所述第二源变量与所述结构体的对应关系保存至函数指针保存表。
[0114]结合第二方面的第一至第六种任一种可能的实现方式,在第二方面的第七种可能的实现方式中,所述第三确定单元,具体用于:
[0115]根据所述操作系统的内核源代码确定主调函数表,所述主调函数表中包括主调函数和所述主调函数中的间接函数调用语句;
[0116]确定所述反汇编代码文件中是否包含所述主调函数;
[0117]若所述反汇编代码文件中包含所述主调函数,根据所述反汇编代码文件确定所述主调函数是否为内联函数的间接调用;
[0118]若所述主调函数不是内联函数的间接调用,将所述主调函数和所述主调函数中的间接函数调用语句保存至真实主调函数表中;
[0119]根据所述真实主调函数表和所述中间文件代码,确定所述中间结果保存表,所述中间结果保存表用于保存主调函数与所述主调函数中的间接函数调用语句以及目的函数的对应关系。
[0120]结合第二方面的第七种可能的实现方式,在第二方面的第八种可能的实现方式中,所述第三确定单元,还用于:
[0121]根据所述函数指针保存表确定第二函数指针对应的目的函数,所述第二函数指针为所述真实主调函数表中保存的所述间接函数调用语句中的函数指针;
[0122]将所述主调函数与所述主调函数中的间接函数调用语句以及所述目的函数保存至所述中间结果保存表。
[0123]结合第二方面的第七种可能的实现方式,在第二方面的第九种可能的实现方式中,所述第三确定单元,还用于:
[0124]确定所述反汇编代码文件中的间接函数调用语句;
[0125]根据所述中间结果表确定间接函数调用语句对应的第一目的函数;
[0126]根据所述间接函数调用语句和所述第一目的函数确定所述间接函数控制流程图;
[0127]确定所述反汇编代码文件中所述间接函数调用语句的下一条指令地址;
[0128]根据所述下一条指令确定所述第一目的函数的返回地址;
[0129]根据所述第一目的函数和所述第一目的函数的返回地址确定间接函数的返回控制流程图;
[0130]根据所述间接函数控制流程图和所述间接函数的返回控制流程图确定所述间接函数调用控制流程图。
[0131]结合第二方面、第二方面的第一至第九种可能的实现方式中的任一种可能的实现方式,在第二方面的第十种可能的实现方式中,所述第三确定模块,具体用于:
[0132]确定所述反汇编代码中的直接函数调用指令语句;
[0133]根据所述直接函数调用语句中的指令地址和第二目的函数确定直接函数控制流程图;
[0134]确定所述反汇编代码文件中所述直接函数调用语句的下一条指令地址;
[0135]根据所述下一条指令确定所述第二目的函数的返回地址;
[0136]根据所述第二目的函数和所述第二目的函数的返回地址确定直接函数的返回控制流程图;
[0137]根据所述直接函数控制流程图和所述直接函数的返回控制流程图确定所述直接函数调用控制流程图。
[0138]结合第二方面的第九种或第十种可能的实现方式,在第二方面的第i^一种可能的实现方式中,所述第四确定模块,具体用于:
[0139]将所述间接函数调用控制流程图和所述直接函数调用控制流程图保存至内核控制流程图中。
[0140]本发明中:首先对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件,并确定与操作系统的内核源代码对应的中间代码文件,然后根据反汇编代码文件和中间代码文件确定间接函数控制流程图,以及根据反汇编代码文件确定直接函数控制流程图,最后,根据间接函数控制流程图和直接函数控制流程图确定内核控制流程图。其中,通过反汇编代码文件和中间代码文件确定间接函数控制流程图,可以确定出细粒度的间接函数控制流程图,提高了控制流程图的准确度,从而有效消除对计算机的攻击。
【附图说明】
[0141]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0142]图1为本发明提供的获取操作系统的内核控制流程图的方法的流程图;
[0143]图2所示为步骤103中确定间接函数控制流程图方法的流程图;
[0144]图3为本发明实施例提供的获取操作系统的内核控制流程图的装置的结构示意图;
[0145]图4为本发明再一实施例提供的获取操作系统的内核控制流程图的装置的结构示意图;
[0146]图5为本发明又一实施例提供的获取操作系统的内核控制流程图的装置的结构示意图。
【具体实施方式】
[0147]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0148]图1为本发明提供的获取操作系统的内核控制流程图的方法的流程图,如图1所示,本实施例的方法可以包括:
[0149]步骤101:对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件。
[0150]步骤102:根据操作系统的内核源代码确定与操作系统的内核源代码对应的中间代码文件。
[0151]具体的,使用反汇编工具对操作系统内核对应的二进制内核文件进行代码反汇编,得到反汇编代码文件,并利用编译器生成操作系统的内核源代码对应的中间代码文件。
[0152]其中,操作系统为:Linux操作系统、安卓(英文:Android)操作系统等开放源代码的操作系统。
[0153]当操作系统为Linux操作系统时,具体的操作过程为:使用反汇编工具(比如objdump工具)对Linux内核二进制内核文件vmlinux进行代码反汇编(通过执行“objdump - d vmlinux”命令),可以将得到的反汇编代码文件输出到VMLinux.dump文件;并利用编译器生成内核的中间代码文件VMLinux.1R(比如通过执行LLVM编译器的opt命令
[0154]本发明实施例中不对反汇编工具的类型以及编译器的类型加以限制。
[0155]步骤103:根据反汇编代码文件和中间代码文件确定间接函数控制流程图。
[0156]在现有技术中,在确定间接函数控制流程图时,对于无法执行到的路径,即无法确定跳转指令实际跳转的目标地址时,只能假设一个最大可能性的集合,即将所有可能跳转到的目标地址全部保存起来,从而使得控制流程图的准确度大大降低。
[0157]而发明人发现,在实际的应用中,任何一个间接调用指令,只要它被调用执行,从其参数(即函数指针)回溯,总能找到该参数被赋值(或初始化)的地点;而一个函数的入口地址,只要它被赋给一个函数指针,通常最终(可能经过若干次传递)都会对应到一个间接函数调用指令;由于这两个过程中都涉及到函数指针的传递,因此只要分析函数指针的传递过程,确定间接函数调用的目标地址,就可构造出完整的间接函数控制流程图,
[0158]图2所示为步骤103中确定间接函数控制流程图方法的流程图,如图2所示,该方法可以包括:
[0159]步骤201:根据反汇编代码文件和中间代码文件确定参数传递表,参数传递表用于保存函数名与形式参数的对应关系,以及函数名与实际参数的对应关系。
[0160]第一步:根据反汇编代码文件和中间代码文件,确定函数表,函数表中包括函数名定义语句,函数名定义语句同时包含于反汇编代码文件和中间代码文件中。以下实施例中用func-list表代表函数表。
[0161]首先,确定反汇编代码文件中出现的函数名定义语句,然后在中间代码文件中搜索所有在反汇编代码文件中出现的函数名定义语句,将这些函数名的定义语句并连同函数的返回值类型和其参数列表写入func-list表中。
[0162]按照上述所举的例子,在中间代码文件VMLinux.1R中搜索所有在VMLinux.dump反汇编代码文件中出现的函数名的定义语句,并连同函数的返回值类型和其参数列表写入函数列表func-list表中。
[0163]第二步:根据中间代码文件确定函数指针类型表,函数指针类型表用于保存中间代码文件中包括函数指针类型的元素的结构体定义。以下实施例中用func-ptr-type-1 ist表代表函数指针类型表。
[0164]按照上述所举的例子,分析中间代码文件VMLinux.1R中所有的结构体类型的定义,如果其中包含有函数指针类型的元素,写入func-ptr-type-list表。
[0165]例如,中间代码文件的中间代码
[0166]% struct.clock_event_device = type
[0167]{
[0168]void
[0169](% struct.clock_event_device*) *,
[0170]i32(i64, % struct.clock_event_device*)*,
[0171]i32 (i64, % struct.clock_event_device*)*,
[0172]% un1n, ktime,
[0173]?64, i64, ?32, ?32, ?32, ?32, ?64,
[0174]void(% struct, cpumask*)
[0175]void(i32, % struct.clock_event_device*)*,
[0176]void
[0177](% struct.clock_event_device*)
[0178]void
[0179](% struct.clock_event_device*) *,
[0180]?64, i64, i8*,i32, i32,
[0181]% struct, cpumask*,
[0182]% struct.list_head,
[0183]% struct, module*,
[0184][24 X i8]
[0185]}
[0186]中,结构体“% struct.clock_event_device” 含有“void( % struct.clock_event_device*) 等函数指针,则将结构体定义写入func-ptr-type-list表。
[0187]以LLVM中间代码为例,其类型系统中,提供了函数类型(Funct1n type),由返回值类型和函数参数列表以空格连接组成,如果是函数指针则在参数列表后再加一个字符,如i32(i32,?32, ?32, ?32, ?32, i32*)*就是一个函数指针类型,表示指向一个返回值类型是 i32,参数列表为(i32, i32, i32, i32, i32, i32*)的函数。符合 <type>〈space> (〈type〉,〈space〉…)〈*>规则的字符串为函数指针。结构体类型使用“ % struct.”作为前缀,所有结构类型的定义在LLVM中间代码的一个指定区域中(位于全局变量定义之前),通过检测这些结构类型的定义中是否包含函数类型,来确定包含了函数指针的结构类型(包括结构体嵌套)。
[0188]第三步:若函数名定义语句中包括结构体,且结构体包含于函数指针类型表,则将函数名定义语句中的函数名保存至函数传递指针表中;以下实施例中用func-pass-ptr-list表代表函数传递指针表。
[0189]遍历func-list表,确定func-list表中的哪些函数名定义语句中的参数信息中含有结构体定义,并确定那些函数名定义语句中的参数信息中含有的结构体定义出现在func-ptr-type-list表中的结构体定义,也即确定哪些函数名定义语句中的参数信息中的结构体定义包含了函数指针,那么这些函数的调用就涉及到了函数指针的传递,需要把这些函数加入到func-pass-ptr-list表中。
[0190]例如,中间代码文件中的中间代码“define internal voidihpet_legacy_set_mode (i32 % mode, % struct.clock_event_device*nocapture % evt),,表不函数 “@hpet_legacy_set_mode”参数中传递了包含函数指针的结构体(即% struct.clock_event_device*),则将函数 @hpet_legacy_set_mode 加入 func-pass-ptr-list 表。
[0191]第四步:确定函数传递指针表中的函数名在中间代码文件中被调用的语句。
[0192]第五步:根据被调用的语句确定与函数名对应的形式参数和与函数名对应的实际参数。
[0193]第六步:将函数名、与函数名对应的形式参数以及与函数名对应的实际参数保存至参数传递表中,以下实施例中用argv-list表代表参数传递表。
[0194]由于函数指针或者是包含函数指针的结构体可作为参数传到函数内使用,这种情况下,想要得到函数指针的指向,要把所有可能包含函数指针的参数传递构建成参数传递表argv-list。在函数指针(包括含有函数指针的结构体)作为参数传递时,需要分析传进的参数才能最终确定目的函数。
[0195]遍历整个中间代码文件,搜索func-pass-ptr-list表中所有函数的被调用语句。根据这些调用语句传入的实际参数和函数定义的形式参数,建立(函数名,形式参数,实际参数)传递向量,并将此传递向量保存至argv-list表。
[0196]例如,分析中间代码文件中的中间代码“ % I = tail call i32ipci_direct_probe () #22, tail call voidipci_direct_init (i32 % I) #22”,结合函数定义 “definevoidipci_direct_init (i32 % type) ”,获得传递向量为(@pci_direct_init,% type, ipci_direct_probe)。根据这些信息把传递向量写入argv-list表。
[0197]步骤202:根据中间代码文件和参数传递表确定函数指针保存表,函数指针保存表用于保存非临时变量与目的函数的对应关系;以下实施例中用store-list表代表函数指针保存表。
[0198]本处理过程,从所有涉及函数名的指令出发,分析出函数指针被保存或使用的地方,如全局变量、结构体、参数等,并把分析结果保存在store-list表中。处理过程如下:
[0199]第一步:分析所有中间代码文件中的保存store语句。
[0200]确定中间代码文件中的保存store语句,并确定store语句中第一源变量和第一目的变量,进一步的根据第一代码文件确定第一目的变量对应的非临时变量,其中,非临时变量为第一目的变量传递的第一最终变量,第一代码文件为中间代码文件中位于store语句之后的代码,最后,将第一源变量与第一最终变量的对应关系保存至函数指针保存表中,其中第一源变量为函数指针保存表中的目的函数。
[0201]进一步的,若第一目的变量传递的第一最终变量为全局变量,将第一源变量与全局变量的对应关系保存至函数指针保存表;
[0202]若第一目的变量传递的第一最终变量为形式参数,则判断参数传递表中是否保存与形式参数对应的实际参数,若参数传递表中保存与形式参数对应的实际参数,则将第一源变量与实际参数的对应关系保存至函数指针保存表;
[0203]若第一目的变量传递的第一最终变量为结构体,将第一源变量与结构体的对应关系保存至函数指针保存表。
[0204]按照上述所举的例子,搜索中间代码文件VMLinux.1R中关于函数指针的“store”语句。
[0205]其中,“store”操作有两个操作数,分别是源变量和目的变量,其功能是把源变量保存到目的变量中,为了和后面步骤中的源变量和目的变量进行区分,“store”操作的两个操作数,分别用第一源变量和第一目的变量表示。回溯中间代码文件中位于此“store”语句之后的代码文件确定第一目的变量对应的非临时变量,生成函数指针保存向量(第一源变量,非临时变量),其中,非临时变量为第一目的变量传递的第一最终变量,也即,生成函数指针保存向量(第一源变量,第一最终变量)并将此保存至store-list表中,值得注意的是,如果回溯的第一最终变量为全局变量则直接将(第一源变量,全局变量)写入store-list表;如果回溯的第一最终变量为形式参数,则查询argv-list表,确定形式参数对应的实际参数,若查询argv-list表后发现形式参数没有保存至argv-list表,则不保存此形式参数,若查询argv-list表后,查询到了与形式参数对应的实际参数,则将(第一源变量,实际参数)写入store-list表;如果回溯的第一最终变量为结构体则直接将(第一源变量,结构体)写入store-list表中。
[0206]例如,中间代码“storevoid( % struct.pt_regs*)*iintel_pmu_drain_pebs_nhm, void ( % struct.pt_regs*)**getelementptr inbounds ( % struct.x86_pmu*ix86_pmu, i640, ?3244), align 8” 是把函数指针 “@intel_pmu_drain_pebs_nhm” 保存到结构体“@x86_pmu” 中偏移为“i640, i3244” 的位置,则将(@intel_pmu_drain_pebs_nhm,ix86_pmu, (i640, ?3244))写入 store-list 表。
[0207]第二步:分析所有中间代码文件中的保存select语句。
[0208]确定中间代码文件中的选择select语句,并确定select语句中的第二源变量、第三源变量和第二目的变量,进一步的根据第二代码文件确定第二目的变量对应的非临时变量,其中,非临时变量为第二目的变量传递的第二最终变量,第二代码文件为中间代码文件中位于select语句之后的代码,最后,将第二源变量与第二最终传递变量的对应关系以及第三源变量与第二最终传递变量的对应关系保存至函数指针保存表中,其中第二源变量和第三源变量为函数指针保存表中的目的函数。
[0209]其中,若第二目的变量传递的第二最终变量为全局变量,将第二源变量与全局变量的对应关系保存至函数指针保存表;
[0210]若第二目的变量传递的第二最终变量为形式参数,则判断参数传递表中是否保存与形式参数对应的实际参数,若参数传递表中保存与形式参数对应的实际参数,则将第二源变量与实际参数的对应关系保存至函数指针保存表;
[0211]若第二目的变量传递的第二最终变量为结构体,将第二源变量与结构体的对应关系保存至函数指针保存表。
[0212]由于select语句会有两个源变量和一个目的变量,为了和后面步骤中的源变量和目的变量进行区分,“select”操作的三个操作数,分别用第二源变量、第三源变量、第二目的变量表示,其中确定第二目的变量对应的非临时变量的方法与第一步中确定第一目的变量对应的非临时变量的方法相同,此处不再赘述,只是最终会将(第二源变量,第二最终变量)以及(第三源变量,第二最终变量)保存至store-list表中。
[0213]进一步的,若第一步和第二部中确定的临时变量为结构体,方法还包括:
[0214]第三步:首先确定中间代码文件中对函数指针类型表中的结构体执行内存拷贝操作的语句,然后确定内存拷贝操作语句中的源结构体与目的结构体,进一步的,确定函数指针保存表保存的结构体中与源结构体相同的第一结构体,最后,根据源结构体与目的结构体的对应关系更新函数指针保存表中保存的第一结构体为目的结构体。
[0215]按照上述所举的例子,搜索中间代码文件VMLinux.1R中所有关于func-ptr-type-list表中的结构体的内存拷贝操作(store指令、llvm.memcpy指令、memcpy函数等),也即,确定第一步和第二中确定的结构体最终传递的结构体,生成结构体保存向量(源结构体,目的结构体),此结构体保存向量中的源结构体为第一步和第二中确定的非临时变量对应的结构体,最后用目的结构体替换store-list表中的结构体,也即最终保存的为(第一源变量,目的结构体)、(第二源变量,目的结构体)、(第三源变量,目的结构体)。
[0216]例如,中间代码“store % struct.consw*ivga_con, % struct.consw**@conswitchp, align 8”是对两个结构体(指向结构体的指针)进行操作,贝Ij会生成结构体保存向量(@vga_con,Oconswitchp),用结构体Oconswitchp替换已经写入store-list表中的结构体@vga_con。
[0217]步骤203:根据反汇编代码文件和函数指针保存表确定中间结果表,中间结果表用于保存主调函数与主调函数中的间接函数调用语句以及目的函数的对应关系。
[0218]本过程从间接函数调用的语句作为出发点,通过分析中间代码中函数指针的传递过程,包括查询上节取得的store-list表,来确定函数指针的来源,即确定此处间接函数调用的目的函数名。
[0219]具体的,第一步:根据操作系统的内核源代码确定主调函数表,主调函数表中包括主调函数和主调函数中的间接函数调用语句,以下实施例中用callee-1 ist表代表主调函数表。
[0220]修改编译器的优化器模块,使用此工具生成所有包含间接函数调用的函数(主调函数)及主调函数中的间接函数调用语句,并将主调函数和主调函数中的间接函数调用语句保存至callee-list表。
[0221]例如,中间代码函数@pci_arch_init中有间接函数调用语句“ % 5 = tail call132% 2()”,则将(@pci_arch_init,% 5 = tail call i32% 2())写入 callee-list 表。
[0222]第二步:确定反汇编代码文件中是否包含主调函数,若包含,根据反汇编代码文件确定主调函数是否为内联函数的间接调用;若否,将主调函数和主调函数中的间接函数调用语句保存至真实主调函数表中;以下实施例中用true-callee-list表代表真实主调函数表。
[0223]从callee-list表中选出主调函数名出现在VMLinux.dump反汇编文件中的项,并删除掉内联函数的间接调用,生成true-callee-list表。
[0224]例如,callee-list表中有一个条目(@eisa_set_level_irq,% 16 = tailcall i8 asm sideeffect 〃inb${1:w},${0:b}〃,〃 = {ax}, N{dx},?{dirflag},?{fpsr},?{flags} " (i32 % 4) #2,! srcloc ! 0),指不函数 @eisa_set_level_irq 包含间接函数调用;但是在VMLinux.dump反汇编文件中,发现函数eisa_set_level_irq并没有执行间接函数调用,这是因为中间代码16 = tail call i8 asm sideeffect〃inb${1:w},${0:b}",〃 = {ax}, N{dx},?{dirflag},?{fpsr},?{flags} "(i32 %4) #2,! srcloc ! 0”是一个内联汇编语句,不是真正的间接函数调用,所以需要将此条记录删除。
[0225]第三步:根据真实主调函数表和中间文件代码,确定中间结果保存表,中间结果保存表用于保存主调函数与主调函数中的间接函数调用语句以及目的函数的对应关系;以下实施例中用ir-results-list表代表中间结果保存表。
[0226]首先根据函数指针保存表确定第二函数指针对应的目的函数,第二函数指针为真实主调函数表中保存的间接函数调用语句中的函数指针,然后将主调函数与主调函数中的间接函数调用语句以及目的函数保存至中间结果保存表。
[0227]对true-callee-list表中的所有间接调用中的临时变量内函数指针的传递过程,通过查询全局变量定义和store-list表,确定最终目的函数名;把间接函数调用的分析结果(主调函数,间接函数调用语句,目的函数)写入ir-results-list表中,如(―smp_x86_platform_ipi, void O 1,x86_platform_ipi_callback)。
[0228]步骤204:根据反汇编代码文件与中间结果表确定间接函数调用控制流程图。
[0229]其中,间接函数调用控制流程图包括间接函数控制流程图和间接函数的返回控制流程图两个部分。
[0230]第一步:确定间接函数控制流程图。
[0231]首先确定反汇编代码文件中的间接函数调用语句,然后根据中间结果表确定间接函数调用语句对应的第一目的函数,最后,根据间接函数调用语句和第一目的函数确定间接函数控制流程图。
[0232]第二步:确定间接函数的返回控制流程图。
[0233]首先确定反汇编代码文件中间接函数调用语句的下一条指令地址,然后根据下一条指令确定第一目的函数的返回地址,最后,根据第一目的函数和第一目的函数的返回地址确定间接函数的返回控制流程图。
[0234]第三步:根据间接函数控制流程图和间接函数的返回控制流程图确定间接函数调用控制流程图。
[0235]步骤104:根据反汇编代码文件确定直接函数控制流程图。
[0236]其中,直接函数调用控制流程图包括直接函数控制流程图和直接函数的返回控制流程图两个部分。
[0237]第一步:确定直接函数控制流程图。
[0238]首先确定反汇编代码中的直接函数调用指令语句,然后根据直接函数调用语句中的指令地址和第二目的函数确定直接函数控制流程图。
[0239]第二步:确定间接函数的返回控制流程图。
[0240]首先确定反汇编代码文件中直接函数调用语句的下一条指令地址,然后,根据下一条指令确定第二目的函数的返回地址,最后,根据第二目的函数和第二目的函数的返回地址确定直接函数的返回控制流程图。
[0241]第三步:根据直接函数控制流程图和直接函数的返回控制流程图确定直接函数调用控制流程图。
[0242]按照上述所举的例子,搜索VMLinux.dump文件中所有操作数为立即数的函数调用call指令,其指令地址和目的地址即为直接函数调用的控制流程。而被调用函数中的ret指令是执行函数返回的指令,ret指令的地址同样可以从VMLinux.dump文件中搜索得至IJ,而其返回地址是调用函数中调用被调用函数指令(即call指令)的下一条指令的地址。例如,下面的反汇编代码片段定义了调用函数run_init_process和被调用函数do_execve:
[0243]调用函数run—init—process 的定义:
[0244]ffffffff810001b0<run_init_process>:
[0245]ffffffff810001b0:55 push% rbp
[0246]......
[0247]ffffffff810001c9:e8 42 e9 Oa 00 callq ffffffff810aebl0<do_execve>
[0248]ffffffff810001ce: 5d pop % rbp
[0249]ffffffff810001cf:c3 retq
[0250]被调用函数do_execve的定义:
[0251]ffffffff810aebl0<do_execve>:
[0252]ffffffff810aebl0:55 push % rbp
[0253]......
[0254]ffffffff810aeb24:c3 retq
[0255]......
[0256]上面的反汇编代码中,run_init_process函数在地址ffffffff810001c9处执行了一个直接函数调用“call ffffffff810aebl0〈do_execve>”,调用了函数do_execve,由此可以此次直接函数调用的控制流程为:call:ffffffff810001c9 - >ffffffff810aebl0。
[0257]被调用函数do_execve执行完毕后,会在地址ffffffff810aeb24处执行ret指令返回到调用函数run_init_process中继续执行,其返回的具体地址为“callffffffff810aebl0〈do_execve>” 指令的下一条指令的地址,即 ffffffff810001ce,由此可以得到此次直接函数的返回控制流程为:ret:ffffffff810aeb24->ffffffff810001ce。
[0258]根据上述原理,遍历整个内核反汇编文件VMLinux.dump,可以获得内核中所有直接函数调用的控制流程和直接函数的返回控制流程。
[0259]值得注意的是,上述步骤204中根据反汇编代码文件与中间结果表确定间接函数调用控制流程图与步骤104中根据反汇编代码文件与中间结果表确定间接函数调用控制流程图相似,只是确定间接函数调用的控制流程图时需要在ir-results-list表查询真正对应的目的函数名。
[0260]步骤105:根据间接函数控制流程图和直接函数控制流程图确定内核控制流程图。
[0261]具体的,将间接函数调用控制流程图和直接函数调用控制流程图保存至内核控制流程图中。
[0262]本实施例提供的获取操作系统的内核控制流程图的方法,包括:首先对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件,并确定与操作系统的内核源代码对应的中间代码文件,然后根据反汇编代码文件和中间代码文件确定间接函数控制流程图,以及根据反汇编代码文件确定直接函数控制流程图,最后,根据间接函数控制流程图和直接函数控制流程图确定内核控制流程图。其中,通过反汇编代码文件和中间代码文件确定间接函数控制流程图,可以确定出细粒度的间接函数控制流程图,提高了控制流程图的准确度,从而有效消除对计算机的攻击。
[0263]图3为本发明实施例提供的获取操作系统的内核控制流程图的装置的结构示意图,如图3所示,装置包括:反汇编模块301、第一确定模块302、第二确定模块303、第三确定模块304和第四确定模块305,其中,
[0264]反汇编模块301,用于对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件;
[0265]第一确定模块302,用于根据操作系统的内核源代码确定与操作系统的内核源代码对应的中间代码文件;
[0266]第二确定模块303,用于根据反汇编代码文件和中间代码文件确定间接函数控制流程图;
[0267]第三确定模块304,用于根据反汇编代码文件确定直接函数控制流程图;
[0268]第四确定模块305,用于根据间接函数控制流程图和直接函数控制流程图确定内核控制流程图。
[0269]可选的,如图4所示,第二确定模块303具体包括:第一确定单元3031、第二确定单元3032、第三确定单元3033和第四确定单元3034,其中,
[0270]第一确定单元3031,用于根据反汇编代码文件和中间代码文件确定参数传递表,参数传递表用于保存函数名与形式参数的对应关系,以及函数名与实际参数的对应关系;
[0271]第二确定单元3032,用于根据中间代码文件和参数传递表确定函数指针保存表,函数指针保存表用于保存非临时变量与目的函数的对应关系;
[0272]第三确定单元3033,用于根据反汇编代码文件和函数指针保存表确定中间结果表,中间结果表用于保存主调函数与间接函数调用语句的对应关系,以及主调函数与目的函数的对应关系;
[0273]第四确定单元3034,用于根据反汇编代码文件与中间结果表确定间接函数调用控制流程图。
[0274]可选的,第一确定单元3031,具体用于:
[0275]根据反汇编代码文件和中间代码文件,确定函数表,函数表中包括函数名定义语句,函数名定义语句同时包含于反汇编代码文件和中间代码文件中;
[0276]根据中间代码文件确定函数指针类型表,函数指针类型表用于保存中间代码文件中包括函数指针类型的元素的结构体定义;
[0277]若函数名定义语句中包括结构体,且结构体包含于函数指针类型表,则将函数名定义语句中的函数名保存至函数传递指针表中;
[0278]确定函数传递指针表中的函数名在中间代码文件中被调用的语句;
[0279]根据被调用的语句确定与函数名对应的形式参数和与函数名对应的实际参数;
[0280]将函数名、与函数名对应的形式参数以及与函数名对应的实际参数保存至参数传递表中。
[0281]可选的,第二确定单元3032,具体用于:
[0282]确定中间代码文件中的保存store语句;
[0283]确定store语句中第一源变量和第一目的变量;
[0284]根据第一代码文件确定第一目的变量对应的非临时变量,第一代码文件为中间代码文件中位于store语句之后的代码,非临时变量为第一目的变量传递的第一最终变量;
[0285]将第一源变量与第一最终变量的对应关系保存至函数指针保存表中,其中第一源变量为函数指针保存表中的目的函数;
[0286]确定中间代码文件中的选择select语句;
[0287]确定select语句中的第二源变量、第三源变量和第二目的变量;
[0288]根据第二代码文件确定第二目的变量对应的非临时变量,第二代码文件为中间代码文件中位于select语句之后的代码,非临时变量为第二目的变量传递的第二最终变量;
[0289]将第二源变量与非临时变量的对应关系以及第三源变量与非临时变量的对应关系保存至函数指针保存表中,其中第二源变量和第三源变量为函数指针保存表中的目的函数。
[0290]可选的,若临时变量为结构体,第二确定单元3032还用于:
[0291]确定中间代码文件中对函数指针类型表中的结构体执行内存拷贝操作的语句;
[0292]确定内存拷贝操作语句中的源结构体与目的结构体;
[0293]确定函数指针保存表保存的结构体中与源结构体相同的第一结构体;
[0294]根据源结构体与目的结构体的对应关系更新函数指针保存表中保存的第一结构体为目的结构体。
[0295]可选的,若第一目的变量传递的第一最终变量为全局变量,将第一源变量与全局变量的对应关系保存至函数指针保存表;
[0296]若第一目的变量传递的第一最终变量为形式参数,则判断参数传递表中是否保存与形式参数对应的实际参数,若参数传递表中保存与形式参数对应的实际参数,则将第一源变量与实际参数的对应关系保存至函数指针保存表;
[0297]若第一目的变量传递的第一最终变量为结构体,将第一源变量与结构体的对应关系保存至函数指针保存表。
[0298]可选的,若第二目的变量传递的第二最终变量为全局变量,将第二源变量与全局变量的对应关系保存至函数指针保存表;
[0299]若第二目的变量传递的第二最终变量为形式参数,则判断参数传递表中是否保存与形式参数对应的实际参数,若参数传递表中保存与形式参数对应的实际参数,则将第二源变量与实际参数的对应关系保存至函数指针保存表;
[0300]若第二目的变量传递的第二最终变量为结构体,将第二源变量与结构体的对应关系保存至函数指针保存表。
[0301]可选的,第三确定单元3033,具体用于:
[0302]根据操作系统的内核源代码确定主调函数表,主调函数表中包括主调函数和主调函数中的间接函数调用语句;
[0303]确定反汇编代码文件中是否包含主调函数;
[0304]若反汇编代码文件中包含主调函数,根据反汇编代码文件确定主调函数是否为内联函数的间接调用;
[0305]若主调函数不是内联函数的间接调用,将主调函数和主调函数中的间接函数调用语句保存至真实主调函数表中;
[0306]根据真实主调函数表和中间文件代码,确定中间结果保存表,中间结果保存表用于保存主调函数与主调函数中的间接函数调用语句以及目的函数的对应关系。
[0307]可选的,第三确定单元3033,还用于:
[0308]根据函数指针保存表确定第二函数指针对应的目的函数,第二函数指针为真实主调函数表中保存的间接函数调用语句中的函数指针;
[0309]将主调函数与主调函数中的间接函数调用语句以及目的函数保存至中间结果保存表。
[0310]可选的,第三确定单元3033,还用于:
[0311]确定反汇编代码文件中的间接函数调用语句;
[0312]根据中间结果表确定间接函数调用语句对应的第一目的函数;
[0313]根据间接函数调用语句和第一目的函数确定间接函数控制流程图;
[0314]确定反汇编代码文件中间接函数调用语句的下一条指令地址;
[0315]根据下一条指令确定第一目的函数的返回地址;
[0316]根据第一目的函数和第一目的函数的返回地址确定间接函数的返回控制流程图;
[0317]根据间接函数控制流程图和间接函数的返回控制流程图确定间接函数调用控制流程图。
[0318]可选的,第三确定模块304,具体用于:
[0319]确定反汇编代码中的直接函数调用指令语句;
[0320]根据直接函数调用语句中的指令地址和第二目的函数确定直接函数控制流程图;
[0321]确定反汇编代码文件中直接函数调用语句的下一条指令地址;
[0322]根据下一条指令确定第二目的函数的返回地址;
[0323]根据第二目的函数和第二目的函数的返回地址确定直接函数的返回控制流程图;
[0324]根据直接函数控制流程图和直接函数的返回控制流程图确定直接函数调用控制流程图。
[0325]可选的,第四确定模块305,具体用于:
[0326]将间接函数调用控制流程图和直接函数调用控制流程图保存至内核控制流程图中。
[0327]本实施例的装置,可以用于执行图1所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
[0328]图5为本发明又一实施例提供的获取操作系统的内核控制流程图的装置的结构示意图,其中该装置可以包括:存储器401,处理器402,其中存储器401,用于存储指令;处理器402与存储器通信,用于运行存储器中的指令以执行实施例一中的处理通信事件的方法。具体地,
[0329]处理器402用于对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件;
[0330]处理器402用于根据操作系统的内核源代码确定与操作系统的内核源代码对应的中间代码文件;
[0331]处理器402用于根据反汇编代码文件和中间代码文件确定间接函数控制流程图;
[0332]处理器402用于根据反汇编代码文件确定直接函数控制流程图;
[0333]处理器402用于根据间接函数控制流程图和直接函数控制流程图确定内核控制流程图。
[0334]可选的,处理器402具体用于:
[0335]根据反汇编代码文件和中间代码文件确定参数传递表,参数传递表用于保存函数名与形式参数的对应关系,以及函数名与实际参数的对应关系;
[0336]根据中间代码文件和参数传递表确定函数指针保存表,函数指针保存表用于保存非临时变量与目的函数的对应关系;
[0337]根据反汇编代码文件和函数指针保存表确定中间结果表,中间结果表用于保存主调函数与间接函数调用语句的对应关系,以及主调函数与目的函数的对应关系;
[0338]根据反汇编代码文件与中间结果表确定间接函数调用控制流程图。
[0339]可选的,处理器402具体用于:
[0340]根据反汇编代码文件和中间代码文件,确定函数表,函数表中包括函数名定义语句,函数名定义语句同时包含于反汇编代码文件和中间代码文件中;
[0341]根据中间代码文件确定函数指针类型表,函数指针类型表用于保存中间代码文件中包括函数指针类型的元素的结构体定义;
[0342]若函数名定义语句中包括结构体,且结构体包含于函数指针类型表,则将函数名定义语句中的函数名保存至函数传递指针表中;
[0343]确定函数传递指针表中的函数名在中间代码文件中被调用的语句;
[0344]根据被调用的语句确定与函数名对应的形式参数和与函数名对应的实际参数;
[0345]将函数名、与函数名对应的形式参数以及与函数名对应的实际参数保存至参数传递表中。
[0346]可选的,处理器402具体用于:
[0347]确定中间代码文件中的保存store语句;
[0348]确定store语句中第一源变量和第一目的变量;
[0349]根据第一代码文件确定第一目的变量对应的非临时变量,第一代码文件为中间代码文件中位于store语句之后的代码,非临时变量为第一目的变量传递的第一最终变量;
[0350]将第一源变量与第一最终变量的对应关系保存至函数指针保存表中,其中第一源变量为函数指针保存表中的目的函数;
[0351]确定中间代码文件中的选择select语句;
[0352]确定select语句中的第二源变量、第三源变量和第二目的变量;
[0353]根据第二代码文件确定第二目的变量对应的非临时变量,第二代码文件为中间代码文件中位于select语句之后的代码,非临时变量为第二目的变量传递的第二最终变量;
[0354]将第二源变量与非临时变量的对应关系以及第三源变量与非临时变量的对应关系保存至函数指针保存表中,其中第二源变量和第三源变量为函数指针保存表中的目的函数。
[0355]可选的,若临时变量为结构体,处理器402还用于:
[0356]确定中间代码文件中对函数指针类型表中的结构体执行内存拷贝操作的语句;
[0357]确定内存拷贝操作语句中的源结构体与目的结构体;
[0358]确定函数指针保存表保存的结构体中与源结构体相同的第一结构体;
[0359]根据源结构体与目的结构体的对应关系更新函数指针保存表中保存的第一结构体为目的结构体。
[0360]可选的,若第一目的变量传递的第一最终变量为全局变量,将第一源变量与全局变量的对应关系保存至函数指针保存表;
[0361]若第一目的变量传递的第一最终变量为形式参数,则判断参数传递表中是否保存与形式参数对应的实际参数,若参数传递表中保存与形式参数对应的实际参数,则将第一源变量与实际参数的对应关系保存至函数指针保存表;
[0362]若第一目的变量传递的第一最终变量为结构体,将第一源变量与结构体的对应关系保存至函数指针保存表。
[0363]可选的,若第二目的变量传递的第二最终变量为全局变量,将第二源变量与全局变量的对应关系保存至函数指针保存表;
[0364]若第二目的变量传递的第二最终变量为形式参数,则判断参数传递表中是否保存与形式参数对应的实际参数,若参数传递表中保存与形式参数对应的实际参数,则将第二源变量与实际参数的对应关系保存至函数指针保存表;
[0365]若第二目的变量传递的第二最终变量为结构体,将第二源变量与结构体的对应关系保存至函数指针保存表。
[0366]可选的,处理器402,具体用于:
[0367]根据操作系统的内核源代码确定主调函数表,主调函数表中包括主调函数和主调函数中的间接函数调用语句;
[0368]确定反汇编代码文件中是否包含主调函数;
[0369]若反汇编代码文件中包含主调函数,根据反汇编代码文件确定主调函数是否为内联函数的间接调用;
[0370]若主调函数不是内联函数的间接调用,将主调函数和主调函数中的间接函数调用语句保存至真实主调函数表中;
[0371]根据真实主调函数表和中间文件代码,确定中间结果保存表,中间结果保存表用于保存主调函数与主调函数中的间接函数调用语句以及目的函数的对应关系。
[0372]可选的,处理器402,还用于:
[0373]根据函数指针保存表确定第二函数指针对应的目的函数,第二函数指针为真实主调函数表中保存的间接函数调用语句中的函数指针;
[0374]将主调函数与主调函数中的间接函数调用语句以及目的函数保存至中间结果保存表。
[0375]可选的,处理器402,还用于:
[0376]确定反汇编代码文件中的间接函数调用语句;
[0377]根据中间结果表确定间接函数调用语句对应的第一目的函数;
[0378]根据间接函数调用语句和第一目的函数确定间接函数控制流程图;
[0379]确定反汇编代码文件中间接函数调用语句的下一条指令地址;
[0380]根据下一条指令确定第一目的函数的返回地址;
[0381]根据第一目的函数和第一目的函数的返回地址确定间接函数的返回控制流程图;
[0382]根据间接函数控制流程图和间接函数的返回控制流程图确定间接函数调用控制流程图。
[0383]可选的,处理器402,具体用于:
[0384]确定反汇编代码中的直接函数调用指令语句;
[0385]根据直接函数调用语句中的指令地址和第二目的函数确定直接函数控制流程图;
[0386]确定反汇编代码文件中直接函数调用语句的下一条指令地址;
[0387]根据下一条指令确定第二目的函数的返回地址;
[0388]根据第二目的函数和第二目的函数的返回地址确定直接函数的返回控制流程图;
[0389]根据直接函数控制流程图和直接函数的返回控制流程图确定直接函数调用控制流程图。
[0390]可选的,处理器402,具体用于:
[0391]将间接函数调用控制流程图和直接函数调用控制流程图保存至内核控制流程图中。
[0392]本实施例的装置,可以用于执行图1所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
[0393]本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:只读存储记忆体(Read-Only Memory,ROM)、随机存储记忆体(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
[0394]最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
【主权项】
1.一种获取操作系统的内核控制流程图的方法,其特征在于,包括: 对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件; 根据所述操作系统的内核源代码确定与所述操作系统的内核源代码对应的中间代码文件; 根据所述反汇编代码文件和所述中间代码文件确定间接函数控制流程图; 根据所述反汇编代码文件确定直接函数控制流程图; 根据所述间接函数控制流程图和所述直接函数控制流程图确定内核控制流程图。2.根据权利要求1所述的方法,其特征在于,所述根据所述反汇编代码文件和所述中间代码文件确定间接函数调用控制流程图,包括: 根据所述反汇编代码文件和所述中间代码文件确定参数传递表,所述参数传递表用于保存函数名与形式参数的对应关系,以及所述函数名与实际参数的对应关系; 根据所述中间代码文件和所述参数传递表确定函数指针保存表,所述函数指针保存表用于保存非临时变量与目的函数的对应关系; 根据所述反汇编代码文件和所述函数指针保存表确定中间结果表,所述中间结果表用于保存主调函数与间接函数调用语句的对应关系,以及所述主调函数与目的函数的对应关系; 根据所述反汇编代码文件与所述中间结果表确定所述间接函数调用控制流程图。3.根据权利要求2所述的方法,其特征在于,所述根据所述反汇编代码文件和所述中间代码文件确定参数传递表,所述参数传递表用于保存函数名与形式参数的对应关系,以及所述函数名与实际参数的对应关系,包括: 根据所述反汇编代码文件和所述中间代码文件,确定函数表,所述函数表中包括函数名定义语句,所述函数名定义语句同时包含于所述反汇编代码文件和所述中间代码文件中; 根据所述中间代码文件确定函数指针类型表,所述函数指针类型表用于保存所述中间代码文件中包括函数指针类型的元素的结构体定义; 若所述函数名定义语句中包括结构体,且所述结构体包含于所述函数指针类型表,则将所述函数名定义语句中的函数名保存至函数传递指针表中; 确定所述函数传递指针表中的函数名在所述中间代码文件中被调用的语句; 根据所述被调用的语句确定与所述函数名对应的形式参数和与所述函数名对应的实际参数; 将所述函数名、与所述函数名对应的形式参数以及与所述函数名对应的实际参数保存至所述参数传递表中。4.根据权利要求2或3所述的方法,其特征在于,所述根据所述中间代码文件和所述参数传递表确定函数指针保存表,所述函数指针保存表用于保存非临时变量与目的函数的对应关系,包括: 确定所述中间代码文件中的保存store语句; 确定所述store语句中第一源变量和第一目的变量; 根据第一代码文件确定所述第一目的变量对应的非临时变量,所述第一代码文件为所述中间代码文件中位于所述store语句之后的代码,所述非临时变量为所述第一目的变量传递的第一最终变量; 将所述第一源变量与所述第一最终变量的对应关系保存至所述函数指针保存表中,其中所述第一源变量为所述函数指针保存表中的目的函数; 确定所述中间代码文件中的选择select语句; 确定所述select语句中的第二源变量、第三源变量和第二目的变量; 根据第二代码文件确定所述第二目的变量对应的非临时变量,所述第二代码文件为所述中间代码文件中位于所述select语句之后的代码,所述非临时变量为所述第二目的变量传递的第二最终变量; 将所述第二源变量与所述非临时变量的对应关系以及所述第三源变量与所述非临时变量的对应关系保存至所述函数指针保存表中,其中所述第二源变量和所述第三源变量为所述函数指针保存表中的目的函数。5.根据权利要求4所述的方法,其特征在于,若所述临时变量为结构体,所述方法还包括: 确定所述中间代码文件中对所述函数指针类型表中的结构体执行内存拷贝操作的语句; 确定所述内存拷贝操作语句中的源结构体与目的结构体; 确定所述函数指针保存表保存的结构体中与所述源结构体相同的第一结构体; 根据所述源结构体与目的结构体的对应关系更新所述函数指针保存表中保存的第一结构体为所述目的结构体。6.根据权利要求4所述的方法,其特征在于,包括: 若所述第一目的变量传递的第一最终变量为全局变量,将所述第一源变量与所述全局变量的对应关系保存至函数指针保存表; 若所述第一目的变量传递的第一最终变量为形式参数,则判断所述参数传递表中是否保存与所述形式参数对应的实际参数,若所述参数传递表中保存与所述形式参数对应的实际参数,则将所述第一源变量与所述实际参数的对应关系保存至函数指针保存表; 若所述第一目的变量传递的第一最终变量为结构体,将所述第一源变量与所述结构体的对应关系保存至函数指针保存表。7.根据权利要求4所述的方法,其特征在于,包括: 若所述第二目的变量传递的第二最终变量为全局变量,将所述第二源变量与所述全局变量的对应关系保存至函数指针保存表; 若所述第二目的变量传递的第二最终变量为形式参数,则判断所述参数传递表中是否保存与所述形式参数对应的实际参数,若所述参数传递表中保存与所述形式参数对应的实际参数,则将所述第二源变量与所述实际参数的对应关系保存至函数指针保存表; 若所述第二目的变量传递的第二最终变量为结构体,将所述第二源变量与所述结构体的对应关系保存至函数指针保存表。8.根据权利要求2至7任一项所述的方法,其特征在于,所述根据所述反汇编代码文件和所述函数指针保存表确定中间结果表,所述中间结果表用于保存主调函数与间接函数调用语句以及目的函数的对应关系,包括: 根据所述操作系统的内核源代码确定主调函数表,所述主调函数表中包括主调函数和所述主调函数中的间接函数调用语句; 确定所述反汇编代码文件中是否包含所述主调函数; 若所述反汇编代码文件中包含所述主调函数,根据所述反汇编代码文件确定所述主调函数是否为内联函数的间接调用; 若所述主调函数不是内联函数的间接调用,将所述主调函数和所述主调函数中的间接函数调用语句保存至真实主调函数表中; 根据所述真实主调函数表和所述中间文件代码,确定所述中间结果保存表,所述中间结果保存表用于保存主调函数与所述主调函数中的间接函数调用语句以及目的函数的对应关系。9.根据权利要求8所述的方法,其特征在于,所述根据所述真实主调函数表和所述中间文件代码,确定所述中间结果保存表,所述中间结果表用于保存主调函数与所述主调函数中的间接函数调用语句以及与所述主调函数对应的目的函数的对应关系,包括: 根据所述函数指针保存表确定第二函数指针对应的目的函数,所述第二函数指针为所述真实主调函数表中保存的所述间接函数调用语句中的函数指针; 将所述主调函数与所述主调函数中的间接函数调用语句以及所述目的函数保存至所述中间结果保存表。10.根据权利要求8所述的方法,其特征在于,所述根据所述反汇编代码文件与所述中间结果保存表确定所述间接函数调用控制流程图,包括: 确定所述反汇编代码文件中的间接函数调用语句; 根据所述中间结果表确定间接函数调用语句对应的第一目的函数; 根据所述间接函数调用语句和所述第一目的函数确定所述间接函数控制流程图; 确定所述反汇编代码文件中所述间接函数调用语句的下一条指令地址; 根据所述下一条指令确定所述第一目的函数的返回地址; 根据所述第一目的函数和所述第一目的函数的返回地址确定间接函数的返回控制流程图; 根据所述间接函数控制流程图和所述间接函数的返回控制流程图确定所述间接函数调用控制流程图。11.根据权利要求1-10任一项所述的方法,其特征在于,所述根据所述反汇编代码文件确定直接函数调用控制流程图,包括: 确定所述反汇编代码中的直接函数调用指令语句; 根据所述直接函数调用语句中的指令地址和第二目的函数确定直接函数控制流程图; 确定所述反汇编代码文件中所述直接函数调用语句的下一条指令地址; 根据所述下一条指令确定所述第二目的函数的返回地址; 根据所述第二目的函数和所述第二目的函数的返回地址确定直接函数的返回控制流程图; 根据所述直接函数控制流程图和所述直接函数的返回控制流程图确定所述直接函数调用控制流程图。12.根据权利要求10或11所述的方法,其特征在于,所述根据间接函数调用控制流程图和所述直接函数调用控制流程图确定内核控制流程图,包括: 将所述间接函数调用控制流程图和所述直接函数调用控制流程图保存至内核控制流程图中。13.一种获取操作系统的内核控制流程图的装置,其特征在于,包括: 反汇编模块,用于对操作系统的内核镜像文件进行代码反汇编得到反汇编代码文件;第一确定模块,用于根据所述操作系统的内核源代码确定与所述操作系统的内核源代码对应的中间代码文件; 第二确定模块,用于根据所述反汇编代码文件和所述中间代码文件确定间接函数控制流程图; 第三确定模块,用于根据所述反汇编代码文件确定直接函数控制流程图; 第四确定模块,用于根据所述间接函数控制流程图和所述直接函数控制流程图确定内核控制流程图。14.根据权利要求13所述的装置,其特征在于,所述第二确定模块具体包括: 第一确定单元,用于根据所述反汇编代码文件和所述中间代码文件确定参数传递表,所述参数传递表用于保存函数名与形式参数的对应关系,以及所述函数名与实际参数的对应关系; 第二确定单元,用于根据所述中间代码文件和所述参数传递表确定函数指针保存表,所述函数指针保存表用于保存非临时变量与目的函数的对应关系; 第三确定单元,用于根据所述反汇编代码文件和所述函数指针保存表确定中间结果表,所述中间结果表用于保存主调函数与间接函数调用语句的对应关系,以及所述主调函数与目的函数的对应关系; 第四确定单元,用于根据所述反汇编代码文件与所述中间结果表确定所述间接函数调用控制流程图。15.根据权利要求14所述的装置,其特征在于,所述第一确定单元,具体用于: 根据所述反汇编代码文件和所述中间代码文件,确定函数表,所述函数表中包括函数名定义语句,所述函数名定义语句同时包含于所述反汇编代码文件和所述中间代码文件中; 根据所述中间代码文件确定函数指针类型表,所述函数指针类型表用于保存所述中间代码文件中包括函数指针类型的元素的结构体定义; 若所述函数名定义语句中包括结构体,且所述结构体包含于所述函数指针类型表,则将所述函数名定义语句中的函数名保存至函数传递指针表中; 确定所述函数传递指针表中的函数名在所述中间代码文件中被调用的语句; 根据所述被调用的语句确定与所述函数名对应的形式参数和与所述函数名对应的实际参数; 将所述函数名、与所述函数名对应的形式参数以及与所述函数名对应的实际参数保存至所述参数传递表中。16.根据权利要求14或15所述的装置,其特征在于,所述第二确定单元,具体用于: 确定所述中间代码文件中的保存store语句; 确定所述store语句中第一源变量和第一目的变量; 根据第一代码文件确定所述第一目的变量对应的非临时变量,所述第一代码文件为所述中间代码文件中位于所述store语句之后的代码,所述非临时变量为所述第一目的变量传递的第一最终变量; 将所述第一源变量与所述第一最终变量的对应关系保存至所述函数指针保存表中,其中所述第一源变量为所述函数指针保存表中的目的函数; 确定所述中间代码文件中的选择select语句; 确定所述select语句中的第二源变量、第三源变量和第二目的变量; 根据第二代码文件确定所述第二目的变量对应的非临时变量,所述第二代码文件为所述中间代码文件中位于所述select语句之后的代码,所述非临时变量为所述第二目的变量传递的第二最终变量; 将所述第二源变量与所述非临时变量的对应关系以及所述第三源变量与所述非临时变量的对应关系保存至所述函数指针保存表中,其中所述第二源变量和所述第三源变量为所述函数指针保存表中的目的函数。17.根据权利要求16所述的装置,其特征在于,若所述临时变量为结构体,所述第二确定单元还用于: 确定所述中间代码文件中对所述函数指针类型表中的结构体执行内存拷贝操作的语句; 确定所述内存拷贝操作语句中的源结构体与目的结构体; 确定所述函数指针保存表保存的结构体中与所述源结构体相同的第一结构体; 根据所述源结构体与目的结构体的对应关系更新所述函数指针保存表中保存的第一结构体为所述目的结构体。18.根据权利要求16所述的装置,其特征在于,包括: 若所述第一目的变量传递的第一最终变量为全局变量,将所述第一源变量与所述全局变量的对应关系保存至函数指针保存表; 若所述第一目的变量传递的第一最终变量为形式参数,则判断所述参数传递表中是否保存与所述形式参数对应的实际参数,若所述参数传递表中保存与所述形式参数对应的实际参数,则将所述第一源变量与所述实际参数的对应关系保存至函数指针保存表; 若所述第一目的变量传递的第一最终变量为结构体,将所述第一源变量与所述结构体的对应关系保存至函数指针保存表。19.根据权利要求16所述的装置,其特征在于,包括: 若所述第二目的变量传递的第二最终变量为全局变量,将所述第二源变量与所述全局变量的对应关系保存至函数指针保存表; 若所述第二目的变量传递的第二最终变量为形式参数,则判断所述参数传递表中是否保存与所述形式参数对应的实际参数,若所述参数传递表中保存与所述形式参数对应的实际参数,则将所述第二源变量与所述实际参数的对应关系保存至函数指针保存表; 若所述第二目的变量传递的第二最终变量为结构体,将所述第二源变量与所述结构体的对应关系保存至函数指针保存表。20.根据权利要求14至19任一项所述的装置,其特征在于,所述第三确定单元,具体用于: 根据所述操作系统的内核源代码确定主调函数表,所述主调函数表中包括主调函数和所述主调函数中的间接函数调用语句; 确定所述反汇编代码文件中是否包含所述主调函数; 若所述反汇编代码文件中包含所述主调函数,根据所述反汇编代码文件确定所述主调函数是否为内联函数的间接调用; 若所述主调函数不是内联函数的间接调用,将所述主调函数和所述主调函数中的间接函数调用语句保存至真实主调函数表中; 根据所述真实主调函数表和所述中间文件代码,确定所述中间结果保存表,所述中间结果保存表用于保存主调函数与所述主调函数中的间接函数调用语句以及目的函数的对应关系。21.根据权利要求20所述的装置,其特征在于,所述第三确定单元,还用于: 根据所述函数指针保存表确定第二函数指针对应的目的函数,所述第二函数指针为所述真实主调函数表中保存的所述间接函数调用语句中的函数指针; 将所述主调函数与所述主调函数中的间接函数调用语句以及所述目的函数保存至所述中间结果保存表。22.根据权利要求20所述的装置,其特征在于,所述第三确定单元,还用于: 确定所述反汇编代码文件中的间接函数调用语句; 根据所述中间结果表确定间接函数调用语句对应的第一目的函数; 根据所述间接函数调用语句和所述第一目的函数确定所述间接函数控制流程图; 确定所述反汇编代码文件中所述间接函数调用语句的下一条指令地址; 根据所述下一条指令确定所述第一目的函数的返回地址; 根据所述第一目的函数和所述第一目的函数的返回地址确定间接函数的返回控制流程图; 根据所述间接函数控制流程图和所述间接函数的返回控制流程图确定所述间接函数调用控制流程图。23.根据权利要求13至22任一项所述的装置,其特征在于,所述第三确定模块,具体用于: 确定所述反汇编代码中的直接函数调用指令语句; 根据所述直接函数调用语句中的指令地址和第二目的函数确定直接函数控制流程图; 确定所述反汇编代码文件中所述直接函数调用语句的下一条指令地址; 根据所述下一条指令确定所述第二目的函数的返回地址; 根据所述第二目的函数和所述第二目的函数的返回地址确定直接函数的返回控制流程图; 根据所述直接函数控制流程图和所述直接函数的返回控制流程图确定所述直接函数调用控制流程图。24.根据权利要求22或23所述的装置,其特征在于,所述第四确定模块,具体用于: 将所述间接函数调用控制流程图和所述直接函数调用控制流程图保存至内核控制流程图中。
【文档编号】G06F9/44GK105988811SQ201510085668
【公开日】2016年10月5日
【申请日】2015年2月17日
【发明人】李金库, 张相锋, 涂彬
【申请人】华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1