脚本检测方法、装置及计算机程序产品与流程

文档序号:29709905发布日期:2022-04-16 16:59阅读:241来源:国知局
脚本检测方法、装置及计算机程序产品与流程

1.本公开涉及安全技术领域,具体涉及一种脚本检测方法、装置及计算机程序产品。


背景技术:

2.脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,更具体来说,脚本是不需要编译、在运行时通过解释器解释执行的程序。在黑灰色产业链中,黑客可以在服务器系统上通过执行恶意脚本来损害服务器系统的安全性,如下载并安装木马病毒、监听用户数据、侵占系统资源等,导致服务器系统的安全性较差。
3.鉴于此,在脚本运行之前,服务器系统通常会对脚本进行检测。然后,由于脚本语言构造较为灵活,黑客可以构造恶意代码并将其隐藏脚本的部分函数中,并且在动态检测此类脚本的时候,不触发包含该恶意代码的函数的执行,从而导致脚本的动态检测无法获取该脚本中恶意代码的行为特征。
4.针对上述的问题,需要提出一种解决方案,以便能够检测出包含上述恶意代码的脚本,提高恶意脚本检测的准确率。


技术实现要素:

5.本公开实施例提供一种脚本检测方法、装置及计算机程序产品。
6.第一方面,本公开实施例中提供了一种脚本检测方法,其中,包括:
7.执行被检测脚本;
8.检测所述被检测脚本在执行过程中函数的创建及调用信息;
9.在所述被检测脚本执行完成后,基于所述函数的创建及调用信息确定被创建后未被调用过的函数;
10.调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本。
11.进一步地,检测所述被检测脚本在执行过程中函数的创建及调用信息,包括:
12.在检测到所述被检测脚本在运行过程中新创建了函数后,将新创建的函数信息加入未调用函数列表;
13.在检测到所述未调用函数列表中的函数被调用后,将被调用的函数信息从所述未调用函数列表中删除。
14.进一步地,所述方法还包括:
15.在检测到所述被检测脚本在运行过程中新创建了函数后,增加新创建的所述函数在所述被检测脚本的执行环境中的被引用计数。
16.进一步地,调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本,包括:
17.构建创建后未被调用函数所对应的函数参数;
18.基于所有构建的函数参数在所述被检测脚本的执行环境中调用所述创建后未被
调用函数。
19.进一步地,所述构建创建后未被调用函数所对应的函数参数,包括:
20.基于所述创建后未被调用函数的声明信息确定所述创建后未被调用函数对应的函数参数的个数以及数据类型;
21.基于与所述函数参数的个数以及数据类型对应的参数默认值构建所述函数参数。
22.进一步地,所述方法还包括:
23.检测所述被检测脚本中的函数在执行过程中的执行行为;
24.基于所述执行行为确定所述被检测脚本是否为恶意脚本。
25.进一步地,检测所述被检测脚本在执行过程中函数的创建及调用信息,包括:
26.通过对运行所述被检测脚本的解释器进行修改,以便所述解释器在运行所述被检测脚本的过程中,检测所述函数的创建及调用信息。
27.第二方面,本公开实施例中提供了一种脚本检测方法,其中,包括:
28.获取被检测脚本;
29.调用预先部署的脚本检测接口,以检测所述被检测脚本;其中,该脚本检测接口在虚拟机环境中执行所述被检测脚本,并检测所述被检测脚本在执行过程中函数的创建及调用信息,在所述被检测脚本执行完成后,基于所述函数的创建及调用信息确定被创建后未被调用过的函数,以及调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本;
30.输出所述被检测脚本的检测结果。
31.第三方面,本公开实施例中提供了一种脚本检测装置,其中,包括:
32.执行模块,被配置为执行被检测脚本;
33.第一检测模块,被配置为检测所述被检测脚本在执行过程中函数的创建及调用信息;
34.第一确定模块,被配置为在所述被检测脚本执行完成后,基于所述函数的创建及调用信息确定被创建后未被调用过的函数;
35.第一调用模块,被配置为调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本。
36.所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。
37.在一个可能的设计中,上述装置的结构中包括存储器和处理器,所述存储器用于存储一条或多条支持上述装置执行上述对应方法的计算机指令,所述处理器被配置为用于执行所述存储器中存储的计算机指令。上述装置还可以包括通信接口,用于上述装置与其他设备或通信网络通信。
38.第四方面,本公开实施例提供了一种电子设备,包括存储器、处理器以及存储在存储器上的计算机程序,其中,所述处理器执行所述计算机程序以实现上述任一方面所述的方法。
39.第五方面,本公开实施例提供了一种计算机可读存储介质,用于存储上述任一装置所用的计算机指令,该计算机指令被处理器执行时用于实现上述任一方面所述的方法。
40.第六方面,本公开实施例提供了一种计算机程序产品,其包含计算机指令,该计算
机指令被处理器执行时用于实现上述任一方面所述的方法。
41.本公开实施例提供的技术方案可以包括以下有益效果:
42.本公开实施例针对恶意脚本的动态检测过程,在执行被检测脚本时检测所创建的函数以及函数的调用信息,并在被检测脚本执行完成后,基于所创建的函数以及函数的调用信息判断被检测脚本中是否存在未被调用过的函数,并调用至少一次未被调用的函数,从而基于被检测脚本中每个函数的执行行为确定该被检测脚本是否为恶意脚本。通过本公开实施例,可以保证被检测脚本中的所有函数都会被调用执行,能够更加全面的检测整个脚本,防止被检测脚本中隐藏包含恶意代码的函数从而绕过脚本检测的情况发生。
43.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
44.结合附图,通过以下非限制性实施方式的详细描述,本公开的其它特征、目的和优点将变得更加明显。在附图中:
45.图1示出根据本公开一实施方式的脚本检测方法的流程图;
46.图2示出根据本公开一实施方式中脚本检测的实现流程示意图;
47.图3示出根据本公开另一实施方式的脚本检测方法的流程图;
48.图4示出根据本公开一实施方式中脚本检测的应用场景示意图;
49.图5示出根据本公开一实施方式的脚本检测装置的结构框图;
50.图6示出根据本公开另一实施方式的脚本检测装置的结构框图;
51.图7是适于用来实现根据本公开实施方式的脚本检测方法的电子设备的结构示意图。
具体实施方式
52.下文中,将参考附图详细描述本公开的示例性实施方式,以使本领域技术人员可容易地实现它们。此外,为了清楚起见,在附图中省略了与描述示例性实施方式无关的部分。
53.在本公开中,应理解,诸如“包括”或“具有”等的术语旨在指示本说明书中所公开的特征、数字、步骤、行为、部件、部分或其组合的存在,并且不排除一个或多个其他特征、数字、步骤、行为、部件、部分或其组合存在或被添加的可能性。
54.另外还需要说明的是,在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本公开。
55.下面通过具体实施例详细介绍本公开实施例的细节。
56.图1示出根据本公开一实施方式的脚本检测方法的流程图。如图1所示,该脚本检测方法包括以下步骤:
57.在步骤s101中,执行被检测脚本;
58.在步骤s102中,检测所述被检测脚本在执行过程中函数的创建及调用信息;
59.在步骤s103中,在所述被检测脚本执行完成后,基于所述函数的创建及调用信息确定被创建后未被调用过的函数;
60.在步骤s104中,调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本。
61.本实施例中,脚本是一种可以解释执行的程序,被检测脚本是用于检测其中是否包含恶意代码的脚本。为了检测被检测脚本中是否包含恶意代码,本公开实施例可以在虚拟机环境中执行被检测脚本。该虚拟机环境可以部署在服务器上,因此该脚本检测方法可以在服务器上执行。
62.被检测脚本可以在虚拟机环境下,由脚本解释器解释执行。脚本解释器可以逐句执行被检测脚本中的脚本语句,并在被检测脚本的脚本语句的执行过程中,检测是否有函数创建和/或函数调用指令,如果存在函数创建和/或函数调用指令,则可以记录该函数的创建信息以及函数的调用信息。
63.在一些实施例中,函数的创建及调用信息可以包括函数的创建信息以及调用信息;函数的创建信息可以包括但不限于所创建函数的标识、函数的参数信息、函数的创建时间、函数引用次数、引用该函数的对象等;函数的参数信息可以包括但不限于参数个数以及每个参数的数据类型等。函数的调用信息可以包括但不限于所调用函数的标识、函数的调用时间、调用该函数的对象、函数是否调用成功等。
64.本公开实施例中,执行被检测脚本的目的是为了动态检测被检测脚本中是否包括恶意代码,因此在解释器逐句解释执行被检测脚本的过程中,还可以基于每个脚本语句的执行行为确定该被检测脚本是否为恶意脚本。
65.在一些实施例中,如果被检测脚本中存在恶意代码,则可以认为该被检测脚本为恶意脚本,如果该被检测脚本中未检测出恶意代码,则可以认为该被检测脚本不是恶意脚本。
66.在一些实施例中,恶意脚本指一切以制造危害或者损害系统功能为目的而从软件系统中增加、改变或删除的任何脚本。例如传统的恶意脚本可以包括:病毒、蠕虫、特洛伊木马和攻击性脚本等。而较新的恶意脚本例如包括:java攻击小程序(java attack applets)和危险的activex控件等。而将何种执行行为的脚本确定为恶意脚本可以参考已有技术,或者基于实际的应用场景而定,本公开实施例对此不作限制。
67.如背景技术所述,脚本中存在一些函数,按照正常的逻辑执行该脚本时,由于可以做到不被触发执行,因而无法基于该函数的执行行为动态检测出该函数是否存在恶意代码。
68.下面举例说明这种情况:
69.1、脚本中运行的函数名或者参数由外部传入,脚本会执行由参数指定的函数名或参数,因此动态检测过程中无法获取用于激活恶意函数的正确参数,从而导致该保函恶意代码的函数未被触发运行,因此导致不能检测出该函数中存在恶意代码。
70.2、脚本采用文件分片的方式,将包含恶意代码的函数隐藏在其他文件中,并将该其他文件引入当前执行的脚本的相关函数中执行,从而无法通过动态检测检测出该函数中存在恶意代码。
71.目前,传统的动态检测技术无法检测出文件分片类脚本中的恶意代码,因为将所有文件聚合在一起进行检测的难度较大,所以传统的动态检测方法对脚本文件的检测,通常是单文件检测方式,但是单文件检测又会导致无法触发其他相关文件中的恶意行为,从
而此类脚本可以绕过脚本检测。
72.针对上述问题,本公开实施例在脚本执行过程中记录函数的创建及调用信息,并在脚本执行完成之后,基于该创建及调用信息确定脚本执行过程中,所创建的函数是否全部被调用过,如果存在整个过程中未被调用的函数,则可以调用该未被调用过的函数,从而能够基于该函数的执行行为确定该函数中是否存在恶意代码。
73.通过上述这种方式,在被检测脚本的动态检测过程中,只要是被检测脚本中创建过的函数,都会被调用执行,从而能够避免上文中提到的,由于在检测过程中某些函数未被触发执行,导致绕过脚本检测的问题。也就是说,本公开实施例中,通过检测被检测脚本执行过程中函数的创建以及调用情况,从而在整个被检测脚本执行完成之后,又针对该执行过程中未被调用过的函数,重新调用执行,使得被检测脚本所涉及的所有函数都将被执行至少一次,从而能够检测其执行行为,并基于该执行行为确定该函数中是否存在恶意代码,最终根据所有被执行函数的执行行为确定该被检测脚本是否为恶意脚本。
74.本公开实施例针对恶意脚本的动态检测过程,在执行被检测脚本时检测所创建的函数以及函数的调用信息,并在被检测脚本执行完成后,基于所创建的函数以及函数的调用信息判断被检测脚本中是否存在未被调用过的函数,并调用至少一次未被调用的函数,从而基于被检测脚本中每个函数的执行行为确定该被检测脚本是否为恶意脚本。通过本公开实施例,可以保证被检测脚本中的所有函数都会被调用执行,能够更加全面的检测整个脚本,防止被检测脚本中隐藏包含恶意代码的函数从而绕过脚本检测的情况发生。
75.在本实施例的一个可选实现方式中,步骤s102,即检测所述被检测脚本在执行过程中函数的创建及调用信息的步骤,进一步包括以下步骤:
76.在检测到所述被检测脚本在运行过程中新创建了函数后,将新创建的函数信息加入未调用函数列表;
77.在检测到所述未调用函数列表中的函数被调用后,将被调用的函数信息从所述未调用函数列表中删除。
78.该可选的实现方式中,在被检测脚本执行过程中,如果某个执行语句新创建了函数,则可以记录该函数的创建信息,例如至少可以将该新创建的函数名称或者其他标识加入未调用函数列表中。
79.在被检测脚本执行过程中,如果某个执行语句调用了某个已经创建的函数,则可以记录该函数的调用信息,例如至少可以从未调用函数列表中遍历该被调用函数的名称或其他标识,若当前被调用的函数的名称或其他标识在未调用函数列表中,则可以将当前被调用的该函数信息从未调用函数列表中删除。通过这种方式,在被检测脚本执行完成后,可以确定被创建但未被调用的函数,进而可以调用这些函数,防止由于在常规执行过程中这些函数未被调用从而绕过脚本检测的情况发生。
80.在本实施例的一个可选实现方式中,所述方法进一步还包括以下步骤:
81.在检测到所述被检测脚本在运行过程中新创建了函数后,增加新创建的所述函数在所述被检测脚本的执行环境中的被引用计数。
82.该可选的实现方式中,被检测脚本执行过程中,如果某个脚本语句新创建了函数,则可以针对该新创建的函数增加其在执行环境中的被引用计数。通过这种方式,在被检测脚本执行完成后,如果该函数未被调用过,由于该函数的被引用计数不为0,因此该函数所
对应的对象不会被释放,这样在后续可以通过构建该函数的参数,调用该函数对象,从而触发执行该函数。否则,如果在该函数创建时,不增加引用计数,创建该函数的其他对象结束生命之后,该函数对应的对象可能会被释放,从而导致被检测脚本执行完成后,无法通过正常调用该函数对应的对象来触发执行该函数。
83.在本实施例的一个可选实现方式中,步骤s104,即调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本的步骤,进一步包括以下步骤:
84.构建创建后未被调用函数所对应的函数参数;
85.基于所有构建的函数参数在所述被检测脚本的执行环境中调用所述创建后未被调用函数。
86.该可选的实现方式中,如上文中所述,在被检测脚本的执行过程中,可以记录被创建函数的创建及调用信息,基于该创建及调用信息可以确定在被检测脚本执行完成后,哪些函数被创建后未被调用过。针对创建后未被调用函数,本公开实施例可以构造该创建后未被调用函数对应的函数参数,进而基于该构建的函数参数调用该创建后未被调用函数,以便触发执行该函数。
87.在一些实施例中,创建后未被调用函数对应的函数参数可以是调用执行该函数所需的参数,其个数和数据类型可以与创建该函数时一致。因此在创建该函数时,可以记录调用该函数对应的对象所需要的参数个数以及每个参数的数据类型,而在构建函数参数时,可以依据该参数个数以及每个参数对应的数据类型构造相应的参数,例如某个创建后未被调用函数c(x)的参数为1个,其数据类型为字符串,则在构造参数时可以构造一个空字符串作为函数参数,并调用该函数c。通过这种方式,可以触发被检测脚本执行过程中创建后未被调用函数的执行,从而能够基于该函数的执行行为确定该函数中是否包括恶意代码。当然,可以理解的是,确定被检测脚本是否为恶意脚本,除了检测这些创建后未被调用函数的执行行为之外,被检测脚本常规执行过程中被执行的函数的执行行为同样需要进行检测,只要存在一个函数的执行行为与预设的恶意行为相匹配,则可以认为该被检测脚本为恶意脚本。
88.在本实施例的一个可选实现方式中,所述构建创建后未被调用函数所对应的函数参数的步骤,进一步包括以下步骤:
89.基于所述创建后未被调用函数的声明信息确定所述创建后未被调用函数对应的函数参数的个数以及数据类型;
90.基于与所述函数参数的个数以及数据类型对应的参数默认值构建所述函数参数。
91.该可选的实现方式中,如上文中所述,在创建该函数时,可以记录调用该函数对象所需要的参数个数以及每个参数的数据类型,而在构建函数参数时,可以依据该函数参数的个数以及每个参数对应的数据类型构造相应的参数。在一些实施例中,可以预先设置每种数据类型的参数默认值,在构建函数参数时,可以基于每个参数的数据类型将参数默认值确定为本次调用该创建后未被调用函数的参数值,进而构造出调用该创建后未被调用函数的函数参数。通过这种方式,可以触发被检测脚本执行过程中创建后未被调用函数的执行,从而能够基于该函数的执行行为确定该函数中是否包括恶意代码。
92.在本实施例的一个可选实现方式中,所述方法进一步还包括以下步骤:
93.检测所述被检测脚本中的函数在执行过程中的执行行为;
94.基于所述执行行为确定所述被检测脚本是否为恶意脚本。
95.该可选的实现方式中,可以监测被检测脚本中函数的执行过程,进而确定函数的执行行为,如果某个函数的执行行为触发了预设的某种恶意行为,则可以认为该函数的执行行为存在恶意,从而可以确定该被检测脚本为恶意脚本,如果被检测脚本从执行开始到执行完成,均未发现函数的执行行为触发了某种预设的恶意行为;并且在该被检测脚本中存在创建后未被调用函数后,通过构建函数参数调用该创建后未被调用函数,从而该创建后未被调用函数的执行过程也未触发恶意行为后,可以确定该被检测脚本不为恶意脚本。预设的恶意行为可以参见已有技术,或者基于实际应用场景预先定义,例如一些应用场景下,如果函数的执行行为涉及调用系统命令,则可以认为该执行行为涉及预设的恶意行为,确定该函数中存在恶意代码。通过这种方式,可以实现对被检测脚本的全面检测,能够提升恶意检测程序的检测能力。
96.在本实施例的一个可选实现方式中,步骤s102,即检测所述被检测脚本在执行过程中函数的创建及调用信息的步骤,进一步包括以下步骤:
97.通过对运行所述被检测脚本的解释器进行修改,以便所述解释器在运行所述被检测脚本的过程中,检测所述函数的创建及调用信息。
98.该可选的实现过程中,为了检测被检测脚本在执行过程中函数的创建及调用信息,可以通过修改执行被检测脚本的解释器,使得其在解释执行脚本语句时,如果对应的运行指令中存在函数创建和/或函数调用指令时,可以记录函数创建信息以及函数调用信息。例如,解释器可以将脚本语句解释转换成运行指令(如opcode)的形式,从而可以基于运行指令确定是否存在函数创建以及函数调用相关的指令,从而将函数创建及调用信息记录下来。
99.在另一些实施例中,也可以通过修改执行被检测脚本的解释器,在被检测脚本执行完成之后,从函数创建及调用信息中找出创建后未被调用函数,并基于该函数的声明信息构建相应的函数参数,从而基于该函数参数调用执行该函数。
100.图2示出根据本公开一实施方式中脚本检测的实现流程示意图。如图2所示,收集需要检测的批量脚本样本,在服务器上建立虚拟机环境,并在虚拟机环境下部署相应的脚本解释器,对该脚本解释器进行修改,以便该脚本解释器检测所解释执行的脚本语句中是否存在创建函数和调用函数的运行指令。将脚本样本导入脚本解释器运行,脚本解释器将脚本样本中的脚本语句解释成运行指令,并检测该运行指令中是否包含创建函数指令,比如创建普通函数指令、创建类成员函数指令、创建闭包函数指令、创建lambda函数指令等。如果脚本解释器检测到当前运行指令中包括创建函数指令,则将该函数的创建信息加入未调用函数列表中,并且增加该函数的引用计数,以防止在该函数未被调用的情况下,其对应的对象被释放;之后返回并等待解释执行下一脚本语句。
101.如果运行指令中无创建函数指令,还可以检测该运行指令中是否包含运行函数的指令,如果包含运行函数的指令,则脚本解释器将该运行函数指令中的函数信息从未调用函数列表中删除,之后返回并等待解释执行下一脚本语句。
102.如果运行指令中无创建函数指令,还可以判断脚本样本是否运行结束,如果运行结束,则判断未调用函数列表是否为空,如果未调用函数列表不为空,则说明脚本样本在执
行过程中存在创建后未被调用函数,此时脚本解释器基于预先的设置构造该被创建后未被调用函数的函数参数,并尝试调用该被创建后未被调用函数,需要说明的是,在调用了该被创建后未被调用函数后,可以将该函数的信息从未调用函数列表中删除,并返回,直到未调用函数列表为空。
103.图3示出根据本公开一实施方式的脚本检测方法的流程图。如图3所示,该脚本检测方法包括以下步骤:
104.在步骤s301中,获取被检测脚本;
105.在步骤s302中,调用预先部署的脚本检测接口,以检测所述被检测脚本;其中,该脚本检测接口在虚拟机环境中执行所述被检测脚本,并检测所述被检测脚本在执行过程中函数的创建及调用信息,在所述被检测脚本执行完成后,基于所述函数的创建及调用信息确定被创建后未被调用过的函数,以及调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本;
106.在步骤s303中,输出所述被检测脚本的检测结果。
107.本实施例中,该方法可以在云端执行。脚本检测接口可以预先部署在云端,该脚本检测接口可以是saas(software-as-a-service,软件即服务)接口,需求方可以预先获得该脚本检测接口的使用权,在需要时可以通过调用该脚本检测接口对被检测样本进行检测,该脚本检测接口实现的是本公开实施例提出的脚本检测方法。
108.本实施例中,需求方可以将需要检测的多个脚本上传至云端,由部署在云端的脚本检测接口对该多个脚本进行检测,并输出每个脚本的检测结果,该检测结果可以返回给需求方。
109.脚本检测接口可以预选部署在云端服务器上,并且在云端服务器上可以部署适合被检测脚本运行的虚拟机环境,进而在虚拟机环境下启动可以解释执行被检测脚本的脚本解释器。
110.可以理解的是,需求方上传的被检测脚本可以是多种不同类型的脚本,还可以适用于在多种不同环境下运行,并且可能需要多种不同脚本解释器来解释执行。因此,脚本检测接口可以对上传的被检测脚本进行分类,而云端服务器上可以预先部署运行各种不同类型脚本的虚拟机环境,以及在不同虚拟机环境中解释执行不同类型脚本的脚本解释器。
111.部署在云端服务器上的脚本检测接口基于被检测脚本的类型选择合适的虚拟机环境以及脚本解释器解释执行该被检测脚本。部署在云端服务器上的各种类型的脚本解释器可以预先进行修改,以便能够在解释执行被检测脚本的过程中检测创建函数以及运行函数的指令,进而记录创建函数以及运行函数的信息。并且脚本解释器还可以被修改,以便在被检测脚本执行完之后,基于所记录的信息检测被检测脚本在执行过程中是否存在创建后未被调用函数,如果存在创建后未被调用函数,则脚本解释器还可以基于预先设置的规则构建该创建后未被调用函数需要的函数参数,进而基于该函数参数调用该创建后未被调用函数,以便能够执行该创建后未被调用函数。
112.云端服务器上还可以预先部署脚本检测模块,脚本检测接口在检测被检测脚本的过程中,还可以启动该脚本检测模块,以便在脚本解释器执行被检测脚本的过程中,检测被检测脚本所运行的函数的执行行为,基于该执行行为确定该被检测脚本中是否存在包含恶意代码的函数,如果存在包含恶意代码的函数,则可以将该被检测脚本确定为恶意脚本。
113.在所有被检测脚本被执行完成之后,脚本检测接口可以基于脚本检测模块得到的结果,将所有被检测脚本的检测结果返回给需求方。
114.下面详细说明本公开实施例中脚本检测的实现细节。
115.本实施例中,脚本是一种可以解释执行的程序,被检测脚本是用于检测其中是否包含恶意代码的脚本。为了检测被检测脚本中是否包含恶意代码,本公开实施例可以在虚拟机环境中执行被检测脚本。该虚拟机环境可以部署在服务器上,因此该脚本检测方法可以在服务器上执行。
116.被检测脚本可以在虚拟机环境下,由脚本解释器解释执行。脚本解释器可以逐句执行被检测脚本中的脚本语句,并在被检测脚本的脚本语句的执行过程中,检测是否有函数创建和/或函数调用指令,如果存在函数创建和/或函数调用指令,则可以记录该函数的创建信息以及函数的调用信息。
117.在一些实施例中,函数的创建及调用信息可以包括函数的创建信息以及调用信息;函数的创建信息可以包括但不限于所创建函数的标识、函数的参数信息、函数的创建时间、函数引用次数、引用该函数的对象等;函数的参数信息可以包括但不限于参数个数以及每个参数的数据类型等。函数的调用信息可以包括但不限于所调用函数的标识、函数的调用时间、调用该函数的对象、函数是否调用成功等。
118.本公开实施例中,执行被检测脚本的目的是为了动态检测被检测脚本中是否包括恶意代码,因此在解释器逐句解释执行被检测脚本的过程中,还可以基于每个脚本语句的执行行为确定该被检测脚本是否为恶意脚本。
119.在一些实施例中,如果被检测脚本中存在恶意代码,则可以认为该被检测脚本为恶意脚本,如果该被检测脚本中未检测出恶意代码,则可以认为该被检测脚本不是恶意脚本。
120.在一些实施例中,恶意脚本指一切以制造危害或者损害系统功能为目的而从软件系统中增加、改变或删除的任何脚本。例如传统的恶意脚本可以包括:病毒、蠕虫、特洛伊木马和攻击性脚本等。而较新的恶意脚本例如包括:java攻击小程序(java attack applets)和危险的activex控件等。而将何种执行行为的脚本确定为恶意脚本可以参考已有技术,或者基于实际的应用场景而定,本公开实施例对此不作限制。
121.如背景技术所述,脚本中存在一些函数,按照正常的逻辑执行该脚本时,由于可以做到不被触发执行,因而无法基于该函数的执行行为动态检测出该函数是否存在恶意代码。
122.下面举例说明这种情况:
123.1、脚本中运行的函数名或者参数由外部传入,脚本会执行由参数指定的函数名或参数,因此动态检测过程中无法获取用于激活恶意函数的正确参数,从而导致该保函恶意代码的函数未被触发运行,因此导致不能检测出该函数中存在恶意代码。
124.2、脚本采用文件分片的方式,将包含恶意代码的函数隐藏在其他文件中,并将该其他文件引入当前执行的脚本的相关函数中执行,从而无法通过动态检测检测出该函数中存在恶意代码。
125.目前,传统的动态检测技术无法检测出文件分片类脚本中的恶意代码,因为将所有文件聚合在一起进行检测的难度较大,所以传统的动态检测方法对脚本文件的检测,通
常是单文件检测方式,但是单文件检测又会导致无法触发其他相关文件中的恶意行为,从而此类脚本可以绕过脚本检测。
126.针对上述问题,本公开实施例在脚本执行过程中记录函数的创建及调用信息,并在脚本执行完成之后,基于该创建及调用信息确定脚本执行过程中,所创建的函数是否全部被调用过,如果存在整个过程中未被调用的函数,则可以调用该未被调用过的函数,从而能够基于该函数的执行行为确定该函数中是否存在恶意代码。
127.通过上述这种方式,在被检测脚本的动态检测过程中,只要是被检测脚本中创建过的函数,都会被调用执行,从而能够避免上文中提到的,由于在检测过程中某些函数未被触发执行,导致绕过脚本检测的问题。也就是说,本公开实施例中,通过检测被检测脚本执行过程中函数的创建以及调用情况,从而在整个被检测脚本执行完成之后,又针对该执行过程中未被调用过的函数,重新调用执行,使得被检测脚本所涉及的所有函数都将被执行至少一次,从而能够检测其执行行为,并基于该执行行为确定该函数中是否存在恶意代码,最终根据所有被执行函数的执行行为确定该被检测脚本是否为恶意脚本。
128.本公开实施例针对恶意脚本的动态检测过程,在执行被检测脚本时检测所创建的函数以及函数的调用信息,并在被检测脚本执行完成后,基于所创建的函数以及函数的调用信息判断被检测脚本中是否存在未被调用过的函数,并调用至少一次未被调用的函数,从而基于被检测脚本中每个函数的执行行为确定该被检测脚本是否为恶意脚本。通过本公开实施例,可以保证被检测脚本中的所有函数都会被调用执行,能够更加全面的检测整个脚本,防止被检测脚本中隐藏包含恶意代码的函数从而绕过脚本检测的情况发生。
129.在本实施例的一个可选实现方式中,检测所述被检测脚本在执行过程中函数的创建及调用信息的步骤,进一步包括以下步骤:
130.在检测到所述被检测脚本在运行过程中新创建了函数后,将新创建的函数信息加入未调用函数列表;
131.在检测到所述未调用函数列表中的函数被调用后,将被调用的函数信息从所述未调用函数列表中删除。
132.该可选的实现方式中,在被检测脚本执行过程中,如果某个执行语句新创建了函数,则可以记录该函数的创建信息,例如至少可以将该新创建的函数名称或者其他标识加入未调用函数列表中。
133.在被检测脚本执行过程中,如果某个执行语句调用了某个已经创建的函数,则可以记录该函数的调用信息,例如至少可以从未调用函数列表中遍历该被调用函数的名称或其他标识,若当前被调用的函数的名称或其他标识在未调用函数列表中,则可以将当前被调用的该函数信息从未调用函数列表中删除。通过这种方式,在被检测脚本执行完成后,可以确定被创建但未被调用的函数,进而可以调用这些函数,防止由于在常规执行过程中这些函数未被调用从而绕过脚本检测的情况发生。
134.在本实施例的一个可选实现方式中,所述脚本检测接口进一步还执行如下操作:
135.在检测到所述被检测脚本在运行过程中新创建了函数后,增加新创建的所述函数在所述被检测脚本的执行环境中的被引用计数。
136.该可选的实现方式中,被检测脚本执行过程中,如果某个脚本语句新创建了函数,则可以针对该新创建的函数增加其在执行环境中的被引用计数。通过这种方式,在被检测
脚本执行完成后,如果该函数未被调用过,由于该函数的被引用计数不为0,因此该函数所对应的对象不会被释放,这样在后续可以通过构建该函数的参数,调用该函数对象,从而触发执行该函数。否则,如果在该函数创建时,不增加引用计数,创建该函数的其他对象结束生命之后,该函数对应的对象可能会被释放,从而导致被检测脚本执行完成后,无法通过正常调用该函数对应的对象来触发执行该函数。
137.在本实施例的一个可选实现方式中,调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本的步骤,进一步包括以下步骤:
138.构建创建后未被调用函数所对应的函数参数;
139.基于所有构建的函数参数在所述被检测脚本的执行环境中调用所述创建后未被调用函数。
140.该可选的实现方式中,如上文中所述,在被检测脚本的执行过程中,可以记录被创建函数的创建及调用信息,基于该创建及调用信息可以确定在被检测脚本执行完成后,哪些函数被创建后未被调用过。针对创建后未被调用函数,本公开实施例可以构造该创建后未被调用函数对应的函数参数,进而基于该构建的函数参数调用该创建后未被调用函数,以便触发执行该函数。
141.在一些实施例中,创建后未被调用函数对应的函数参数可以是调用执行该函数所需的参数,其个数和数据类型可以与创建该函数时一致。因此在创建该函数时,可以记录调用该函数对应的对象所需要的参数个数以及每个参数的数据类型,而在构建函数参数时,可以依据该参数个数以及每个参数对应的数据类型构造相应的参数,例如某个创建后未被调用函数c(x)的参数为1个,其数据类型为字符串,则在构造参数时可以构造一个空字符串作为函数参数,并调用该函数c。通过这种方式,可以触发被检测脚本执行过程中创建后未被调用函数的执行,从而能够基于该函数的执行行为确定该函数中是否包括恶意代码。当然,可以理解的是,确定被检测脚本是否为恶意脚本,除了检测这些创建后未被调用函数的执行行为之外,被检测脚本常规执行过程中被执行的函数的执行行为同样需要进行检测,只要存在一个函数的执行行为与预设的恶意行为相匹配,则可以认为该被检测脚本为恶意脚本。
142.在本实施例的一个可选实现方式中,所述构建创建后未被调用函数所对应的函数参数的步骤,进一步包括以下步骤:
143.基于所述创建后未被调用函数的声明信息确定所述创建后未被调用函数对应的函数参数的个数以及数据类型;
144.基于与所述函数参数的个数以及数据类型对应的参数默认值构建所述函数参数。
145.该可选的实现方式中,如上文中所述,在创建该函数时,可以记录调用该函数对象所需要的参数个数以及每个参数的数据类型,而在构建函数参数时,可以依据该函数参数的个数以及每个参数对应的数据类型构造相应的参数。在一些实施例中,可以预先设置每种数据类型的参数默认值,在构建函数参数时,可以基于每个参数的数据类型将参数默认值确定为本次调用该创建后未被调用函数的参数值,进而构造出调用该创建后未被调用函数的函数参数。通过这种方式,可以触发被检测脚本执行过程中创建后未被调用函数的执行,从而能够基于该函数的执行行为确定该函数中是否包括恶意代码。
146.在本实施例的一个可选实现方式中,所述脚本检测接口进一步还执行如下操作:
147.检测所述被检测脚本中的函数在执行过程中的执行行为;
148.基于所述执行行为确定所述被检测脚本是否为恶意脚本。
149.该可选的实现方式中,可以监测被检测脚本中函数的执行过程,进而确定函数的执行行为,如果某个函数的执行行为触发了预设的某种恶意行为,则可以认为该函数的执行行为存在恶意,从而可以确定该被检测脚本为恶意脚本,如果被检测脚本从执行开始到执行完成,均未发现函数的执行行为触发了某种预设的恶意行为;并且在该被检测脚本中存在创建后未被调用函数后,通过构建函数参数调用该创建后未被调用函数,从而该创建后未被调用函数的执行过程也未触发恶意行为后,可以确定该被检测脚本不为恶意脚本。预设的恶意行为可以参见已有技术,或者基于实际应用场景预先定义,例如一些应用场景下,如果函数的执行行为涉及调用系统命令,则可以认为该执行行为涉及预设的恶意行为,确定该函数中存在恶意代码。通过这种方式,可以实现对被检测脚本的全面检测,能够提升恶意检测程序的检测能力。
150.在本实施例的一个可选实现方式中,检测所述被检测脚本在执行过程中函数的创建及调用信息的步骤,进一步包括以下步骤:
151.通过对运行所述被检测脚本的解释器进行修改,以便所述解释器在运行所述被检测脚本的过程中,检测所述函数的创建及调用信息。
152.该可选的实现过程中,为了检测被检测脚本在执行过程中函数的创建及调用信息,可以通过修改执行被检测脚本的解释器,使得其在解释执行脚本语句时,如果对应的运行指令中存在函数创建和/或函数调用指令时,可以记录函数创建信息以及函数调用信息。例如,解释器可以将脚本语句解释转换成运行指令(如opcode)的形式,从而可以基于运行指令确定是否存在函数创建以及函数调用相关的指令,从而将函数创建及调用信息记录下来。
153.在另一些实施例中,也可以通过修改执行被检测脚本的解释器,在被检测脚本执行完成之后,从函数创建及调用信息中找出创建后未被调用函数,并基于该函数的声明信息构建相应的函数参数,从而基于该函数参数调用执行该函数。
154.图4示出根据本公开一实施方式中脚本检测的应用场景示意图。如图4所示,第一服务器收集待检测脚本样本,并将待检测脚本样本发送至第二服务器。
155.相关人员可以在本地设备上编写修改已有脚本解释器的程序代码,该程序代码的功能是在脚本解释器中增加如下功能:一、解释执行脚本语句时,检测该脚本语句对应的运行指令中是否包括创建函数指令,如果包括创建函数指令,则将所创建函数的信息加入未调用函数列表中;二、解释执行脚本语句时,检测该脚本语句对应的运行指令中是否包括调用函数指令,如果包括调用函数指令,则从未调用函数列表中将该函数信息删除;三、待检测脚本执行完成后,检测未调用函数列表是否为空,如果未调用函数列表不为空,则构造该未调用函数的函数参数,并尝试调用该为调用函数。
156.相关人员将修改脚本解释器的程序代码上传至第二服务,并运行通过运行该程序代码修改第二服务器上的脚本解释器。此外,相关人员还可以在第二服务器上部署运行待检测脚本样本的虚拟机环境,以及在该虚拟机环境下启动该脚本解释器。
157.第二服务器接收到脚本样本后,导入脚本解释器进行解释执行;第二服务器还检
测脚本样本执行过程中所运行函数的执行行为,如果该执行行为涉及预设的恶意行为,则将该脚本样本确定为恶意脚本,并输出该检测结果。
158.所有脚本样本执行完成后,第二服务器可以将恶意脚本的信息列表返回给第一服务器。
159.下述为本公开装置实施例,可以用于执行本公开装置实施例。
160.图5示出根据本公开一实施方式的脚本检测装置的结构框图。该装置可以通过软件、硬件或者两者的结合实现成为电子设备的部分或者全部。如图5所示,该脚本检测装置包括:
161.执行模块501,被配置为执行被检测脚本;
162.第一检测模块502,被配置为检测所述被检测脚本在执行过程中函数的创建及调用信息;
163.第一确定模块503,被配置为在所述被检测脚本执行完成后,基于所述函数的创建及调用信息确定被创建后未被调用过的函数;
164.第一调用模块504,被配置为调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本。
165.本实施例中,脚本是一种可以解释执行的程序,被检测脚本是用于检测其中是否包含恶意代码的脚本。为了检测被检测脚本中是否包含恶意代码,本公开实施例可以在虚拟机环境中执行被检测脚本。该虚拟机环境可以部署在服务器上,因此该脚本检测装置可以在服务器上执行。
166.被检测脚本可以在虚拟机环境下,由脚本解释器解释执行。脚本解释器可以逐句执行被检测脚本中的脚本语句,并在被检测脚本的脚本语句的执行过程中,检测是否有函数创建和/或函数调用指令,如果存在函数创建和/或函数调用指令,则可以记录该函数的创建信息以及函数的调用信息。
167.在一些实施例中,函数的创建及调用信息可以包括函数的创建信息以及调用信息;函数的创建信息可以包括但不限于所创建函数的标识、函数的参数信息、函数的创建时间、函数引用次数、引用该函数的对象等;函数的参数信息可以包括但不限于参数个数以及每个参数的数据类型等。函数的调用信息可以包括但不限于所调用函数的标识、函数的调用时间、调用该函数的对象、函数是否调用成功等。
168.本公开实施例中,执行被检测脚本的目的是为了动态检测被检测脚本中是否包括恶意代码,因此在解释器逐句解释执行被检测脚本的过程中,还可以基于每个脚本语句的执行行为确定该被检测脚本是否为恶意脚本。
169.在一些实施例中,如果被检测脚本中存在恶意代码,则可以认为该被检测脚本为恶意脚本,如果该被检测脚本中未检测出恶意代码,则可以认为该被检测脚本不是恶意脚本。
170.在一些实施例中,恶意脚本指一切以制造危害或者损害系统功能为目的而从软件系统中增加、改变或删除的任何脚本。例如传统的恶意脚本可以包括:病毒、蠕虫、特洛伊木马和攻击性脚本等。而较新的恶意脚本例如包括:java攻击小程序(java attack applets)和危险的activex控件等。而将何种执行行为的脚本确定为恶意脚本可以参考已有技术,或者基于实际的应用场景而定,本公开实施例对此不作限制。
171.如背景技术所述,脚本中存在一些函数,按照正常的逻辑执行该脚本时,由于可以做到不被触发执行,因而无法基于该函数的执行行为动态检测出该函数是否存在恶意代码。
172.下面举例说明这种情况:
173.1、脚本中运行的函数名或者参数由外部传入,脚本会执行由参数指定的函数名或参数,因此动态检测过程中无法获取用于激活恶意函数的正确参数,从而导致该保函恶意代码的函数未被触发运行,因此导致不能检测出该函数中存在恶意代码。
174.2、脚本采用文件分片的方式,将包含恶意代码的函数隐藏在其他文件中,并将该其他文件引入当前执行的脚本的相关函数中执行,从而无法通过动态检测检测出该函数中存在恶意代码。
175.目前,传统的动态检测技术无法检测出文件分片类脚本中的恶意代码,因为将所有文件聚合在一起进行检测的难度较大,所以传统的动态检测装置对脚本文件的检测,通常是单文件检测方式,但是单文件检测又会导致无法触发其他相关文件中的恶意行为,从而此类脚本可以绕过脚本检测。
176.针对上述问题,本公开实施例在脚本执行过程中记录函数的创建及调用信息,并在脚本执行完成之后,基于该创建及调用信息确定脚本执行过程中,所创建的函数是否全部被调用过,如果存在整个过程中未被调用的函数,则可以调用该未被调用过的函数,从而能够基于该函数的执行行为确定该函数中是否存在恶意代码。
177.通过上述这种方式,在被检测脚本的动态检测过程中,只要是被检测脚本中创建过的函数,都会被调用执行,从而能够避免上文中提到的,由于在检测过程中某些函数未被触发执行,导致绕过脚本检测的问题。也就是说,本公开实施例中,通过检测被检测脚本执行过程中函数的创建以及调用情况,从而在整个被检测脚本执行完成之后,又针对该执行过程中未被调用过的函数,重新调用执行,使得被检测脚本所涉及的所有函数都将被执行至少一次,从而能够检测其执行行为,并基于该执行行为确定该函数中是否存在恶意代码,最终根据所有被执行函数的执行行为确定该被检测脚本是否为恶意脚本。
178.本公开实施例针对恶意脚本的动态检测过程,在执行被检测脚本时检测所创建的函数以及函数的调用信息,并在被检测脚本执行完成后,基于所创建的函数以及函数的调用信息判断被检测脚本中是否存在未被调用过的函数,并调用至少一次未被调用的函数,从而基于被检测脚本中每个函数的执行行为确定该被检测脚本是否为恶意脚本。通过本公开实施例,可以保证被检测脚本中的所有函数都会被调用执行,能够更加全面的检测整个脚本,防止被检测脚本中隐藏包含恶意代码的函数从而绕过脚本检测的情况发生。
179.在本实施例的一个可选实现方式中,所述第一检测模块,包括:
180.加入子模块,被配置为在检测到所述被检测脚本在运行过程中新创建了函数后,将新创建的函数信息加入未调用函数列表;
181.删除子模块,被配置为在检测到所述未调用函数列表中的函数被调用后,将被调用的函数信息从所述未调用函数列表中删除。
182.该可选的实现方式中,在被检测脚本执行过程中,如果某个执行语句新创建了函数,则可以记录该函数的创建信息,例如至少可以将该新创建的函数名称或者其他标识加入未调用函数列表中。
183.在被检测脚本执行过程中,如果某个执行语句调用了某个已经创建的函数,则可以记录该函数的调用信息,例如至少可以从未调用函数列表中遍历该被调用函数的名称或其他标识,若当前被调用的函数的名称或其他标识在未调用函数列表中,则可以将当前被调用的该函数信息从未调用函数列表中删除。通过这种方式,在被检测脚本执行完成后,可以确定被创建但未被调用的函数,进而可以调用这些函数,防止由于在常规执行过程中这些函数未被调用从而绕过脚本检测的情况发生。
184.在本实施例的一个可选实现方式中,所述装置还包括:
185.增加模块,被配置为在检测到所述被检测脚本在运行过程中新创建了函数后,增加新创建的所述函数在所述被检测脚本的执行环境中的被引用计数。
186.该可选的实现方式中,被检测脚本执行过程中,如果某个脚本语句新创建了函数,则可以针对该新创建的函数增加其在执行环境中的被引用计数。通过这种方式,在被检测脚本执行完成后,如果该函数未被调用过,由于该函数的被引用计数不为0,因此该函数所对应的对象不会被释放,这样在后续可以通过构建该函数的参数,调用该函数对象,从而触发执行该函数。否则,如果在该函数创建时,不增加引用计数,创建该函数的其他对象结束生命之后,该函数对应的对象可能会被释放,从而导致被检测脚本执行完成后,无法通过正常调用该函数对应的对象来触发执行该函数。
187.在本实施例的一个可选实现方式中,所述第一调用模块,包括:
188.第一构建子模块,被配置为构建创建后未被调用函数所对应的函数参数;
189.调用子模块,被配置为基于所有构建的函数参数在所述被检测脚本的执行环境中调用所述创建后未被调用函数。
190.该可选的实现方式中,如上文中所述,在被检测脚本的执行过程中,可以记录被创建函数的创建及调用信息,基于该创建及调用信息可以确定在被检测脚本执行完成后,哪些函数被创建后未被调用过。针对创建后未被调用函数,本公开实施例可以构造该创建后未被调用函数对应的函数参数,进而基于该构建的函数参数调用该创建后未被调用函数,以便触发执行该函数。
191.在一些实施例中,创建后未被调用函数对应的函数参数可以是调用执行该函数所需的参数,其个数和数据类型可以与创建该函数时一致。因此在创建该函数时,可以记录调用该函数对应的对象所需要的参数个数以及每个参数的数据类型,而在构建函数参数时,可以依据该参数个数以及每个参数对应的数据类型构造相应的参数,例如某个创建后未被调用函数c(x)的参数为1个,其数据类型为字符串,则在构造参数时可以构造一个空字符串作为函数参数,并调用该函数c。通过这种方式,可以触发被检测脚本执行过程中创建后未被调用函数的执行,从而能够基于该函数的执行行为确定该函数中是否包括恶意代码。当然,可以理解的是,确定被检测脚本是否为恶意脚本,除了检测这些创建后未被调用函数的执行行为之外,被检测脚本常规执行过程中被执行的函数的执行行为同样需要进行检测,只要存在一个函数的执行行为与预设的恶意行为相匹配,则可以认为该被检测脚本为恶意脚本。
192.在本实施例的一个可选实现方式中,所述第一构建子模块,包括:
193.确定子模块,被配置为基于所述创建后未被调用函数的声明信息确定所述创建后未被调用函数对应的函数参数的个数以及数据类型;
194.第二构建子模块,被配置为基于与所述函数参数的个数以及数据类型对应的参数默认值构建所述函数参数。
195.该可选的实现方式中,如上文中所述,在创建该函数时,可以记录调用该函数对象所需要的参数个数以及每个参数的数据类型,而在构建函数参数时,可以依据该函数参数的个数以及每个参数对应的数据类型构造相应的参数。在一些实施例中,可以预先设置每种数据类型的参数默认值,在构建函数参数时,可以基于每个参数的数据类型将参数默认值确定为本次调用该创建后未被调用函数的参数值,进而构造出调用该创建后未被调用函数的函数参数。通过这种方式,可以触发被检测脚本执行过程中创建后未被调用函数的执行,从而能够基于该函数的执行行为确定该函数中是否包括恶意代码。
196.在本实施例的一个可选实现方式中,所述装置还包括:
197.第二检测模块,被配置为检测所述被检测脚本中的函数在执行过程中的执行行为;
198.第二确定模块,被配置为基于所述执行行为确定所述被检测脚本是否为恶意脚本。
199.该可选的实现方式中,可以监测被检测脚本中函数的执行过程,进而确定函数的执行行为,如果某个函数的执行行为触发了预设的某种恶意行为,则可以认为该函数的执行行为存在恶意,从而可以确定该被检测脚本为恶意脚本,如果被检测脚本从执行开始到执行完成,均未发现函数的执行行为触发了某种预设的恶意行为;并且在该被检测脚本中存在创建后未被调用函数后,通过构建函数参数调用该创建后未被调用函数,从而该创建后未被调用函数的执行过程也未触发恶意行为后,可以确定该被检测脚本不为恶意脚本。预设的恶意行为可以参见已有技术,或者基于实际应用场景预先定义,例如一些应用场景下,如果函数的执行行为涉及调用系统命令,则可以认为该执行行为涉及预设的恶意行为,确定该函数中存在恶意代码。通过这种方式,可以实现对被检测脚本的全面检测,能够提升恶意检测程序的检测能力。
200.在本实施例的一个可选实现方式中,所述第一检测模块,包括:
201.修改子模块,被配置为通过对运行所述被检测脚本的解释器进行修改,以便所述解释器在运行所述被检测脚本的过程中,检测所述函数的创建及调用信息。
202.该可选的实现过程中,为了检测被检测脚本在执行过程中函数的创建及调用信息,可以通过修改执行被检测脚本的解释器,使得其在解释执行脚本语句时,如果对应的运行指令中存在函数创建和/或函数调用指令时,可以记录函数创建信息以及函数调用信息。例如,解释器可以将脚本语句解释转换成运行指令(如opcode)的形式,从而可以基于运行指令确定是否存在函数创建以及函数调用相关的指令,从而将函数创建及调用信息记录下来。
203.在另一些实施例中,也可以通过修改执行被检测脚本的解释器,在被检测脚本执行完成之后,从函数创建及调用信息中找出创建后未被调用函数,并基于该函数的声明信息构建相应的函数参数,从而基于该函数参数调用执行该函数。
204.图6示出根据本公开另一实施方式的脚本检测装置的结构框图。该装置可以通过软件、硬件或者两者的结合实现成为电子设备的部分或者全部。如图6所示,该脚本检测装置包括:
205.获取模块601,被配置为获取被检测脚本;
206.第二调用模块602,被配置为调用预先部署的脚本检测接口,以检测所述被检测脚本;其中,该脚本检测接口在虚拟机环境中执行所述被检测脚本,并检测所述被检测脚本在执行过程中函数的创建及调用信息,在所述被检测脚本执行完成后,基于所述函数的创建及调用信息确定被创建后未被调用过的函数,以及调用未被调用过的所述函数,以便基于所述被检测脚本的执行行为确定所述被检测脚本是否为恶意脚本;
207.输出模块603,被配置为输出所述被检测脚本的检测结果。
208.本实施例中,该装置可以在云端执行。脚本检测接口可以预先部署在云端,该脚本检测接口可以是saas(software-as-a-service,软件即服务)接口,需求方可以预先获得该脚本检测接口的使用权,在需要时可以通过调用该脚本检测接口对被检测样本进行检测,该脚本检测接口实现的是本公开实施例提出的脚本检测装置。
209.本实施例中,需求方可以将需要检测的多个脚本上传至云端,由部署在云端的脚本检测接口对该多个脚本进行检测,并输出每个脚本的检测结果,该检测结果可以返回给需求方。
210.脚本检测接口可以预选部署在云端服务器上,并且在云端服务器上可以部署适合被检测脚本运行的虚拟机环境,进而在虚拟机环境下启动可以解释执行被检测脚本的脚本解释器。
211.可以理解的是,需求方上传的被检测脚本可以是多种不同类型的脚本,还可以适用于在多种不同环境下运行,并且可能需要多种不同脚本解释器来解释执行。因此,脚本检测接口可以对上传的被检测脚本进行分类,而云端服务器上可以预先部署运行各种不同类型脚本的虚拟机环境,以及在不同虚拟机环境中解释执行不同类型脚本的脚本解释器。
212.部署在云端服务器上的脚本检测接口基于被检测脚本的类型选择合适的虚拟机环境以及脚本解释器解释执行该被检测脚本。部署在云端服务器上的各种类型的脚本解释器可以预先进行修改,以便能够在解释执行被检测脚本的过程中检测创建函数以及运行函数的指令,进而记录创建函数以及运行函数的信息。并且脚本解释器还可以被修改,以便在被检测脚本执行完之后,基于所记录的信息检测被检测脚本在执行过程中是否存在创建后未被调用函数,如果存在创建后未被调用函数,则脚本解释器还可以基于预先设置的规则构建该创建后未被调用函数需要的函数参数,进而基于该函数参数调用该创建后未被调用函数,以便能够执行该创建后未被调用函数。
213.云端服务器上还可以预先部署脚本检测模块,脚本检测接口在检测被检测脚本的过程中,还可以启动该脚本检测模块,以便在脚本解释器执行被检测脚本的过程中,检测被检测脚本所运行的函数的执行行为,基于该执行行为确定该被检测脚本中是否存在包含恶意代码的函数,如果存在包含恶意代码的函数,则可以将该被检测脚本确定为恶意脚本。
214.在所有被检测脚本被执行完成之后,脚本检测接口可以基于脚本检测模块得到的结果,将所有被检测脚本的检测结果返回给需求方。
215.脚本检测的具体实现细节可以参见上文中的描述,在此不再赘述。
216.图7是适于用来实现根据本公开实施方式的脚本检测方法的电子设备的结构示意图。
217.如图7所示,电子设备700包括处理单元701,其可实现为cpu、gpu、fpga、npu等处理
单元。处理单元701可以根据存储在只读存储器(rom)702中的程序或者从存储部分708加载到随机访问存储器(ram)703中的程序而执行本公开上述任一方法的实施方式中的各种处理。在ram703中,还存储有电子设备700操作所需的各种程序和数据。处理单元701、rom702以及ram703通过总线704彼此相连。输入/输出(i/o)接口705也连接至总线704。
218.以下部件连接至i/o接口705:包括键盘、鼠标等的输入部分706;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分707;包括硬盘等的存储部分708;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分709。通信部分709经由诸如因特网的网络执行通信处理。驱动器710也根据需要连接至i/o接口705。可拆卸介质711,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器710上,以便于从其上读出的计算机程序根据需要被安装入存储部分708。
219.特别地,根据本公开的实施方式,上文参考本公开实施方式中的任一方法可以被实现为计算机软件程序。例如,本公开的实施方式包括一种计算机程序产品,其包括有形地包含在机器可读介质上的计算机程序,所述计算机程序包含用于执行本公开实施方式中任一方法的程序代码。在这样的实施方式中,该计算机程序可以通过通信部分709从网络上被下载和安装,和/或从可拆卸介质711被安装。
220.附图中的流程图和框图,图示了按照本公开各种实施方式的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,路程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
221.描述于本公开实施方式中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定。
222.作为另一方面,本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施方式中所述装置中所包含的计算机可读存储介质;也可以是单独存在,未装配入设备中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,所述程序被一个或者一个以上的处理器用来执行描述于本公开的方法。
223.以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1