一种检测进程注入的方法、装置及存储介质与流程

文档序号:17131550发布日期:2019-03-16 01:18阅读:257来源:国知局
本发明涉及信息安全
技术领域
:,尤其涉及一种检测进程注入的方法、装置及存储介质。
背景技术
::随着计算机应用的日益普及,包括病毒、木马在内的恶意程序的数量也迅速增长,其中的木马程序是一类可以通过在用户的计算机上运行,进而窃取用户文件、隐私、账户等信息,有的甚至还可以让黑客远程控制用户电脑的恶意程序。相比较传统的单纯以破坏计算机设备为目的的病毒,木马对计算机用户的侵害行为更具有获取利益的目的性,其窃取信息的行为常常会给用户造成巨大的损失因此木马程序的危害也更大。恶意程序可以通过很多传播途径来侵害用户的电脑,例如便携的移动介质,如闪存盘,光盘等,而随着计算机网络技术的广泛应用,互联网逐渐成为恶意程序传播的主要途径之一,黑客或恶意程序传播者将木马等恶意程序文件伪装成其他类型文件,并引诱用户点击和下载,而恶意程序一旦被下载到用户计算机并成功运行,黑客或恶意程序传播者就可以利用这些恶意程序,进行破坏用户计算机,窃取用户个人信息等不法行为。利用操作系统以及应用软件的漏洞实施攻击,是使恶意程序在用户计算机上成功植入和运行的最主要手段之一。漏洞是指操作系统软件或应用软件在逻辑设计上的缺陷或在编写时产生的错误。这些缺陷或错误往往可以被黑客利用来植入木马等恶意程序,侵害或控制甚至破坏用户计算机软硬件系统,或者窃取用户的重要资料和信息。杀毒软件可以有效地对恶意程序进行预防和查杀,但是,恶意程序为了躲避杀毒软件的查杀,常常将恶意代码注入到白进程(记录在白名单中的进程,不会被杀毒软件查杀)中,从而在白进程中对计算机进行攻击。进程注入包括对内存中的某个进程进行操作,并且获得该进程地址空间里的数据,以及修改进程的私有数据结构,将自己的代码放在目标进程的地址空间里运行。通常情况下进程注入都会涉及到固定的应用程序编程接口(api,applicationprogramminginterface)调用,基于此特征,当检测到对被监控程序内存写入数据后调用createremotethread函数和loadlibrary函数,则判定为远程线程注入行为,或者检测到到apc队列中调用loadlibrary函数,且在loadlibrary函数执行之前发生过软中断,则判定有异步调用过程(apc,asynchronousprocedurecall)注入行为。目前检测进程注入的方法依赖于固定api调用的特征,并且进程注入也会用于非恶意软件中,比如某些升级程序则是使用这种方法实现对运行中的程序的热升级。另外目前的注入方法层出不穷,有些注入方法可以逃避基于api调用的特征,使注入动作更加隐秘,对于这些注入技术现有的检测方法已经显得力不从心。综上所述,目前的检测进程注入的方法无法检测出可以逃避基于api调用的特征的进程注入方法。技术实现要素:本发明实施例提供了一种检测进程注入的方法、装置及存储介质,用以解决目前的检测进程注入的方法无法检测出可以逃避基于api调用的特征的进程注入方法问题。基于上述问题,本发明实施例提供的一种检测进程注入的方法,包括:启动目标进程;捕获所述目标进程中的应用程序编程接口api;确定捕获的api中存在调用行为的api的调用关系,其中,存在调用行为的api是调用了除用于捕获所述目标进程中的api的函数以外的其他api的api;将存在调用行为的api的调用关系与调用规则进行匹配;其中,调用规则是执行所述目标进程的系统正常运行时的api的调用关系;当存在调用关系匹配不成功的api时,确定目标进程被注入。进一步地,在捕获所述目标进程中的api时,记录各个api的执行日志;确定捕获的api中存在调用行为的api的调用关系,包括:根据第一api的执行日志,回溯所述第一api的调用栈;其中,第一api是存在调用行为的api中的一个;所述第一api的调用栈中的所有api以及所述第一api之间的关系构成了所述第一api的调用关系。可选地,将存在调用行为的api的调用关系与调用规则进行匹配,包括:在第一api的调用栈中依次从栈底到栈顶对所述第一api调用过的所有api与调用规则进行匹配。可选地,在将存在调用行为的api的调用关系与调用规则进行匹配之前,还包括:根据存储的规则数据,将规则数据中的所有的api以api的名称进行排序,构成一个沿第一方向的链表;针对规则数据中的一个api,根据规则数据中的该api的调用关系,按照该api调用其他api的顺序,对该api的调用关系进行排序,形成一个沿第二方向的链表;动态存储的链表构成所述调用规则。可选地,本发明实施例提供的检测进程注入的方法,还包括:若存在调用行为的api的调用关系中的一个api在所述调用规则中不存在,则将不存在于所述调用规则中的api添加到所述调用规则和存储的规则数据中。本发明实施例提供的一种检测进程注入的装置,包括:一个或者多个处理器;存储器;一个或者多个程序存储在所述存储器中,当被所述一个或者多个处理器执行时实现:启动目标进程;捕获所述目标进程中的应用程序编程接口api;确定捕获的api中存在调用行为的api的调用关系,其中,存在调用行为的api是调用了除用于捕获所述目标进程中的api的函数以外的其他api的api;将存在调用行为的api的调用关系与调用规则进行匹配;其中,调用规则是执行所述目标进程的系统正常运行时的api的调用关系;当存在调用关系匹配不成功的api时,确定目标进程被注入。进一步地,所述一个或多个处理器还用于执行存储在存储器中的一个或多个程序以实现:在捕获所述目标进程中的api时,记录各个api的执行日志;确定捕获的api中存在调用行为的api的调用关系,包括:根据第一api的执行日志,回溯所述第一api的调用栈;其中,第一api是存在调用行为的api中的一个;所述第一api的调用栈中的所有api以及所述第一api之间的关系构成了所述第一api的调用关系。可选地,所述一个或多个处理器还用于执行存储在存储器中的一个或多个程序以实现:在第一api的调用栈中依次从栈底到栈顶对所述第一api调用过的所有api与调用规则进行匹配。可选地,所述一个或多个处理器还用于执行存储在存储器中的一个或多个程序以实现:在将存在调用行为的api的调用关系与调用规则进行匹配之前,根据存储的规则数据,将规则数据中的所有的api以api的名称进行排序,构成一个沿第一方向的链表;针对规则数据中的一个api,根据规则数据中的该api的调用关系,按照该api调用其他api的顺序,对该api的调用关系进行排序,形成一个沿第二方向的链表;动态存储的链表构成所述调用规则。可选地,所述一个或多个处理器还用于执行存储在存储器中的一个或多个程序以实现:若存在调用行为的api的调用关系中的一个api在所述调用规则中不存在,则将不存在于所述调用规则中的api添加到所述调用规则和存储的规则数据中。本发明实施例提供的一种非易失性计算机可读存储介质,所述存储介质中存储有多条指令,所述指令适于由处理器加载并执行本发明实施例提供的检测进程注入的方法。本发明实施例的有益效果包括:本发明实施例提供的一种检测进程注入的方法、装置及存储介质,在启动目标进程后,捕获目标进程中的api,确定捕获的api中存在调用行为的api的调用关系,其中,存在调用行为的api是调用了除用于捕获所述目标进程中的api的函数以外的其他api的api;将存在调用行为的api的调用关系与调用规则进行匹配;当存在调用关系匹配不成功的api时,确定目标进程被注入;其中,调用规则是针对所述目标进程运行的系统总结的api调用的规则。这样,即使对于可以逃避基于api调用特征的注入方式,由于在进程被注入之后,其api的调用关系与总结出的运行目标进程的系统的api的调用规则存在差别,从而通过对比,可以确定出目标进程是否被注入。附图说明图1为本发明实施例提供的一种检测进程注入的方法的流程图;图2为本发明实施例提供的另一种检测进程注入的方法的流程图;图3为本发明实施例提供的一种初始化存储的规则数据的方法的流程图;图4为采用图3所示的方法构成的一个链表的结构示意图;图5为本发明实施例提供的获得规则数据的方法的流程图;图6为本发明实施例提供的一种检测进程注入的装置的结构示意图。具体实施方式本发明实施例提供了一种检测进程注入的方法、装置和存储介质,从堆栈调用关系的上下文入手,找出进程正常执行时的规律,分析目标进程是否满足该规律以此来识别目标进程是否被注入,该方法从堆栈调用关系入手,由于该特征基本不能被绕过,因此,能够检测出各种注入方式。下面结合说明书附图,对本发明实施例提供一种检测进程注入的方法、装置及存储介质的具体实施方式进行说明。本发明实施例提供的一种检测进程注入的方法,如图1所示,具体包括以下步骤:s101、启动目标进程;s102、捕获所述目标进程中的api;在实际操作中,可以通过将用于捕获api调用的hook函数注入到目标进程中来实现目标进程中的api的捕获;s103、确定捕获的api中存在调用行为的api的调用关系,其中,存在调用行为的api是调用了除用于捕获所述目标进程中的api的函数以外的其他api的api;s104、将存在调用行为的api的调用关系与调用规则进行匹配;其中,调用规则是执行所述目标进程的系统正常运行时的api的调用关系;s105、当存在调用关系匹配不成功的api时,确定目标进程被注入。通过对运行目标进程的操作系统中多个(大量)正常进程运行过程的跟踪,得到进程正常运行时的api调用信息,分别对其进行分析,从大量的分析数据中能得出进程运行时api调用的通用规律,并且这个规律适用于运行目标进程的操作系统中任何一个进程。通过将目标进程运行时的api调用关系与在目标进程运行环境下分析得到的进程运行时api调用的通用规律进行比较,在目标进程运行时的api的调用关系符合在目标进程运行环境下分析得到的进程运行时api调用的通用规律时,确定目标进程没有被注入;在目标进程运行时的api的调用关系不符合在目标进程运行环境下分析得到的进程运行时api调用的通用规律时,确定目标进程被注入。进一步地,本发明实施例提供的一种检测进程注入的方法,如图2所示,包括:s201、启动目标进程,并将负责捕获api调用的hook代码注入到目标进程中;其中,hook的原理为在api调用执行之前插入自定义的执行逻辑,以此来干预、修改和替换该api调用的功能。在本申请中,主要是利用hook函数中的log机制和控制逻辑,从而使得每个api调用在执行时都有详细的执行日志输出,并在api调用执行完毕后正常返回,以及保留该api函数的栈调用关系,这样并不会改变原有的api的逻辑。s202、初始化存储的规则数据,生成调用规则;其中,初始化存储的规则数据是将规则数据按照一定的方法翻译成程序能够识别的类型;存储的规则数据可以是数据库形式的,二进制文件或者无格式文件等;在规则数据是以数据库的形式进行存储的情况下,为了提高程序的执行效率,可以将数据库中的规则数据以链表的形式动态的进行存储构成调用规则,这样调用规则直接位于内存中,访问速率最快,并且具备动态扩展。s203、捕获目标进程中的一个api,获取该api的调用栈;为了将捕获的api与该api调用的其他的api区别开来,以下将捕获的api称为原始的api;当目标进程开始运行后,会触发其中注入的hook函数,当调用到hook函数后,一个原始的api的执行日志会被记录,通过执行日志回溯该原始的api的调用栈;其中,根据api的执行日志,可以采用以下方法回溯该api的调用栈:在一个函数(即一个api)调用过程中,如果该函数有n个参数,首先将n个参数压栈,然后将返回地址压栈,最后是将ebp压栈保存,其中,ebp中保存了该函数的调用栈;如果一个调用的函数只有一个参数,那么可以根据参数的地址推算出ebp的存放地址,进而得到ebp的值,例如,在32位系统中指针为4byte的情况下,返回地址为参数地址-4,ebp在调用栈中的存放地址为参数地址-8,而一旦得到ebp就可以回溯出该函数的栈调用。而一个函数的参数的个数可以通过hook函数获取到,因此,采用这种方法可以得到一个函数的完整的栈调用信息。在得到栈调用信息后,可以从栈底到栈顶依次读取函数(每个函数就是一个api,是一个api调用,是一个api函数),然后判断读取的函数是否为本申请中注入到所述目标进程中用于捕获api调用的hook函数,如果是,则忽略该函数,如果不是,则根据函数名在调用规则中进行查找,将查找到的节点与该函数所调用的函数进行递归比较,如果该函数所调用的函数与调用规则相符,则确定不存在注入,否则,存在注入。s204、判断该原始的api的调用栈是否为空,若是,执行s203,否则,执行s205;如果一个api的调用栈为空,则说明该api函数没有调用其他函数,则跳过该api继续处理捕获的下一个api;s205、获取该原始的api的下一个调用函数;s206、判断该调用函数是否为本申请中注入到所述目标进程中用于捕获api调用的hook函数,若是,执行s203,否则,执行s207;如果一个api调用仅调用了本申请中注入到所述目标进程中用于捕获api调用的hook函数,那么跳过该api调用;s207、是否能从调用规则中查找到该调用函数(也就是一个调用的api),若是,执行s208,否则,执行s210;s208、该调用函数是否与所述调用规则中的该原始的api的调用关系相符,若是,执行s204,否则,执行s209;s209、对该原始的api所属模块的详细信息进行记录,并保存输出,从而根据记录的信息判断注入点;然后执行s203;s210、将该调用函数添加到所述调用规则和存储的规则数据中,从而完善调用规则和存储的规则数据;然后执行s203;在目标进程结束时,检测进程注入结束。其中,s204-s210反复被执行,直至一个原始的api所调用的函数全部经过处理;s203-s210反复被执行,直至目标进程执行完毕,也就是目标进程中的各个api全部被处理。本发明实施例还提供一种初始化存储的规则数据的方法,如图3所示,包括:s301、根据存储的规则数据,将规则数据中的所有的api以api的名称进行排序,构成一个沿第一方向的链表;其中,第一方向可以为横向,也可以为纵向,以第一方向为横向为例,横向链表为双链表,且其中的api可以以api的名称的首字母进行排序,这样在查找时,可以根据api的名称的首字母定位api在链表中的大概位置,并决定从链表的哪一端进行查找,以节省查找时间。s302、针对规则数据中的一个api,根据规则数据中的该api的调用关系,按照该api调用其他api的顺序,对该api的调用关系进行排序,形成一个沿第二方向的链表;其中,第二方向可以为纵向,也可以为横向,以第二方向为纵向为例,每个api的调用关系构成一个纵向链表,在一个纵向链表中,被调用的api按照调用顺序进行排序。s303、动态存储的链表构成调用规则。图4为图3所示的方法构成的一个链表的模型。图4所示的链表意味着在存储的规则数据中有四个api函数,分别为a、b、c、d,按照首字母进行排序后构成一个双向的横向链表,其中api函数a的调用关系为a->_a1->_a2->_a3,也就是说,api函数a调用api函数_a1,api函数_a1调用api函数_a2,api函数_a2调用api函数_a3,其中,每个调用节点中包含该调用节点的私有数据;同样地,api函数b的调用关系为b->_b1->_b2,api函数c的调用关系为c->_c1,api函数d的调用关系为d->_d1->_d2->_d3。本发明实施例提供的检测进程注入的方法中所涉及的调用规则可以采用图5所示的方法获得;s501、获取系统正常运行时的api的调用栈的信息;s502、将获取的api的调用栈的信息去除重复内容,去除明显错误的内容后,整理需要用到的信息;s503、将整理的信息以适合读取的形式存储,形成规则数据。其中,可以通过以下方式获取系统正常运行时的api的调用栈的信息:1)、用debug工具获取运行中进程在不同时刻的内存dump文件,从中得到当前时刻的api调用栈信息。在windows下使用windows调试工具集(debuggingtoolsforwindows)和windbg,首先使用debuggingtoolsforwindows得到正在运行中的进程号为pid的进程的内存dump,dump文件保存在c:/dump下,使用windbg手动分析dump文件,可以直观的看到进程在某一时刻的栈信息及调用关系。在linux下可以使用gdb调试工具对一个正在执行的进程进行接管,利用gdb能方便的查看当前的栈调用关系,也可以输出到文件中。2)参考windowsapi编程的标准文档和linux系统编程接口文档,针对各个api分别编写测试代码,利用操作系统提供的栈跟踪函数打印出当前被测试的api的函数栈调用。这种方法的好处是由于本身运行的程序(即测试代码)是自己实现的,因此在程序中可以方便的获得关于自身(测试代码)的信息,并且可以全面的覆盖所有已有的api,这种方法可以做成一个模板,只需要改变具体的函数即可,其余处理过程完全一样。在windows系统中,可以利用函数capturestackbacktrace来追踪调用函数的堆栈,但是这个函数不能得到具体调用函数的名称,只能得到地址,然后通过反汇编的方式通过地址得到函数的名称,这种方法需要对编译原理有较好的掌握。幸运的是,windows分配了一组api来满足这种需求,在编写程序时只需要调用api即可,这些api包括:syminitialize、stackwalk、symgetsymfromaddr、symgetlinefromaddr、symcleanup。具体实现流程如下:首先调用函数syminitialize进行相关的初始化工作,填充结构体stackframe的相关信息,指定被跟踪者的位置(即地址),以确定从何处开始追踪,然后循环调用stackwalk函数,从指定位置,一直向下追踪直到最后。每次将获取的地址分别传入symgetsymfromaddr、symgetlinefromaddr,得到函数的详细信息,将得到的api调用栈及其他信息进行输出,最后调用symcleanup,结束追踪。由于函数stackwalk会顺着线程堆栈进行查找,如果在调用之前,某个函数已经返回了,它的堆栈被回收,那么函数stackwalk自然不会追踪到该函数的调用,因此在堆栈被回收之前,在被跟踪的程序中应该在代码中最后被调用函数中打开open_stack_track宏,以确保能得到所有的调用api。在linux系统中,linux系统提供了一个系统调用ptrace,该系统调用提供了一种方法来跟踪和控制进程的执行,它可以读取和修改进程地址空间中的内容,包括寄存器的值,主要要用于实现断点调试和跟踪系统调用。该系统调用的原型如下:longptrace(enum__ptrace_requestrequest,pid_tpid,void*addr,void*data)。在linux系统中可以利用父进程作为跟踪者,子进程作为被跟踪者,子进程中实现对某个api调用逻辑的测试,父进程中调用ptrace实现对子进程的跟踪,输出其调用栈;或者,利用两个单独的进程,一个进程专门用于跟踪其他进程,其中该进程的输入为被跟踪进程的绝对路径,输出为被跟踪进程的栈调用关系,另一个进程为单独的api调用测试程序,完成对某个api调用的测试,实际上,在一个进程被跟踪之后,跟踪者进程会在某种意义上充当被跟踪进程的父进程(如使用ps命令就可以看到他们的父子关系),而子进程真正的父进程被保存在其task_struct结构的real_parent成员中,当执行跟踪终止时,也就是当以ptrace_detach命令调用ptrace()时,这个系统调用把p_pptr设置为real_parent的值,恢复被跟踪进程原来的父进程。其中,获取的api的调用栈信息中包含有函数名、参数列表,返回值,调用者,被调用者,所属模块名等等。将获取的api的调用栈信息按照一定的格式进行归类整理,去除重复内容,去除明显错误内容后,只保留需要用到的信息,汇总为一个表格,表格中可以包括函数名、参数个数、调用者、所属模块,表格形式可以如表1。函数名参数个数调用者所属模块_ldrpinitialize3ntdll!ldrpinitializentdllntdll!ldrpinitialize2ldrinitializethunkntdll表1将整理后的信息通过批量分析的程序或者人工手动转化适合程序读取的形式,比如数据库,二进制文件,无格式文件等,此时转换后的数据将作为最终的规则数据使用。如果考虑到可读性,则将该规则数据以文件的形式进程存储,如果考虑到执行效率和存储空间,则以数据库和二进制文件的存储形式比较合理。当以数据库的形式存储时,数据库的类型不限,可以是sqlite,mysql,oracle等等。首先在数据库中创建一张表,命名为api_list_table(如表2所示),其中包含所有的api,每个api(xxx)对应一个数据库中另一张表xxx_detail(如表3所示),所对应的表中存储的api详细信息,包括名称,参数列表,参数个数,栈调用信息,模块名等。api_namedetail_tableapi_aapi_a_detailapi_bapi_b_detail表2api_namearg_nuarg_listmodulereturntarce_listapi_a2(int,char)xxx_moduleinta().b().c().d()表3按照表2和表3的形式,将整理的信息插入到数据库中,形成完整的规则数据。在这些规则数据中,单个api有确定的调用者及唯一的所属模块和确定参数格式,这样就能唯一确定一个api。当第三方程序需要使用上述规则数据时,可以将规则数据对外的操作封装成一些对应的操作接口,并提供接口说明。这些操作接口可以是查询某个api的接口,查询函数参数列表的接口,查询函数返回值类型的接口,查询api调用栈的接口等等,只要是围绕规则数据的合理的接口都可以。其中,查询某个api的接口的作用是查询某个api的函数原型,输入为api名称,输出为该api的名称,参数个数,参数列表,所属模块,返回值类型。查询函数参数列表的接口的作用是查询某个api的函数参数列表,其输入为api名称,输出为对应api的参数列表。查询函数返回值类型的接口的作用是查询某个api对应的返回值类型,其输入为api名称,输出为api返回值类型。查询api调用栈的接口的作用是查询某个api的调用栈,其输入为api名称,输出为该api的调用栈。当本发明实施例提供的检测进程注入的方法应用于不同系统时,该方法完全相同,只是针对不同的系统分析整理出该系统的api堆栈调用的规律不同而已,因此,本发明实施例提供的检测进程注入的方法是一种针对不同系统的进程注入的统一的识别方法。基于同一发明构思,本发明实施例还提供了一种检测进程注入的方法、装置及存储介质,由于该装置所解决问题的原理与前述检测进程注入的方法相似,因此该装置的实施可以参见前述方法的实施,重复之处不再赘述。本发明实施例提供的一种检测进程注入的装置,如图6所示,包括:一个或者多个处理器61;存储器62;一个或者多个程序存储在存储器62中,当被一个或者多个处理器61执行时实现:启动目标进程;捕获所述目标进程中的应用程序编程接口api;确定捕获的api中存在调用行为的api的调用关系,其中,存在调用行为的api是调用了除用于捕获所述目标进程中的api的函数以外的其他api的api;将存在调用行为的api的调用关系与调用规则进行匹配;其中,调用规则是执行所述目标进程的系统正常运行时的api的调用关系;当存在调用关系匹配不成功的api时,确定目标进程被注入。进一步地,一个或多个处理器61还用于执行存储在存储器62中的一个或多个程序以实现:在捕获所述目标进程中的api时,记录各个api的执行日志;确定捕获的api中存在调用行为的api的调用关系,包括:根据第一api的执行日志,回溯所述第一api的调用栈;其中,第一api是存在调用行为的api中的一个;所述第一api的调用栈中的所有api以及所述第一api之间的关系构成了所述第一api的调用关系。进一步地,一个或多个处理器61还用于执行存储在存储器62中的一个或多个程序以实现:在第一api的调用栈中依次从栈底到栈顶对所述第一api调用过的所有api与调用规则进行匹配。可选地,一个或多个处理器61还用于执行存储在存储器62中的一个或多个程序以实现:在将存在调用行为的api的调用关系与调用规则进行匹配之前,根据存储的规则数据,将规则数据中的所有的api以api的名称进行排序,构成一个沿第一方向的链表;针对规则数据中的一个api,根据规则数据中的该api的调用关系,按照该api调用其他api的顺序,对该api的调用关系进行排序,形成一个沿第二方向的链表;动态存储的链表构成所述调用规则。可选地,一个或多个处理器61还用于执行存储在存储器62中的一个或多个程序以实现:若存在调用行为的api的调用关系中的一个api在所述调用规则中不存在,则将不存在于所述调用规则中的api添加到所述调用规则和存储的规则数据中。本发明实施例还提供了一种非易失性存储计算机存储介质,该存储介质上存储有计算机可执行指令,所述计算机可执行指令被执行时实现本发明实施例提供的检测进程注入的方法。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明实施例可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1