一种函数编译方法及装置与流程

文档序号:14346943阅读:256来源:国知局
本发明涉及计算机领域,尤其涉及一种函数编译方法及装置。
背景技术
::一份linux内核源代码是由成百上千,甚至是由上万、上百万个函数构成的,这些函数所对应的源代码可能会分布在不同的文件中。对于某一源文件中的某一目标函数而言,它可能需要调用一些全局变量、其他函数、头文件中包含的宏定义和内联(inline)函数等依赖内容,才能实现对应的功能。在现有技术中,当该目标函数调用依赖内容时,如果只是想要单独编译该某目标函数,为了让编译器能够找到这些依赖内容,往往只能通过整体编译内核源代码的方式来实现,编译速度非常慢。可见,现有技术中并不存在一种单独编译函数源代码的方法。技术实现要素:有鉴于此,本发明实施例提供一种函数编译方法及装置,主要目的在于在单独编译特定函数时,能够加快编译速度。为达到上述目的,本发明实施例主要提供如下技术方案:第一方面,本发明实施例提供一种函数编译方法,所述方法包括:获得目标函数的源代码以及用于编译所述目标函数的源代码的编译指令;执行所述编译指令,从所述目标函数的源代码中,确定所述目标函数所使用的依赖内容,并获取所述依赖内容对应的声明语句,其中,所述依赖内容至少为被调用函数、变量或者宏中的一种或者多种;基于所述依赖内容对应的声明语句,按照预设策略,对所述目标函数的源代码进行预处理;编译预处理后的所述目标函数的源代码,获得实现所述目标函数功能的二进制文件。第二方面,本发明实施例提供一种漏洞检测方法,所述方法包括:在检测到内核漏洞时,获取触发所述内核漏洞的问题函数的源代码;从所述问题函数的源代码中,获取所述问题函数对应的输入参数;通过上述函数编译方法,对所述源代码进行编译,生成所述问题函数对应的内核模块;基于所述输入参数,运行所述内核模块,重新确认是否存在所述内核漏洞。第三方面,本发明实施例提供一种函数编译装置,所述装置包括:获得单元、执行单元、预处理单元以及编译单元,其中,所述获得单元,用于获得目标函数的源代码以及用于编译所述目标函数的源代码的编译指令;所述执行单元,用于执行所述编译指令,从所述目标函数的源代码中,确定所述目标函数所使用的依赖内容,其中,所述依赖内容至少为被调用函数、变量或者宏中的一种或者多种;所述预处理单元,用于基于所述依赖内容的特征信息,按照预设策略,对所述目标函数的源代码进行预处理;所述编译单元,用于编译预处理后的所述目标函数的源代码,获得实现所述目标函数功能的二进制文件。第四方面,本发明实施例提供一种漏洞检测装置,所述装置包括:第一获取单元、第二获取单元、生成单元以及确认单元,其中,所述第一获取单元,用于在检测到内核漏洞时,获取触发所述内核漏洞的问题函数的源代码;所述第二获取单元,用于从所述问题函数的源代码中,获取所述问题函数对应的输入参数;所述生成单元,用于通过上述函数编译方法,对所述源代码进行编译,生成所述问题函数对应的内核模块;所述确认单元,用于基于所述输入参数,运行所述内核模块,重新确认是否存在所述内核漏洞。第五方面,本发明实施例提供一种存储介质,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述方法。第六方面,本发明实施例提供一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述方法。本发明实施例提供的一种函数编译方法及装置,在获得目标函数的源代码以及用于编译目标函数的源代码的编译指令之后,就会执行编译指令,从目标函数的源代码中,确定目标函数所使用的依赖内容,并获取依赖内容对应的声明语句,其中,依赖内容至少为被调用函数、变量或者宏中的一种或者多种,然后,基于依赖内容对应的声明语句,按照预设策略,对目标函数的源代码进行预处理,最后,编译预处理后的目标函数的源代码,获得实现该目标函数功能的二进制文件。这样,由于在编译目标函数的源代码前,先根据目标函数所调用的依赖内容,对目标函数的源代码进行了预处理,将编译该源代码所需的依赖内容添加到了该源代码中或者声明在编译过程中不需要查找依赖内容的实现语句,那么,与通过编译器来编译整个内核源代码的方式相比,可以大大减少了编译器所编译的代码量,从而,不但能够加快编译速度,还能够实现单独编译目标函数,获得该目标函数的最小实现。附图说明通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:图1示出了本发明实施例一中的函数编译方法的流程示意图;图2示出了本发明实施例二中的漏洞检测方法的流程示意图;图3示出了本发明实施例三中的函数编译装置的结构示意图;图4示出了本发明实施例四中的漏洞检测装置的结构示意图;图5示出了本发明实施例五中的函数编译设备的结构示意图。具体实施方式下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。实施例一本发明实施例提供一种函数编译方法,该函数编译方法可以应用于内核源代码中的某一个目标函数使用了依赖内容,如全局变量、宏、内联函数、有符号函数等情况下,各种需要对该目标函数进行单独编译的场合,如编译内核漏洞对应的问题函数、对内核源代码中的某一函数制作补丁、想要将内核中的某一函数替换为更新后的某一函数、想要获取目标函数的最小实现对应的二进制代码的文件等。在实际应用中,一份内核源码中包含许多函数,对于某一函数而言,它可以用到一些依赖内容,如使用全局变量、调用其它函数或者使用头文件中包含的宏和内联函数等。如果整体编译内核代码时,编译器能够找到每个函数的依赖内容的。但是如果只编译这一个函数,编译器无法找到这些依赖内容,就会报错。假如某一函数有问题,想要将这个函数直接替换了,这个时候,是不需要通过编译整个内核来获取这个函数的实现的,只用编译这一个函数就可以。为了解决单独编译一个函数的问题,实现通过最小的代码量,来拿到某一函数的二进制代码,可以对目标函数的源代码进行先预处理,来实现将某个函数单独编译成功。那么,图1为本发明实施例一中的函数编译方法的流程示意图,参见图1所示,该函数编译方法包括:s101:获得目标函数的源代码以及用于编译目标函数的源代码的编译指令;具体地,当需要对内核中的某一目标函数进行单独编译,获取该目标函数的最小实现时,就可以获得用于编译该目标函数的源代码的编译指令,并从内核的源代码中,获取该目标函数的源代码。在实际应用中,编译是指将源代码编译为二进制代码,生成一个内核模块。s102:执行编译指令,从目标函数的源代码中,确定目标函数所使用的依赖内容,并获取目标函数对应的声明语句;在具体实施过程中,由于目标函数可能会使用依赖内容,在获得了用于编译该目标函数的源代码的编译指令后,就可以响应于该编译指令,先从目标函数的源代码中,确定出该目标函数所使用的依赖内容都有哪些。其中,依赖内容至少为被调用函数、变量或者宏(macro)。当然,依赖内容还可以为其它,如符号常量,这里,本发明实施例不做具体限定。在实际应用中,目标函数可以同时调用被调用函数、变量或者宏中的一种或多种。这里,函数是一组一起执行某一任务的语句,通过调用其它函数来完成已定义的任务。目标函数所调用的函数即为被调用函数。宏是指通过预处理指令define所创建的特殊常量。声明语句用于定义被调用函数、变量或宏。示例性地,参见下表1所示,表1给出了目标函数的源代码的实例1,其中,main()函数为目标函数;max(intnum1,intnum2)函数为被调用函数,intmax(intnum1,intnum2)为max()函数对应的函数声明;min(a,b)为宏,#definemin(a,b)(a<b?a:b)为宏min(a,b)对应的宏定义;i、j、result等为变量,inti=100等为变量对应的变量声明。表1s103:基于依赖内容对应的声明语句,按照预设策略,对目标函数的源代码进行预处理;具体地,在确定出目标函数所使用的依赖内容,并获得了该依赖内容对应的声明语句后,就可以根据不同类型的依赖内容,对目标函数的源代码进行预处理。这样,就可以获得预处理后的目标函数的源代码。以便编译器进行编译时,能够找到目标函数所使用的依赖内容,或者,不用去寻找该目标函数所使用的依赖内容,从而,在编译时,编译器就不会出现因为找不到依赖内容而停止编译的情况。在具体实施过程中,当依赖内容具体为被调用函数、变量或宏来实现时,根据依赖内容的类型的不同,基于依赖内容对应的声明语句,按照预设策略,对目标函数的源代码进行预处理的方法,可以包括且不限于以下三种情况。第一种情况,在确定目标函数所使用的依赖内容为被调用函数时,可以根据该被调用函数是否为内联函数,来确定对目标函数的源代码进行处理的方法。首先,在本发明实施例中,上述s103可以包括:当依赖内容为被调用函数时,根据被调用函数对应的函数声明,判断被调用函数是否为内联函数;如果确定被调用函数为内联函数,获取被调用函数的源代码,并将源代码复制到目标函数的源代码中。具体地,当目标函数所调用的依赖内容为内联函数时,就可以直接将该内联函数的源代码,即该内联函数的实现语句,直接复制到目标函数调用该内联函数的地方。这样,在编译阶段,编译器遇到该内联函数时,就可以直接找到内联函数的定义,从而,编译器就不会出现因为找不到内联函数的定义而停止编译的情况。在实际应用中,内联函数可以是指通过关键字inline所声明的函数,即,内联函数对应的函数声明中包含inline。也就是说,如果想把一个函数定义为内联函数,则需要在该函数的函数名前面添加inline。因此,可以通过该被调用函数的函数声明中是否包含inline,来确定该被调用函数是否为内联函数。当然,根据编写源代码所使用的语言的不同,还可以通过其它关键字,如define来声明内联函数,本发明实施例不做具体限定。示例性地,参见下表2所示,表2给出了目标函数的源代码的实例2,其中,f()函数为内联函数。表2其次,在确定被调用函数并非内联函数后,可以根据该被调用函数是否调用符号,来确定对目标函数的源代码进行处理的方法。在具体实施过程中,上述函数编译方法还可以包括:如果确定被调用函数不是内联函数,判断被调用函数是否调用符号,其中,符号为变量或函数中的一种或多种;如果确定被调用函数未调用符号,获取被调用函数的源代码,并将源代码复制到目标函数的源代码中。具体地,当目标函数所调用的被调用函数并未调用符号,即目标函数所调用的依赖内容为无符号函数时,就可以直接将该被调用函数的源代码,即该无符号函数的实现语句,直接复制到目标函数调用该无符号函数的地方。这样,在编译阶段,编译器遇到该被调用函数时,就可以直接找到被调用函数的定义,从而,编译器就不会出现因为找不到被调用函数的定义而停止编译的情况。进一步地,在确定被调用函数调用符号后,根据该被调用函数所调用符号的属性,来确定对目标函数的源代码进行处理的方法。在具体实施过程中,上述函数编译方法还可以包括:如果确定被调用函数调用符号,获取编译内核时生成的内核符号表;基于内核符号表,判断被调用函数所调用的符号是导出符号,还是非导出符号;如果被调用函数所调用的符号为非导出符号,在目标函数的源代码中,使用extern关键字,将非导出符号声明为extern;如果被调用函数所调用的符号为导出符号,在目标函数的源代码中,添加导出符号对应的头文件。具体地,当目标函数所调用的被调用函数调用了符号,即目标函数所调用的依赖内容为有符号函数时,一方面,由于非导出符号不能被其它内核模块(除定义该非导出符号的内核模块以外的)使用,那么,如果该被调用函数所调用的符号为非导出符号,就可以将该被调用函数声明为extern,这样,在编译阶段,编译器遇到该被调用函数时,就不用检测该被调用函数的定义,从而,编译器就不会因为找不到该被调用函数的定义而停止编译。另一方面,由于导出符号能够被其它内核模块(除定义该导出符号的内核模块以外的)使用,那么,如果该被调用函数所调用的符号为导出符号,就可以在目标函数的源代码中,添加包含有该导出符号的头文件(定义该导出符号的内核模块),这样,在编译阶段,编译器遇到该被调用函数时,就可以从所添加的头文件中找到该被调用函数的定义,从而,编译器就不会因为找不到该被调用函数的定义而停止编译。在实际应用中,内核符号也可以简称为符号,它是指内核源代码或者内核源代码中所使用的变量或函数。linux内核将内核符号分为导出符号和非导出符号两种,每个内核模块只能调用导出符号,而不能调用非导出符号。导出符号是指标记为export的内核符号,可以被内核模块使用;而非导出符号是指未标记为export的内核符号,不能被内核模块使用。内核符号表(kernelsymboltable)是用于存储内核中所有内核符号及其对应地址的一个列表,是内核符号的索引文件。这里,关键字extern可以置于变量或者函数前,用来以标示变量或者函数的定义在别的文件中。这样,在编译阶段,提示编译器遇到此变量和函数时,不用检测,也不用报错,从而,编译器就不会因为找不到这些变量和函数而停止编译。第二种情况,在确定目标函数所使用的依赖内容为被调用函数时,可以根据该被调用函数是否为内联函数,来确定对目标函数的源代码进行处理的方法。在本发明实施例中,上述s103可以包括:当依赖内容为变量时,根据变量对应的变量声明,判断变量是否为全局变量;如果变量为全局变量,在目标函数的源代码中,使用extern关键字,将全局变量声明为extern。具体地,当目标函数所使用的变量为全局变量时,就可以将该全局变量声明为extern,这样,在编译阶段,编译器遇到该全局变量时,就不用检测该全局变量的定义,从而,编译器就不会因为找不到该全局变量的定义而停止编译。这里,局部变量是指在函数内部声明的变量,局部变量是这个函数私有的,只能被函数内部的语句使用。全局变量是指在所有函数外部定义的变量(通常是在程序的头部),全局变量可以被任何函数访问。示例性地,参见下表3所示,表3给出了目标函数的源代码的实例3,其中,g为全局变量,c为局部变量。表3第三种情况,在确定目标函数所使用的依赖内容为被调用函数时,可以根据该被调用函数是否为内联函数,来确定对目标函数的源代码进行处理的方法。在本发明实施例中,上述s103可以包括:当依赖内容为宏时,从宏对应的宏定义中,获取宏对应的实现语句;将目标函数的源代码中所使用的宏替换为实现语句。具体地,当目标函数所调用的依赖内容为宏时,就可以直接将该宏对应的实现语句,直接复制到目标函数调用该宏的地方。这样,在编译阶段,编译器遇到该宏时,就可以直接找到该宏的实现语句,从而,编译器就不会出现因为找不到宏的实现而停止编译的情况。s104:编译预处理后的目标函数的源代码,获得实现目标函数功能的二进制文件。具体地,在对目标函数的源代码进行预处理后,就实现了将目标函数所调用的依赖内容所对应的实现程序加入到该目标函数的源代码中,或者,声明不需要找到该依赖内容的实现语句,从而,编译器对预处理后的目标函数的源代码进行编译时,就可以完成编译过程,这样,就可以获得实现该目标函数功能对应的二进制文件。至此,便完成了对目标函数的编译过程。由上述内容可知,本发明实施例所提供的函数编译方法,在获得目标函数的源代码以及用于编译目标函数的源代码的编译指令之后,就会执行编译指令,从目标函数的源代码中,确定目标函数所使用的依赖内容,并获取依赖内容对应的声明语句,其中,依赖内容至少为被调用函数、变量或者宏中的一种或者多种,然后,基于依赖内容对应的声明语句,按照预设策略,对目标函数的源代码进行预处理,最后,编译预处理后的目标函数的源代码。这样,由于在编译目标函数的源代码前,先根据目标函数所调用的依赖内容,对目标函数的源代码进行了预处理,将编译该源代码所需的依赖内容添加到了该源代码中或者声明在编译过程中不需要查找依赖内容的实现语句,那么,与通过编译器来编译整个内核源代码的方式相比,可以大大减少了编译器所编译的代码量,从而,不但能够加快编译速度,还能够通过编译最小的代码量,实现单独编译目标函数,获得最小实现目标函数功能的二进制代码。实施例二基于同一发明构思,本实施例提供一种漏洞检测方法,应用于以下场景:在发生内核漏洞时,需要快速地确认内核漏洞是否存在。一般地,在进行内核的内核漏洞检测过程中,如果出现了内核漏洞,就会生成对应的告警数据,从而,就可以确定出触发该内核漏洞的问题函数。接下来,为了确认该内核漏洞是否真实存在,需要系统调用的参数加上系统调用,这两个来尝试触发这个漏洞,来最终检测这个内核有没有这个漏洞。具体地,首先,就需要查找该问题函数的调用者,然后再查找调用者的调用者,这样,依次查找,直到返回到用户态系统调用接口为止;其次,还需要构造触发该问题函数缺陷代码执行的参数,同查找函数调用者一样,直到构成出能够触发函数缺陷代码执行的用户态系统调用接口参数为止。在这个过程中,由于内核函数数量庞大,调用关系错综复杂,数据结构复杂,所以查找到用户态的触发内核漏洞的问题函数对应的系统调用和系统调用的参数是十分困难的。为了克服上述问题,本发明实施例提供一种漏洞检测方法,图2为本发明实施例二中的漏洞检测方法的流程示意图,参见图2所示,该漏洞检测方法包括:s201:在检测到内核漏洞时,获取触发内核漏洞的问题函数的源代码;具体地,在对内核进行内核漏洞检测的过程中,如果出现了内核漏洞,就可以根据该内核漏洞对应的告警信息,从内核的源代码中,获取触发该内核漏洞的问题函数的源代码。s202:从问题函数的源代码中,获取问题函数对应的输入参数;具体地,在获得了问题函数的源代码后,首先要从该问题函数的源代码中,获取到该问题函数对应的输入参数。这里,该输入参数是指问题函数对应的直接输入参数,而不是调用该问题函数的系统调用对应的参数。这样,就不需要一次查找各个调用关系,就可以直接从该问题函数的源代码中获取该输入参数,从而,就可以简化获取该输入参数的过程,方便操作,同时,还能够减少获取的失败率和错误率。s203:通过上述函数编译方法,对源代码进行编译,生成问题函数对应的内核模块;具体地,除了需要获取该问题函数对应的输入参数外,还需要获取该问题函数对应的内核模块,这里,就可以使用实施例一中所提供的函数编译方法,单独对该问题函数的源代码进行编译,生成能够直接调用该问题函数的内核模块,这样,就获得了该问题函数对应的内核模块。其中,内核模块是具有独立功能的程序,它可以被传入参数,被链接到内核作为内核的一部分在内核空间中运行。这里,由于采用实施例一中的函数编译方法,能够实现对问题函数进行单独编译,这样,就不需要查找调用该问题函数的系统调用,从而,可以简化获取调用该问题函数的内核模块的过程,进一步方便操作。s204:基于输入参数,运行内核模块,重新确认是否存在内核漏洞。具体地,为了确认内核漏洞是否真实存在,可以通过基于该输入参数来运行内核模块的方式,来复现内核漏洞,以便重现确认存在该内核漏洞。在本发明其它实施例中,当采用复现内核漏洞的方式来确认内核漏洞是否真实存在时,s104可以包括:将输入参数输入到内核模块;运行内核模块调用问题函数,复现内核漏洞;如果成功复现出该内核漏洞,确定该内核漏洞存在;如果并未复现出该内核漏洞,确定该内核漏洞不存在。具体地,内核漏洞确认自动化是将问题函数的输入参数输入到该问题函数对应的内核模块中,通过内核模块直接调用问题函数的方式实现的。在获得输入参数和内核模块后,就可以将输入参数输入到内核模块,然后运行内核模块调用问题函数,来尝试复现内核漏洞,以便判断该内核漏洞是否真实存在。这里,如果成功复现出内核漏洞,就可以确定内核漏洞是真实存在的,如果并未复现出该内核漏洞,就可以确定该内核漏洞不是真实存在的,从而,完成了内核漏洞的自动确认。至此,便完成了内核漏洞的检测过程。由上述内容可知,本发明实施例所提供的漏洞检测方法,首先,在检测到出现内核漏洞时,获取触发内核漏洞的问题函数的源代码,然后,就会从问题函数的源代码中,获取问题函数对应的输入参数,并通过上述实施例一中的函数编译方法,对问题函数的源代码进行编译,生成该问题函数对应的内核模块,最后,就可以基于输入参数,运行内核模块,重新确认是否存在内核漏洞。由于是通过问题函数对应的内核模块以及输入参数,直接来调用问题函数来确认是否存在内核漏洞的,这样,由于不需要走系统调用,那么,也就不需要一层层地查找调用该问题函数的系统调用和该系统调用对应的参数,从而,简化了查找过程,能够提高内核漏洞确认及时性以及节省确认内核漏洞的时间。实施例三基于同一发明构思,作为对上述函数编译方法的实现,本发明实施例提供了一种函数编译装置,该装置实施例与前述方法实施例对应,为便于阅读,本装置实施例不再对前述方法实施例中的细节内容进行逐一赘述,但应当明确,本实施例中的装置能够对应实现前述方法实施例中的全部内容。图3为本发明实施例三中的函数编译装置的结构示意图,参见图3所示,该函数编译装置30包括:获得单元301、执行单元302、预处理单元303以及编译单元304,其中,获得单元301,用于获得目标函数的源代码以及用于编译目标函数的源代码的编译指令;执行单元302,用于执行编译指令,从目标函数的源代码中,确定目标函数所使用的依赖内容,并获取依赖内容对应的声明语句,其中,依赖内容至少为被调用函数、变量或者宏中的一种或者多种;预处理单元303,用于基于依赖内容对应的声明语句,按照预设策略,对目标函数的源代码进行预处理;编译单元304,用于编译预处理后的目标函数的源代码,获得实现目标函数功能的二进制文件。在本发明实施例中,预处理单元,用于当依赖内容为被调用函数时,根据被调用函数对应的函数声明,判断被调用函数是否为内联函数;如果确定被调用函数为内联函数,获取被调用函数的源代码,并将源代码复制到目标函数的源代码中。在本发明实施例中,预处理单元,还用于如果确定被调用函数不是内联函数,判断被调用函数是否调用符号,其中,符号为变量或函数中的一种或多种;如果确定被调用函数未调用符号,获取被调用函数的源代码,并将源代码复制到目标函数的源代码中。在本发明实施例中,预处理单元,还用于如果确定被调用函数调用符号,获取编译内核时生成的内核符号表;基于内核符号表,判断被调用函数所调用的符号是否为导出符号;如果被调用函数所调用的符号为导出符号,在目标函数的源代码中,添加导出符号对应的头文件;如果被调用函数所调用的符号为非导出符号,在目标函数的源代码中,使用extern关键字,将非导出符号声明为extern。在本发明实施例中,预处理单元,用于当依赖内容为变量时,根据变量对应的变量声明,判断变量是否为全局变量;如果变量为全局变量,在目标函数的源代码中,使用extern关键字,将全局变量声明为extern。在本发明实施例中,预处理单元,还用于当依赖内容为宏时,从宏对应的宏定义中,获取宏对应的实现语句;将目标函数的源代码中所使用的宏替换为实现语句。上述函数编译装置包括处理器和存储器,上述获得单元、执行单元、预处理单元以及编译单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。上述处理器可由中央处理器(centralprocessingunit,cpu)、微处理器(microprocessorunit,mpu)、数字信号处理器(digitalsignalprocessor,dsp)、或现场可编程门阵列(fieldprogrammablegatearray,fpga)等实现。存储器可能包括计算机可读介质中的非永久性存储器,随机存储器(randomaccessmemory,ram)和/或非易失性内存等形式,如只读存储器(readonlymemory,rom)或闪存(flashram),存储器包括至少一个存储芯片。基于同一发明构思,本发明实施例提供一种存储介质,其上存储有程序,该程序被处理器执行时实现上述函数编译方法。基于同一发明构思,本发明实施例提供一种处理器,处理器用于运行程序,其中,程序运行时执行上述函数编译方法。在实际应用中,该函数编译装置可应用于终端中。终端可以以各种形式来实施。例如,本发明中描述的终端可以包括诸如手机、平板电脑、笔记本电脑、掌上电脑、个人数字助理(personaldigitalassistant,pda)、便捷式媒体播放器(portablemediaplayer,pmp)、导航装置、可穿戴设备、智能手环、计步器等移动终端,以及诸如数字tv、台式计算机、服务器等固定终端。实施例四基于同一发明构思,作为对上述漏洞检测方法的实现,本发明实施例提供了一种漏洞检测装置,该装置实施例与前述方法实施例对应,为便于阅读,本装置实施例不再对前述方法实施例中的细节内容进行逐一赘述,但应当明确,本实施例中的装置能够对应实现前述方法实施例中的全部内容。图4为本发明实施例四中的漏洞检测装置的结构示意图,参见图4所示,该漏洞检测装置40包括:第一获取单元401、第二获取单元402、生成单元403以及确认单元404,其中,第一获取单元401,用于在检测到内核漏洞时,获取触发内核漏洞的问题函数的源代码;第二获取单元402,用于从问题函数的源代码中,获取问题函数对应的输入参数;生成单元403,用于通过上述函数编译方法,对源代码进行编译,生成问题函数对应的内核模块;确认单元404,用于基于输入参数,运行内核模块,重新确认是否存在内核漏洞。在本发明实施例中,确认单元,用于将输入参数输入到内核模块;运行内核模块调用问题函数,复现内核漏洞;如果成功复现出内核漏洞,确定内核漏洞存在;如果并未复现出内核漏洞,确定内核漏洞不存在。上述内核模块加载装置包括处理器和存储器,上述第一获取单元、第二获取单元、生成单元以及确认单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。上述处理器可由cpu、mpu、dsp或fpga等实现。存储器可能包括计算机可读介质中的非永久性存储器,ram和/或非易失性内存等形式,如rom或flashram,存储器包括至少一个存储芯片。基于同一发明构思,本发明实施例提供一种存储介质,其上存储有程序,该程序被处理器执行时实现上述漏洞检测方法。基于同一发明构思,本发明实施例提供一种处理器,处理器用于运行程序,其中,程序运行时执行上述漏洞检测方法。在实际应用中,该内核模块加载装置可应用于终端中。终端可以以各种形式来实施。例如,本发明中描述的终端可以包括诸如平板电脑、笔记本电脑、掌上电脑等移动终端,以及诸如数字tv、台式计算机、服务器等固定终端。实施例五基于同一发明构思,本发明实施例提供一种函数编译设备。图5为本发明实施例五中的函数编译设备的结构示意图,参见图5所示,该函数编译设备50包括:存储器501、处理器502以及存储在存储器501上并可在处理器502上运行的计算机程序503,处理器执行程序503时实现以下步骤:获得目标函数的源代码以及用于编译目标函数的源代码的编译指令;执行编译指令,从目标函数的源代码中,确定目标函数所使用的依赖内容,并获取依赖内容对应的声明语句,其中,依赖内容至少为被调用函数、变量或者宏中的一种或者多种;基于依赖内容对应的声明语句,按照预设策略,对目标函数的源代码进行预处理;编译预处理后的目标函数的源代码,获得实现目标函数功能的二进制文件。在本发明实施例中,上述处理器执行程序时还可实现以下步骤:当依赖内容为被调用函数时,根据被调用函数对应的函数声明,判断被调用函数是否为内联函数;如果确定被调用函数为内联函数,获取被调用函数的源代码,并将源代码复制到目标函数的源代码中。在本发明实施例中,上述处理器执行程序时还可实现以下步骤:如果确定被调用函数不是内联函数,判断被调用函数是否调用符号,其中,符号为变量或函数中的一种或多种;如果确定被调用函数未调用符号,获取被调用函数的源代码,并将源代码复制到目标函数的源代码中。在本发明实施例中,上述处理器执行程序时还可实现以下步骤:如果确定被调用函数调用符号,获取编译内核时生成的内核符号表;基于内核符号表,判断被调用函数所调用的符号是否为导出符号;如果被调用函数所调用的符号为导出符号,在目标函数的源代码中,添加导出符号对应的头文件;如果被调用函数所调用的符号为非导出符号,在目标函数的源代码中,使用extern关键字,将非导出符号声明为extern。在本发明实施例中,上述处理器执行程序时还可实现以下步骤:当依赖内容为变量时,根据变量对应的变量声明,判断变量是否为全局变量;如果变量为全局变量,在目标函数的源代码中,使用extern关键字,将全局变量声明为extern。在本发明实施例中,上述处理器执行程序时还可实现以下步骤:当依赖内容为宏时,从宏对应的宏定义中,获取宏对应的实现语句;将目标函数的源代码中所使用的宏替换为实现语句。实施例六基于同一发明构思,本发明实施例提供一种漏洞检测设备。该漏洞检测设备包括:存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现以下步骤:在检测到内核漏洞时,获取触发内核漏洞的问题函数的源代码;从问题函数的源代码中,获取问题函数对应的输入参数;通过上述函数编译方法,对源代码进行编译,生成问题函数对应的内核模块;基于输入参数,运行内核模块,重新确认是否存在内核漏洞。在本发明实施例中,上述处理器执行程序时还可实现以下步骤:将输入参数输入到内核模块;运行内核模块调用问题函数,复现内核漏洞;如果成功复现出内核漏洞,确定内核漏洞存在;如果并未复现出内核漏洞,确定内核漏洞不存在。本发明实施例还提供了如下方案:a1、一种函数编译方法,所述方法包括:获得目标函数的源代码以及用于编译所述目标函数的源代码的编译指令;执行所述编译指令,从所述目标函数的源代码中,确定所述目标函数所使用的依赖内容,并获取所述依赖内容对应的声明语句,其中,所述依赖内容至少为被调用函数、变量或者宏中的一种或者多种;基于所述依赖内容对应的声明语句,按照预设策略,对所述目标函数的源代码进行预处理;编译预处理后的所述目标函数的源代码,获得实现所述目标函数功能的二进制文件。a2、根据a1所述的方法,所述基于所述依赖内容对应的声明语句,按照预设策略,对所述目标函数的源代码进行预处理,包括:当所述依赖内容为被调用函数时,根据所述被调用函数对应的函数声明,判断所述被调用函数是否为内联函数;如果确定所述被调用函数为内联函数,获取所述被调用函数的源代码,并将所述源代码复制到所述目标函数的源代码中。a3、根据a2所述的方法,所述基于所述依赖内容对应的声明语句,按照预设策略,对所述目标函数的源代码进行预处理,还包括:如果确定所述被调用函数不是内联函数,判断所述被调用函数是否调用符号,其中,所述符号为变量或函数中的一种或多种;如果确定所述被调用函数未调用符号,获取所述被调用函数的源代码,并将所述源代码复制到所述目标函数的源代码中。a4、根据a3所述的方法,所述基于所述依赖内容对应的声明语句,按照预设策略,对所述目标函数的源代码进行预处理,还包括:如果确定所述被调用函数调用符号,获取编译内核时生成的内核符号表;基于所述内核符号表,判断所述被调用函数所调用的符号是否为导出符号;如果所述被调用函数所调用的符号为导出符号,在所述目标函数的源代码中,添加所述导出符号对应的头文件;如果所述被调用函数所调用的符号为非导出符号,在所述目标函数的源代码中,使用extern关键字,将所述非导出符号声明为extern。a5、根据a1所述的方法,所述基于所述依赖内容对应的声明语句,按照预设策略,对所述目标函数的源代码进行预处理,包括:当所述依赖内容为变量时,根据所述变量对应的变量声明,判断所述变量是否为全局变量;如果所述变量为全局变量,在所述目标函数的源代码中,使用extern关键字,将所述全局变量声明为extern。a6、根据a1所述的方法,所述基于所述依赖内容对应的声明语句,按照预设策略,对所述目标函数的源代码进行预处理,包括:当所述依赖内容为宏时,从所述宏对应的宏定义中,获取所述宏对应的实现语句;将所述目标函数的源代码中所使用的所述宏替换为所述实现语句。b7、一种漏洞检测方法,所述方法包括:在检测到内核漏洞时,获取触发所述内核漏洞的问题函数的源代码;从所述问题函数的源代码中,获取所述问题函数对应的输入参数;通过如上述a1至a6任一项所述的函数编译方法,对所述源代码进行编译,生成所述问题函数对应的内核模块;基于所述输入参数,运行所述内核模块,重新确认是否存在所述内核漏洞。b8、根据b7所述的方法,所述基于所述输入参数,运行所述内核模块,重新确认存在所述内核漏洞,包括:将所述输入参数输入到所述内核模块;运行所述内核模块调用所述问题函数,复现所述内核漏洞;如果成功复现出所述内核漏洞,确定所述内核漏洞存在;如果并未复现出所述内核漏洞,确定所述内核漏洞不存在。c9、一种函数编译装置,所述装置包括:获得单元、执行单元、预处理单元以及编译单元,其中,所述获得单元,用于获得目标函数的源代码以及用于编译所述目标函数的源代码的编译指令;所述执行单元,用于执行所述编译指令,从所述目标函数的源代码中,确定所述目标函数所使用的依赖内容,并获取所述依赖内容对应的声明语句,其中,所述依赖内容至少为被调用函数、变量或者宏中的一种或者多种;所述预处理单元,用于基于所述依赖内容对应的声明语句,按照预设策略,对所述目标函数的源代码进行预处理;所述编译单元,用于编译预处理后的所述目标函数的源代码,获得实现所述目标函数功能的二进制文件。c10、根据c9所述的装置,所述预处理单元,用于当所述依赖内容为被调用函数时,根据所述被调用函数对应的函数声明,判断所述被调用函数是否为内联函数;如果确定所述被调用函数为内联函数,获取所述被调用函数的源代码,并将所述源代码复制到所述目标函数的源代码中,获得实现所述目标函数功能的二进制文件。c11、根据c10所述的装置,所述预处理单元,还用于如果确定所述被调用函数不是内联函数,判断所述被调用函数是否调用符号,其中,所述符号为变量或函数中的一种或多种;如果确定所述被调用函数未调用符号,获取所述被调用函数的源代码,并将所述源代码复制到所述目标函数的源代码中。c12、根据c11所述的装置,所述预处理单元,还用于如果确定所述被调用函数调用符号,获取编译内核时生成的内核符号表;基于所述内核符号表,判断所述被调用函数所调用的符号是否为导出符号;如果所述被调用函数所调用的符号为导出符号,在所述目标函数的源代码中,添加所述导出符号对应的头文件;如果所述被调用函数所调用的符号为非导出符号,在所述目标函数的源代码中,使用extern关键字,将所述非导出符号声明为extern。c13、根据c9所述的装置,所述预处理单元,用于当所述依赖内容为变量时,根据所述变量对应的变量声明,判断所述变量是否为全局变量;如果所述变量为全局变量,在所述目标函数的源代码中,使用extern关键字,将所述全局变量声明为extern。c14、根据c9所述的装置,所述预处理单元,还用于当所述依赖内容为宏时,从所述宏对应的宏定义中,获取所述宏对应的实现语句;将所述目标函数的源代码中所使用的所述宏替换为所述实现语句。d15、一种漏洞检测装置,所述装置包括:第一获取单元、第二获取单元、生成单元以及确认单元,其中,所述第一获取单元,用于在检测到内核漏洞时,获取触发所述内核漏洞的问题函数的源代码;所述第二获取单元,用于从所述问题函数的源代码中,获取所述问题函数对应的输入参数;所述生成单元,用于通过如上述a1至a6任一项所述的函数编译方法,对所述源代码进行编译,生成所述问题函数对应的内核模块;所述确认单元,用于基于所述输入参数,运行所述内核模块,重新确认是否存在所述内核漏洞。d16、根据d15所述的装置,所述确认单元,用于将所述输入参数输入到所述内核模块;运行所述内核模块调用所述问题函数,复现所述内核漏洞;如果成功复现出所述内核漏洞,确定所述内核漏洞存在;如果并未复现出所述内核漏洞,确定所述内核漏洞不存在。本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、只读光盘(compactdiscread-onlymemory,cd-rom)、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。存储器可能包括计算机可读介质中的非永久性存储器,ram和/或非易失性内存等形式,如rom或flashram。存储器是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机可读存储介质可以是rom、可编程只读存储器(programmableread-onlymemory,prom)、可擦除可编程只读存储器(erasableprogrammableread-onlymemory,eprom)、电可擦除可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、磁性随机存取存储器(ferromagneticrandomaccessmemory,fram)、快闪存储器(flashmemory)、磁表面存储器、光盘、或只读光盘(compactdiscread-onlymemory,cd-rom)等存储器;也可以是快闪记忆体或其他内存技术、cd-rom、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息;还可以是包括上述存储器之一或任意组合的各种电子设备,如移动电话、计算机、平板设备、个人数字助理等。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1