首页 / 一种扫描器及扫描方法

一种扫描器及扫描方法实质审查 发明

技术领域

[0001] 本发明涉及扫描器技术领域,具体涉及一种扫描器及扫描方法。

相关背景技术

[0002] 扫描器是网络安全领域重要的资产探测和网络空间测绘的工具。目前已有的常见扫描器有Nmap,Zmap,Masscan等工具。但随着近年来网络环境的重大变化,扫描器容易被检测和拦截,影响扫描任务的执行。为了提高执行扫描任务的成功率,相关技术中通常是将扫描任务拆分为多个子任务,再将各个子任务分发给不同的节点来执行。但是由于扫描器在执行扫描任务前需要在每个节点内一次性安装很多不同扫描功能的插件,各个节点才能根据扫描任务的需求调用对应的插件进行扫描。这样,会导致扫描器的占用体积较大。

具体实施方式

[0009] 以下对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
[0010] 以下结合附图描述本发明实施例的一种扫描器及扫描方法。
[0011] 如图1所示,本公开实施例提供了一种扫描器100,包括:用户模块101、控制平台102、扫描控制模块103、多个节点104和插件库105。其中,用户模块101分别与控制平台102和扫描控制模块103连接,各个节点104分别与控制平台102和插件库105连接。用户模块,用于接收用户下发的任务信息和任务指令,将任务信息发送给扫描控制模块,将任务指令发送给控制平台。扫描控制模块,用于将任务信息拆分为多个子任务。控制平台,用于在接收到任务指令时,控制没有安装第一目标插件的节点从插件库内拉取并安装第一目标插件,并向各个目标节点发送预设的扫描指令。其中,第一目标插件为任务指令指定安装的插件,目标节点为安装了第一目标插件的节点。对于各个目标节点,用于基于扫描指令与扫描控制模块建立通信连接,并从扫描控制模块处单次领取一个子任务并执行,以及将所有子任务的执行结果发送给扫描控制模块。
[0012] 采用本公开实施例提供的一种扫描器,用户模块将用户下发的任务信息发送给扫描控制模块,将用户下发的任务指令发送给控制平台。扫描控制模块将任务信息拆分为多个子任务。控制平台在接收到任务指令时,才控制没有安装第一目标插件的节点从插件库内拉取并安装第一目标插件,从而使得节点内安装的第一目标插件为任务指令指定安装的插件。目标节点再从扫描控制模块处领取子任务并执行,将执行结果发送给扫描控制模块。
[0013] 这样,通过控制平台控制没有安装第一目标插件的节点基于任务指令指定安装的插件从插件库内拉取并安装第一目标插件,从而使得目标节点通过任务指令指定安装的第一目标插件就能够执行所领取的子任务,而不需要一次性安装多种不同扫描功能的插件,能够减少各个节点内安装的插件,从而减少扫描器占用体积。
[0014] 另外,通过设置用户模块、控制平台、扫描控制器、多个节点以及插件库,使得扫描器模块化。用户模块将任务信息发送给扫描控制模块,利用扫描控制模块将任务信息拆分为多个子任务。用户模块将任务指令发送给控制平台,利用控制平台控制没有安装第一目标插件的节点从插件库拉取并安装第一目标插件,并向目标节点发送预设的扫描指令,从而触发各个目标节点从扫描控制模块处领取一个子任务并执行。这样,通过各个目标节点主动从扫描控制模块处领取子任务,从而能够降低扫描控制模块分发任务给节点的压力。此外,通过将任务信息拆分为多个子任务,由多个目标节点分别领取并执行各个子任务,从而能够提高扫描效率。
[0015] 可以理解的是,本实施例中扫描器的节点是运行在扫描发起设备(即应用扫描器的设备)上的实例,用于对扫描发起设备的行为进行基本控制,是扫描器的终端节点,通过插件负责具体扫描任务。插件是真正发出扫描动作的实例,即是子任务(即具体扫描任务)的实际执行实例。扫描支持TCP、UDP、以及各用户层协议扫描。其中传输层协议支持使用原始套接字进行TCP SYN扫描扫描,全连接扫描等。
[0016] 在本实施例中,预设的扫描指令携带有扫描控制模块的网络地址信息,即目标节点基于该网络地址信息与扫描控制模块之间建立通信连接。
[0017] 在一些实施例中,结合图2所示,图2提供了一种扫描器执行扫描任务的流程示意图。为便于理解,本示意图中并未示出控制平台控制节点安装第一目标插件的过程,且本示意图仅示出一个目标节点。
[0018] 本实施例中包括用户模块101、控制平台102、扫描控制模块103、目标节点105,扫描目标106。其中,目标节点包括节点104和第一目标插件107。步骤S101:用户模块101向控制平台102下发任务指令以及向扫描控制模块103下发任务信息。步骤S102:扫描控制模块103将接收到的任务信息拆分为多个子任务。步骤S103:控制平台102向目标节点105下发预设的扫描指令。步骤S104:目标节点105从扫描控制模块103处单次领取一个子任务。步骤S105:目标节点105通过节点104和第一目标插件107分别向各个扫描目标106发送探测包以获得对应的执行结果。步骤S106:目标节点105将基于探测包所获得的执行结果反馈给扫描控制模块103。其中,探测包是目标节点基于所领取的子任务所获得的,扫描目标为子任务所指向的扫描对象。
[0019] 优选的,控制平台,还用于基于预设规则,控制各个安装有插件的节点卸载其内所安装的插件。可以理解的是,仅是卸载各个节点内的插件,并非对插件库内的插件进行卸载或删除。这样,通过控制平台控制各个节点卸载安装的插件,从而能够保证扫描器的占用体积不会过大。
[0020] 可以理解的是,预设规则包括扫描器被应用的时长、控制平台接收任务指令的次数、扫描器的占用体积中的一种或多种。例如:在一些实施例中,预设规则包括扫描器被应用的时长。控制平台,还用于在扫描器被应用的时长大于第二预设时长时,控制各个安装有插件的节点卸载其内所安装的插件。
扫描器被应用的时长越长,其占用体积通常会越大。此时,通过控制各个安装有插件的节点卸载其在内所安装的插件,能够有效减少扫描器的占用体积。
[0021] 在另一些实施例中,预设规则包括控制平台接收任务指令的次数。控制平台,还用于在控制平台接收任务指令的次数大于预设扫描次数时,控制各个安装有插件的节点卸载其内所安装的插件。控制平台接收任务指令的次数越多,其控制节点安装的插件数量也会有所增加,从而使得扫描器的占用体积也增大。因此,在控制平台接收任务指令的次数大于预设扫描次数时,通过控制各个安装有插件的节点卸载其在内所安装的插件,能够有效减少扫描器的占用体积。
[0022] 在另一些实施例中,预设规则包括扫描器的占用体积。控制平台,还用于在扫描器的占用体积大于预设占用体积时,控制各个安装有插件的节点卸载其内所安装的插件。这样,通过控制各个安装有插件的节点卸载其在内所安装的插件,能够有效减少扫描器的占用体积。
[0023] 优选的,控制平台,还用于基于任务指令指定安装插件的历史数据,确定每种插件被指定的次数,将该被指定的次数大于或等于预设指定次数的插件确定为第二目标插件;以及基于预设规则,控制各个安装有插件的节点卸载其内所安装的除第二目标插件外的插件。
[0024] 第二目标插件实则为该扫描器常用的插件。这样,通过将除第二目标插件外的插件卸载,既能够保证扫描器的占用体积不会较大,也能够保证各个节点内安装有使用频率较高的插件,从而避免控制平台每次都控制节点安装第一目标插件,以能够保证扫描器执行扫描任务的效率。
[0025] 优选的,节点的架构有多种,插件库内的插件的架构有多种。控制平台,还用于控制没有安装第一目标插件的节点从插件库拉取并安装与节点相同架构的第一目标插件。
[0026] 由于应用扫描器的设备或系统有不同的架构,即扫描器需要在多种运行环境运行,例如:X86、MIPS、ARM、PPC等。因此,扫描器进行扫描时,会选择与应用扫描器的设备相同架构的节点及其插件对目标设备进行扫描,以执行子任务。其中,目标设备即为被扫描的设备或系统。这样,通过设置多种不同架构的节点和插件,控制平台通过控制没有安装第一目标插件的节点从插件库拉取并安装于与节点相同架构的第一目标插件,使得本实施例的扫描器能够应用于多种不同架构的设备,即本实施例的扫描器能够兼容多种不同架构的运行环境。
[0027] 优选的,插件库内存储有多种具有不同扫描功能的插件,每种插件包括多种不同的架构。这样,将多种具有不同扫描功能和架构的插件存储在插件库内,从而不需要事先在每个节点均安装所有插件,从而能够降低扫描器的占用体积。
[0028] 可以理解的是,任务指令和任务信息与扫描任务的类型有关,而不同类型的扫描任务则需要具有相应扫描功能的插件。因此,任务指令指定安装的插件则是与扫描任务的类型相关。换言之,根据扫描任务的类型,用户会下发相应的任务指令和任务信息。这样,节点通过安装任务指令安装的第一目标插件,以确保其能够执行子任务,即对子任务指向的对象进行扫描。
[0029] 具体的,插件库,还用于接收运维人员上传的新插件,将该新插件进行存储;以及还用于接收运维人员下发的删除指令,基于删除指令对其内存储的插件进行删除。这样,通过存储新插件以及删除旧插件,从而实现对插件库内插件的维护或更新,便于扫描器通过节点和插件执行不同的扫描任务。
[0030] 优选的,插件库,还用于对插件库内的插件进行维护,包括:通过运维人员对插件编译和插件存储。插件编译包括:在运维人员编译代码的机器上利用不同架构的交叉编译工具链,对纯C语言的扫描功能代码进行编译以获得不同架构的插件。插件代码不依赖于任何第三方库,能够做到在不同架构的扫描发起设备上独立运行。插件存储包括:运维人员将编译好的的插件,上传到运维机器的指定目录中,由运维机器和各个节点进行数据交互。
[0031] 优选的,控制平台,还用于在接收到任务指令时,识别应用扫描器的设备的架构,将识别出的该设备的架构确定为目标架构。再控制与目标架构相同架构,且没有安装对应架构的第一目标插件的节点从插件库拉取并安装与该节点相同架构的第一目标插件。
[0032] 例如,控制平台在接收到任务指令时,基于识别出的目标架构,检测各个与目标架构相同架构的节点是否安装有第一目标插件。若没有安装第一目标插件,则向与目标架构相同架构且没有安装第一目标插件的架构,发送插件安装指令。各个没有安装第一目标插件且与目标架构相同架构的节点则向插件库请求对应架构的第一目标插件,在接收到插件库发送的对应架构的第一目标插件后,进行插件的安装。可以理解的是,节点只能安装与其相同架构的插件。因此,若节点安装有第一目标插件,则该第一目标插件实际是与节点的架构是相同的,也就不需要再次安装与该节点相同架构的第一目标插件。
[0033] 优选的,控制平台,还用于控制目标节点的批量开启或关闭。例如,批量开启:控制平台勾选已经安装第一目标插件的目标节点进行开启操作,被勾选的目标节点统一开启扫描服务,忽略开启参数,统一使用默认参数开启插件。批量关闭:控制平台勾选已经安装第一目标插件的目标节点进行关闭操作。批量关闭功能支持中断目标节点正在执行的子任务,重启启动新的子任务等。
[0034] 优选的,扫描控制模块,还用于在与各个目标节点建立通信连接后,对各个目标节点进行身份验证;以及若身份验证成功,则向身份验证成功的目标节点单次下发一个子任务。
[0035] 由于本实施例中,目标节点需要主动与扫描控制模块建立通信连接,并从扫描控制模块处领取子任务并执行。即,目标节点与扫描控制模块均是独立模块。因此,通过扫描控制模块验证各个目标节点的身份是否合法来保证各个子任务能够仅由扫描器的各个目标节点领取并执行。若验证失败,则说明与扫描控制模块建立通信连接的各个目标节点的身份不合法,其并非扫描器的各个目标节点。若验证成功,即说明与扫描控制模块建立通信连接的各个目标节点的身份合法,其为扫描器的各个目标节点。这样,通过对各个目标节点进行身份验证,从而能够保证向控制模块领取子任务的各个目标节点均为扫描器的目标节点,以使扫描器能够基于接受到的任务信息完成对待扫描对象的扫描,提高了扫描器的安全性能。
[0036] 优选的,扫描控制模块,还用于在与各个目标节点建立通信连接后,对各个目标节点进行身份验证,若领取同一个任务信息下的任一个目标节点通过身份验证后,再次领取同一个任务信息对应的子任务时,不再进行身份验证。
[0037] 由于本实施例中,扫描控制模块需要对各个目标节点进行身份验证。因此,以一个任务信息为单位,基于同一个任务信息下的各个目标节点,在通过身份验证后,说明该通过身份验证目标节点合法。合法的目标节点即为扫描器的目标节点,其再次领取子任务时,不再进行身份验证,则能够在保证扫描器安全性能的同时,还能够提高各个目标节点领取子任务的效率,进而提高扫描器的扫描效率。
[0038] 优选的,扫描控制模块,还用于监测是否有目标节点请求建立通信连接。这样,通过监测,能够及时对建立通信连接的目标节点进行身份验证,以提高扫描效率。
[0039] 优选的,任务信息包括待扫描的IP范围和每个IP待扫描的端口范围;执行结果包括存活IP和存活端口。扫描控制模块,具体用于将待扫描的IP范围中属于同一个B段的IP确定为一组,将同一组的IP及对应的待扫描的端口作为一个子任务。扫描控制模块,还用于基于各个存活IP和每个存活IP对应的存活端口,计算每个子任务的IP存活率和端口存活率。
[0040] 这样,通过将属于同一个B段的IP确定为一组,使得扫描控制模块能够快速将任务信息拆分为多个子任务,拆分效率高。而每个子任务所指向IP的B段不同,能够避免单个目标节点访问同一个B段的次数过多,从而降低被拦截的概率,提高扫描任务执行的成功率。而通过计算每个子任务的IP存活率和端口存活率,既能够知晓扫描器基于任务信息进行扫描后所获得的扫描结果,也能够确定每个目标节点执行子任务的能力。
[0041] 在一些实施例中,任务信息包括第一扫描任务号、扫描范围(即待扫描的IP范围)、扫描端口(即每个IP待扫描的端口范围)以及扫描协议。其中,第一扫描任务号包括:标识此次任务的序号。扫描范围包括:以起始IP+扫描数量表示,例如1.1.0.0+65535表示当前子任务需要扫描的范围是1.1.0.0至1.1.255.255。扫描端口包括:以二进制格式存储的2字节整数序列表示需要扫描的端口,例如0x00501F90表示需要扫描的端口列表是0x0050(十进制80端口)、0x1F90(8080端口)。扫描协议包括:内部排序的代表某协议的序号,例如0,表示TCP SYN扫描,1表示HTTP协议扫描等。
[0042] 执行结果包括第二扫描任务号、IP偏移和端口列表(即存活IP和存活端口)。其中,第二扫描任务号包括:用于标识此次子任务。IP偏移和端口列表:IP偏移是指和此次任务起始IP的偏移。例如此次任务起始IP为1.1.0.0,如果偏移是5,表示1.1.0.5这个IP的对应端口是开放的,即该端口是存活端口。因此IP和端口组合后的信息5:80,十六进制表示一共占4字节(0x00050050),前两字节表示偏移,后两字节表示端口,表示1.1.0.5的80端口是开放的。后面以这种形式继续追加其他开放的IP和端口。
[0043] 为了便于理解,结合图3所示,本实施例提供一种目标节点与扫描控制模块之间数据交互的流程示意图,包括:目标节点105和扫描控制模块103。其具体交互过程如下:步骤S201:目标节点105向扫描控制模块103请求子任务。步骤S202:扫描控制模块103向目标节点105下发一个子任务,如第一扫描任务号:1;起始IP:1.1.0.0;端口:80,8080。步骤S203:目标节点105向扫描控制模块103反馈基于所领取的子任务执行后的执行结果,如第二扫描任务号:1;端口开放信息:5:80,10:8080。
[0044] 优选的,扫描控制模块,还用于将端口存活率超过预设误差值的子任务确定为误差子任务,将误差子任务重新下发给除误差节点外的任一目标节点执行以获得更新的执行结果,将更新的执行结果作为误差子任务最终的执行结果。其中,误差节点表征执行过误差子任务的目标节点。
[0045] 目标节点执行子任务的端口存活率较低时,说明目标节点可能出错,例如被拦截导致所扫描的端口存活率有较大误差;也说明被扫描对象(即子任务指向的对象)可能自身存活的端口较少。因此,暂时将端口存活率较低的子任务确定为误差子任务,通过将误差子任务重新下发给除误差节点外的其他任一目标节点重新执行获得更新的执行结果,能够确定该目标节点是否执行出错,以及被扫描对象是否自身存活的端口较少。从而确保执行结果的准确率,以保证扫描器基于任务信息进行扫描后所获得的扫描结果。
[0046] 在一些实施例中,若更新的执行结果中端口存活率没超过预设误差值,则说明前一次执行该误差子任务的目标节点出错。此时,可以对该目标节点进行标记,扫描控制模块在基于同一个任务信息时,就不再下发子任务给该标记的目标节点,或减少其领取子任务的数量。这样,目标节点被标记说明其容易被拦截。因此,通过标记出错的目标节点,不再下发子任务或减少其领取子任务的数量,能够减少扫描器中目标节点被拦截的概率,从而提高扫描器总的执行成功率。
[0047] 若更新的执行结果中端口存活率仍低于预设误差值,则说明被扫描对象自身存活的端口较少。从而能够获得较为准确的执行结果。
[0048] 优选的,控制平台还与扫描控制模块连接。扫描控制模块,还用于在目标节点执行子任务出现扫描异常时,通过控制平台控制出现异常的目标节点重新执行对应的子任务;扫描异常包括扫描超时、扫描数据错误中的一种或多种。
[0049] 这样,扫描控制模块通过通过控制平台控制出现异常的目标节点重新执行对应的子任务,从而能够较快地完成对该子任务的扫描。
[0050] 可以理解的是,扫描超时表征扫描的时间过长,即超过了预设扫描时长。扫描数据错误表征目标节点与子任务指向的待扫描对象之间进行数据交互时出错。例如,目标节点向待扫描对象发送探测包、目标节点接收执行结果等数据交互时出错。
[0051] 在一些实施例中,扫描控制模块,具体用于在目标节点执行子任务出现扫描异常时,向控制平台发送重新执行指令。控制平台,还用于在接收到重新执行指令时,则关闭该重新执行指令所指向的目标节点后,再开启该目标节点。从而实现使该目标节点重新执行所领取的子任务。
[0052] 优选的,对于每个目标节点,还用于在执行完成一个子任务后,再次从扫描控制模块领取一个子任务并执行,将对应的执行结果发送给扫描控制模块。
[0053] 这样,目标节点单次只执行一个子任务,待将执行结果反馈给扫描控制模块后再领取一个子任务并执行,从而既能够保证扫描效率,也能够在目标节点与子任务数量不匹配时,通过目标节点多次分别执行子任务来完成对任务信息的执行。
[0054] 优选的,扫描控制模块,还用于基于各个执行结果,确定在第一预设时长内各个目标节点完成子任务的数量,并基于完成子任务的数量的多少为各个目标节点设置由高到低的权重;以及,在所有子任务均被领取后,若高权重的目标节点已执行完所领取的子任务,且低权重的目标节点仍在执行所领取的子任务,则将低权重的目标节点所领取的子任务下发给高权重的目标节点执行。
[0055] 由于,各个目标节点执行子任务的时长并不相同。因此,通过确定在一定时长内各个目标节点完成子任务的数量从而能够确定各个目标节点完成子任务的效率。为效率高的赋予高权重,为效率低的赋予低权重。而在所有子任务被领取且高权重的目标节点已执行完所领取的子任务,且仍有低权重的目标节点仍在执行所领取的子任务,则说明效率高的目标节点暂时没有子任务需要执行。此时,将低权重所领取的子任务下发给高权重的目标节点,则是借助高效率的目标节点来执行该子任务,从而快速获得执行结果,提高扫描效率。
[0056] 在一些实施例中,扫描控制模块,还用于基于同一个任务信息对应的各个执行结果,确定在该任务信息的执行期间的第一预设时长内,该任务信息对应的各个目标节点完成子任务的数量,并基于完成子任务的数量的多少为各个目标节点设置由高到低的权重。其中,该权重为该各个目标节点在该任务信息内的权重。
[0057] 这样,以单个任务信息为单位,基于各个目标节点执行子任务的效率为每个目标节点设置由高到低的权重,从而既能够提高执行子任务的效率,也不需要在扫摸控制模块内存储各个目标节点的历史权重,以能够减少扫描控制模块的存储压力。
[0058] 如图4所示,本公开实施例提供了一种扫描方法,包括:步骤S301:通过用户模块接收用户下发的任务信息和任务指令,将任务信息发送给扫描控制模块,将任务指令发送给控制平台。
[0059] 步骤S302:通过扫描控制模块将任务信息拆分为多个子任务。
[0060] 步骤S303:通过控制平台在接收到任务指令时,控制没有安装第一目标插件的节点从插件库内拉取并安装第一目标插件,并向各个目标节点发送预设的扫描指令。其中,第一目标插件为任务指令指定安装的插件,目标节点为安装了第一目标插件的节点。
[0061] 步骤S304:通过各个目标节点分别基于扫描指令与扫描控制模块建立通信连接,并从扫描控制模块处单次领取一个子任务并执行,以及将所有子任务的执行结果发送给扫描控制模块。
[0062] 采用本公开实施例提供的一种扫描方法,用户模块将用户下发的任务信息发送给扫描控制模块,将用户下发的任务指令发送给控制平台。扫描控制模块将任务信息拆分为多个子任务。控制平台在接收到任务指令时,才控制没有安装第一目标插件的节点从插件库内拉取并安装第一目标插件,从而使得节点内安装的第一目标插件为任务指令指定安装的插件。目标节点再从扫描控制模块处领取子任务并执行,将执行结果发送给扫描控制模块。
[0063] 这样,通过控制平台控制没有安装第一目标插件的节点基于任务指令指定安装的插件从插件库内拉取并安装第一目标插件,从而使得目标节点通过任务指令指定安装的第一目标插件就能够执行所领取的子任务,而不需要一次性安装多种不同扫描功能的插件,能够减少各个节点内安装的插件,从而减少扫描器占用体积。
[0064] 优选的,一种扫描方法,还包括通过控制平台控制没有安装第一目标插件的节点从插件库拉取并安装与节点相同架构的第一目标插件。
[0065] 优选的,一种扫描方法,还包括通过扫描控制模块在与各个目标节点建立通信连接后,对各个目标节点进行身份验证;以及若身份验证成功,则通过扫描控制模块向身份验证成功的目标节点单次下发一个子任务。
[0066] 优选的,一种扫描方法,还包括通过扫描控制模块在与各个目标节点建立通信连接后,对各个目标节点进行身份验证,若领取同一个任务信息下的任一个目标节点通过身份验证后,再次领取同一个任务信息对应的子任务时,不再进行身份验证。
[0067] 优选的,一种扫描方法,还包括通过扫描控制模块将待扫描的IP范围中属于同一个B段的IP确定为一组,将同一组的IP及对应的待扫描的端口作为一个子任务。通过扫描控制模块基于各个存活IP和每个存活IP对应的存活端口,计算每个子任务的IP存活率和端口存活率。
[0068] 优选的,一种扫描方法,还包括通过扫描控制模块将端口存活率超过预设误差值的子任务确定为误差子任务,将误差子任务重新下发给除误差节点外的任一目标节点执行以获得更新的执行结果,将更新的执行结果作为误差子任务最终的执行结果;其中,误差节点表征执行过误差子任务的目标节点。
[0069] 优选的,一种扫描方法,还包括通过扫描控制模块在目标节点执行子任务出现扫描异常时,通过控制平台控制出现异常的目标节点重新执行对应的子任务;扫描异常包括扫描超时、扫描数据错误中的一种或多种。
[0070] 优选的,一种扫描方法,还包括分别通过各个目标节点在执行完成一个子任务后,再次从扫描控制模块领取一个子任务并执行,将对应的执行结果发送给扫描控制模块。
[0071] 优选的,一种扫描方法,还包括通过扫描控制模块基于各个执行结果,确定在第一预设时长内各个目标节点完成子任务的数量,并基于完成子任务的数量的多少为各个目标节点设置由高到低的权重。以及,通过扫描控制模块在所有子任务均被领取后,若高权重的目标节点已执行完所领取的子任务,且低权重的目标节点仍在执行所领取的子任务,则将低权重的目标节点所领取的子任务下发给高权重的目标节点执行。
[0072] 在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
[0073] 尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。

当前第1页 第1页 第2页 第3页