通过解释器执行代码的系统和方法与流程

文档序号:14797081发布日期:2018-06-29 20:03阅读:419来源:国知局
本发明总体涉及解释器的领域,以及更具体地涉及用于通过解释器执行程序代码的系统和方法。
背景技术
:模拟器越来越多地被防病毒应用程序用于针对恶意功能的存在分析计算机程序代码。通常采用这类方法来分析以脚本编程语言编写的代码。通常,模拟器包括语法分析器(解析器)和解释器。该语法分析器将被分析的程序代码转换为中间代码(诸如字节代码)。解释器使用中间代码和模拟的执行环境来根据解释规则相继地执行(即解释)中间代码的指令。在模拟期间,被分析的代码无权访问实际计算机系统的资源,因为该代码的执行发生在模拟环境中。因此,在模拟器中执行的代码无法删除或改变计算机上的文件、从文件读取数据、或以其它方式对运行该代码的计算机系统造成伤害。同时,非常难以实现能够解释被执行代码的所有对象(功能、进程和方法、类实例等)的模拟器。网络罪犯利用该事实且经常将很少使用的对象包括在其程序代码中。因此,如果特定对象(例如功能)的返回值不对应于该对象的执行的期望值,则恶意代码“理解”其被执行在模拟器内部且停止其进一步执行或不执行恶意功能,从而不被检测到。反过来,防病毒应用程序的制造者力图有效地将解释规则添加到模拟器,用于被网络罪犯包括在其恶意代码中的新对象。然而,这通常需要改变模拟器自身的程序代码。在每次这类改变之后,需要对模拟器的程序代码测试和调试以排除故障,因此无法有效地将更新版本的模拟器提供给防病毒的用户。技术问题出现,包括需要解释(即,由解释器执行)调查的程序代码的指令,该程序代码包含解释器缺少对其的解释规则(即,执行结果对应于对应指令的执行结果的程序代码)的对象,而不改变解释器的真实程序代码。该对象可以为进程、类实例、类实例的方法或变量、脚本或甚至文件。然而,现有的防病毒技术经常无法检测包含模拟器(更具体地,其解释器)缺少对其的解释规则的对象的恶意代码,因此没有解决上文提及的技术问题。技术实现要素:本发明针对于用于通过解释器执行程序代码的系统、方法和计算机程序产品,该解释器缺少对于该程序代码的解释规则。本发明的技术效果之一在于,通过解释辅助程序代码提高了由解释器对调查的程序代码(该解释器缺少对于该调查的程序代码的解释规则)的执行的质量,而不改变解释器本身。在一个示例性方面中,一种通过解释器执行程序代码的方法包括:通过所述解释器在模拟的计算机环境中执行所述程序代码的指令;当通过所述解释器检测到所述程序代码的与未知对象相关联的指令时,通过所述解释器停止所述程序代码的所述指令的进一步执行,所述解释器缺少对于所述未知对象的解释规则;通过所述解释器获得辅助代码,所述辅助代码的执行结果对应于所述未知对象的执行结果,其中,所述辅助代码包含已知对象,所述解释器具有对于所述已知对象的解释规则;通过所述解释器执行所述辅助代码的指令;以及在完成所述辅助代码的执行之后,通过所述解释器恢复所述程序代码的所述指令的执行。在一个示例性方面中,所述对象为如下项中的一者:进程、类实例、类实例的方法或变量、脚本、文件、辅助代码。在一个示例性方面中,从所述模拟的计算机环境获得所述辅助代码。在一个示例性方面中,从本地数据库或远程数据库获得所述辅助代码。在一个示例性方面中,针对所述辅助代码将所述解释器的执行环境初始化。在一个示例性方面中,所述程序代码的执行和所述辅助代码的执行包括如下项中的一者或多者:对所述代码执行词汇分析;对所述代码执行语法分析;创建中间代码;以及根据所述解释规则解释所述中间代码。在一个示例性方面中,所述辅助代码还包含至少一个其它未知对象,针对所述至少一个其它未知对象获得另一辅助代码,所述另一辅助代码的执行结果对应于所述其它未知对象的执行结果。在一个示例性方面中,所述方法还包括:对所解释的代码执行防病毒检查。在一个示例性方面中,一种通过解释器执行程序代码的系统包括在模拟的计算机环境中执行解释器的硬件处理器,其中,所述解释器配置成:执行所述程序代码的指令;当通过所述解释器检测到所述程序代码的与未知对象相关联的指令时,停止所述程序代码的所述指令的进一步执行,所述解释器缺少对于所述未知对象的解释规则;获得辅助代码,所述辅助代码的执行结果对应于所述未知对象的执行结果,其中,所述辅助代码包含已知对象,所述解释器具有对于所述已知对象的解释规则;执行所述辅助代码的指令;以及在完成所述辅助代码的执行之后,恢复所述程序代码的所述指令的执行。在一个示例性方面中,一种其上存储用于通过解释器执行程序代码的计算机可执行指令的非易失性计算机可读介质,所述计算机可执行指令包括用于如下操作的指令:通过所述解释器在模拟的计算机环境中执行所述程序代码的指令;当通过所述解释器检测到所述程序代码的与未知对象相关联的指令时,通过所述解释器停止所述程序代码的所述指令的进一步执行,所述解释器缺少对于所述未知对象的解释规则;通过所述解释器获得辅助代码,所述辅助代码的执行结果对应于所述未知对象的执行结果,其中,所述辅助代码包含已知对象,所述解释器具有对于所述已知对象的解释规则;通过所述解释器执行所述辅助代码的指令;以及在完成所述辅助代码的执行之后,通过所述解释器恢复所述程序代码的所述指令的执行。以上对本发明的示例性方面的简要概述用于提供对本发明的基本理解。该概述不是对所有预期方面的广泛综述,并且既不旨在标识所有方面的关键的要素或主要的要素,也不旨在勾画本发明的任何方面或所有方面的范围。为了实现前述内容,本发明的一个或多个方面包括在权利要求中所描述的且特别指出的特征。附图说明并入本说明书中并构成本说明书的一部分的附图示出了本发明的一个或多个示例性方面,以及连同详细的描述一起用来阐述这些示例性方面的原理和实现方式。图1示出用于通过解释器执行程序代码的示例性系统。图2示出用于通过解释器执行程序代码的示例性系统。图3示出用于通过解释器执行程序代码的示例性方法。图4示出其上可实施用于通过解释器执行程序代码的系统和方法的方面的通用计算机系统的示例。具体实施方式本文中在用于通过解释器执行程序代码的系统、方法和计算机程序产品的背景下描述本发明的示例性方面。本领域的普通技术人员将认识到,以下描述仅仅是说明性的,而不旨在以任何方式进行限制。其它方面将很容易将其自身暗示给了解本发明的优点的本领域的技术人员。现在将详细地参考如附图中所示的示例性方面的实现方式。贯穿附图和以下描述将尽可能地使用相同的附图标记来指代相同或类似的项目。图1示出根据本发明的一个方面的用于通过解释器执行程序代码的示例性系统。防病毒应用程序101是为该防病毒应用程序配置在其上的计算机系统提供信息安全的计算机程序。防病毒应用程序101将用于分析的程序代码102传递到模拟器200。在一个示例性方面中,模拟器200为防病毒应用程序101的一部分。源程序代码102可以用脚本编程语言(诸如JavaScript、VBScript、Python等)来编写。在一个示例性方面中,模拟器200可以包括但不限于:词汇分析器103、语法分析器104、语义分析器105、中间代码生成器106、解释器107、记录模块115和分析模块113。在一个示例性方面中,解释器107包含虚拟机。在一个示例性方面中,词汇分析器103读取构成源程序代码102的字符串,并将这些字符分组为有意义的序列或词位。对于每个词位,构造输出令牌并将其传递到语法分析器104。语法分析器104使用令牌创建描述令牌串的语法结构的树状中间代码、或语法树。语义分析器105使用语法树针对与语言定义的语义一致性检查源程序代码。中间代码生成器106创建中间代码,该中间代码被传递到解释器107。该中间代码是统一的且不取决于编写源代码102所用的语言。解释器107在执行环境110中执行(或解释)代码。执行环境110(运行时间环境)解决用于被执行代码的具名对象的分配方案和存储器,以及提供用于访问变量的机制,进程之间的链接,参数转移的机制,与操作系统、与I/O设备、以及与其它程序的交互。因此,执行环境110的初始化涉及存储器的分配以及向解释器107提供对变量和数据的访问权。应当注意,解释器107可以仅执行由中间代码生成器106创建的中间代码。为了便于描述,术语调查的代码和中间代码被视为等同的。中间代码或调查的代码为独立于机器的代码(该代码将由用于不同计算机架构的解释器执行)。因此,不管编写源代码102所用的编程语言,且由于词汇分析器103、语法分析器104、语义分析器105和中间代码生成器106的工作,将从统一的语言语法创建解释器107将能够执行的调查的代码。本地数据库111链接到执行环境110且包含对于调查的代码的对象的解释规则。在一个示例性方面中,对象为如下项之一:进程、类实例、类实例的方法或变量。在另一个示例性方面中,调查的代码可以包含嵌入式脚本代码区段109,且还包含用于与文件108(同样也为对象)工作的代码。在该情况下,将递归地进行由解释器107对代码的执行。嵌入式脚本例如还未被转换为中间代码且因此无法被解释器107执行。因此,嵌入式脚本109将必须再一次被发送到词汇分析器103,以便中间代码生成器106创建将被解释器107执行的中间代码。如果在调查的代码的执行过程中将文件保存到硬盘108,则该文件的内容也可以被解释器107执行。然而,文件内容包含非转换代码,因此该文件将被转发到防病毒程序101,随后该代码被模块103至模块106转换为中间代码。应当注意,本发明不限于计算机安全的领域和用于程序代码的防病毒扫描的解释器的使用。然而,也应当理解,本发明可以被应用在使用由解释器对代码的执行的计算机技术的任何其它领域中,例如以简化更新代码解释器中的解释规则的方法。在一个示例性方面中,解释器107可以附加地链接到记录模块115,该记录模块115可以在解释器107中的中间代码的每个指令的执行过程期间执行解释器的日志114中的记录。在一个示例性方面中,分析模块113配置成根据防病毒规则检查解释器的日志114的记录是否与防病毒记录的数据库112的记录同时发生。防病毒规则指定将调查的文件识别为恶意的或非恶意的所处的条件。如果所述记录同时发生,则将调查的代码确定为恶意的,且分析模块113将该信息转发到解释器107。解释器107在该情况下停止对代码的进一步执行并将控制转交到防病毒程序101,该防病毒程序101使计算机用户警觉发现的威胁(恶意文件)并采取合适步骤来消除调查的代码的恶意内容。下表1呈现了在解释器的日志114中和在防病毒记录的数据库112中同时发生的防病毒记录的示例。通常将防病毒记录称为签名。该表的第一记录包含记录打开,意味着进行请求以获得位于URL地址:“http://*****************exe***.jpg”(“*”指任何给定字符)的文件。第二记录意味着所进行的请求被发送到URL地址。第三记录指将数据保存到文件“c:\\\emp\\\\*********.exe。”而且第四记录指开始保存文件的执行。显然,这四个动作的连续执行通常为恶意文件的特性。因此,本示例中的防病毒规则将为如下:如果解释器的日志114包含表1的记录1至记录4的序列,则向调查的代码给出裁决“HEUR:Trojan-Downloader.Script.Generic:”(参看表2)。该裁决意味着调查的代码且因此源代码102为恶意文件-木马(Trojan)下载程式。表1表2图2示出根据本发明的一个方面的用于通过解释器执行程序代码的示例性系统。解释器107用于调查的代码(中间代码)201的各个指令的连续执行。当解释器107转入执行包含解释器缺少对其的解释规则的对象(即未知对象)的调查的代码201的指令时,停止对调查的代码201的进一步执行。解释规则为执行结果对应于对应指令的执行结果的程序代码。接着,解释器107获得执行结果对应于未知对象的执行结果的辅助代码,该辅助代码包含解释器具有对其的解释规则的那些对象(即已知对象)。然后解释器连续执行辅助代码的各个指令,以及在完成辅助代码的执行之后,解释器107利用调查的代码201的下一指令恢复对调查的代码201的执行,直到调查的代码201的最后指令已被执行的时间为止。在一个示例性方面中,对象为如下项之一:进程、类实例、类实例的方法或变量、脚本、文件。图3示出用于通过解释器执行程序代码的示例性方法。调查的代码201到达解释器107的输入端,以及在步骤301中,解释器107连续执行步骤202中的调查的代码201的各个指令。当解释器107开始执行包含解释器107缺少对其的解释规则的对象(即未知对象)的调查的代码201的指令时(在步骤303中的验证),在步骤304中停止对调查的代码的进一步执行,以及在步骤305中,解释器获得辅助代码306,该辅助代码306的执行结果对应于前文提及的未知对象的执行结果,该辅助代码306仅包含在解释器107中存在对其的解释规则的那些对象(即已知对象)。接着,在步骤301中转发辅助代码306以供解释器107执行,其中,该解释器107连续执行辅助代码306的各个指令,以及在完成辅助代码306的执行之后,该解释器107利用调查的代码201的下一指令恢复在步骤301中的调查的代码201的执行。辅助代码306的执行完成的验证发生在步骤302和步骤307中。本发明的方法的工作继续,直到执行调查的代码201的最后指令的时刻为止。在步骤302和步骤307中验证该条件。在执行调查的代码201的最后指令之后,在步骤308中结束解释器107的工作。在一个示例性方面中,在步骤301中,解释器107将解释器107的执行环境110初始化(步骤203)。在另一个示例性方面中,辅助代码306被包含在解释器107的执行环境110中,以及在步骤305中,从执行环境110获得辅助代码306。在一个示例性方面中,从本地数据库111获得辅助代码306。在该情况下,用于辅助代码306的执行环境(步骤203)可以被初始化,因为在初始化之后,用于解释器107的执行环境110不包含被辅助代码306使用的对象和变量。在一个示例性方面中,当所述辅助代码306不在本地数据库111时,从远程数据库(在图中未示出)获得辅助代码306。在一个示例性方面中,记录模块115用于在执行期间将代码的每个指令或指令的一部分记录在解释器的日志114中(在步骤301中)。需要记录在解释器的日志114中的指令的列表可以被包含在模拟器200中。在进行解释器107的日志中的记录和防病毒记录的数据库112中的记录时,分析模块113用于根据防病毒规则检查所述记录的匹配。如果所述记录匹配,则发现调查的代码102为恶意的。在一个示例性方面中,代码的执行和辅助代码的执行包含如下步骤:利用词汇分析器103的词汇分析、利用语法分析器104的语法分析、利用语义分析器105的语义分析、通过中间代码生成器106创建中间代码、以及利用解释器107根据解释规则解释中间代码。应当注意,辅助代码306可以用源代码102的语言或用转换的调查的代码201的语言(即以转换形式)来编写。例如,如果源语言为JavaScript,则转换的语言为虚拟Java机器的字节代码。在一个示例性方面中,当辅助代码306用源代码102的语言来编写时,辅助代码306首先将被转发到词汇分析器103,然后转发到语法分析器104和语义分析器105,以及最后,中间代码生成器106将从辅助代码306构造转换形式的辅助代码,然后该转换形式的辅助代码被解释器107执行。在一个示例性方面中,在辅助代码306的转换之后,该辅助代码306可以以转换形式连同非转换的辅助代码306一起被保存、或被保存在单独的存储器/高速缓存中。当该辅助代码接下来被解释器107请求时,转换形式的辅助代码然后将被返回到解释器107。在另一个示例性方面中,当初始以转换形式已经提供辅助代码306时,该辅助代码306将立刻被发送到解释器107用以执行。下表3呈现恶意的源代码的一部分的示例。为了更好的理解,给出真实的源代码102而非转换的调查的代码201。行4包含开始时缺少对其的解释规则的对象“Scripting.Dictionary”的调用。在本示例中,对象“Scripting.Dictionary”是未知对象。因此,在步骤4中,将停止在解释器107处对调查的代码的执行,以及将向解释器107提供来自表4的辅助代码306,该辅助代码306的执行结果对应于在调用表3的行4中的对象“Scripting.Dictionary”时的执行结果。在执行辅助代码306之后,将向前从表3的行5恢复对调查的代码的执行。来自表4的辅助代码306仅包含在解释器107中存在对其的解释规则的那些对象(已知对象)。应当注意,稀有对象(诸如函数)的调用通常具有恶意文件的特性-在该方式下,恶意文件检查它是否在模拟器中而非在真实计算机中被执行。表3表4在另一个示例性方面中,辅助代码306可以还包含其它未知对象,可以针对该其它未知对象获得对应的其它辅助代码,该其它辅助代码的执行结果对应于该其它未知对象的执行结果。表5呈现已知对象的示例。表6呈现用于未知对象的辅助代码如何包含已知对象和未知对象的示例。例如,用于未知对象G的辅助代码仅包含已知对象A、B、C。同时,用于未知对象H的辅助代码包含已知对象A、B二者和另一未知对象G。但是对于另一未知对象G,还存在有另一辅助代码,该另一辅助代码反过来取决于已知对象A、B、C。因此,在给定示例中,当在步骤202中执行包含未知对象H的调查的代码201中的指令时,在步骤304中将停止对调查的代码的执行。然后在步骤305中将获得用于对象H的辅助代码306,在步骤202中将继续该辅助代码306的执行。当执行用于对象H的辅助代码时,如果执行包含另一未知对象G的指令,则现在在步骤305中将获得用于该另一未知对象G的不同辅助代码,在步骤202中将继续该不同辅助代码的执行。在完成用于对象G的另一辅助代码的执行之后,用于对象H的辅助代码306的执行将继续,然后在完成用于对象H的辅助代码306的执行之后,对调查的代码201的执行将继续。显然,调查的代码201可以包含其它未知对象,需要再一次获得用于该其它未知对象的辅助代码。此外,可以按需深入地嵌入未知对象对已知对象的依赖性。表5已知对象A、B、C、D、E、F表6未知对象辅助代码包含对象GA、B、CHA、B、G上文描述的本发明的系统和方法的一个技术效果通过解释辅助程序代码来实现,该技术效果在于提高了由解释器对调查的程序代码的执行的质量。由解释器对调查的程序代码的执行的质量的提高在于如下事实:即使当调查的程序代码包含解释器缺少对其的解释规则的对象,解释器也继续执行调查的程序代码。当执行包含未知功能的指令时,现有技术中已知的解释器和模拟器完成其带有错误的执行。上文描述的本发明的系统和方法的另一个技术效果通过解释辅助程序代码来实现,该技术效果在于实现由解释器对调查的程序代码(该解释器缺少对于该程序代码的解释规则)的指令的执行,而不改变解释器本身。该技术效果被实现,原因是,由于由解释器执行辅助代码,因此将不会因为没有对于指令(解释器缺少对于该指令的解释规则)的任何解释规则而停止调查的代码的执行。图4为其上可实施用于通过解释器执行程序代码的系统和方法的方面的通用计算机系统的示例。如所示,该计算机系统20(其可以是个人计算机或服务器)包括中央处理单元21、系统存储器22和连接各种系统部件的系统总线23,各种系统部件包括与中央处理单元21相关联的存储器。如将由本领域的普通技术人员所领会,系统总线23可以包括总线存储器或总线存储器控制器、外围总线、以及能够与任何其它的总线架构交互的本地总线。系统存储器可以包括永久性存储器(ROM)24和随机存取存储器(Random-AccessMemory,RAM)25。基本输入/输出系统(BasicInput/OutputSystem,BIOS)26可以存储用于在计算机系统20的元件之间的信息传输的基本程序,例如在使用ROM24加载操作系统时的那些基本程序。计算机系统20还可以包括用于读取和写入数据的硬盘27、用于在可移动磁盘29上读取和写入的磁盘驱动器28、以及用于读取和写入可移动光盘31(诸如CD-ROM、DVD-ROM和其它光学媒介)的光盘驱动器30。硬盘27、磁盘驱动器28和光盘驱动器30分别通过硬盘接口32、磁盘接口33和光盘驱动器接口34而连接到系统总线23。驱动器和对应的计算机信息媒介为用于存储计算机系统20的计算机指令、数据结构、程序模块和其它数据的电源独立的模块。示例性方面包括借助控制器55使用连接到系统总线23的硬盘27、可移动磁盘29和可移动光盘31的系统。将由本领域的普通技术人员所理解,也可以利用能够以计算机可读的形式存储数据的任何类型的媒介56(固态驱动器、闪存卡、数字盘、随机存取存储器(RAM)等等)。计算机系统20具有可以存储操作系统35的文件系统36、以及额外的程序应用37、其它程序模块38和程序数据39。计算机系统20的用户可以使用键盘40、鼠标42、或本领域的普通技术人员已知的任何其它输入设备(诸如但不限于麦克风、操纵杆、游戏控制器、扫描器等)输入命令和信息。这些输入设备通常通过串行端口46插入到计算机系统20中,串行端口46转而连接到系统总线,但是本领域的普通技术人员将领会,输入设备也可以以其它方式来连接,诸如但不限于借助并行端口、游戏端口、或通用串行总线(UniversalSerialBus,USB)来连接。监控器47或其它类型的显示设备也可以通过接口(例如视频适配器48)连接到系统总线23。除了监控器47,个人计算机还可以装备有其它的外围输出设备(未示出),例如扬声器、打印机等。计算机系统20可以使用与一个或多个远程计算机49的网络连接而在网络环境中操作。一个或多个远程计算机49可以为本地计算机工作站或服务器,其包括在描述计算机系统20的性质时的上述元件中的大多数元件或全部元件。其它设备也可以存在于计算机网络中,诸如但不限于路由器、网站、对等设备或其它的网络节点。网络连接可以形成局域计算机网络(Local-AreacomputerNetwork,LAN)50和广域计算机网络(Wide-AreacomputerNetwork,WAN)。这些网络用在企业计算机网络和公司内部网络中,并且这些网络通常有权访问因特网。在LAN或WAN网络中,个人计算机20通过网络适配器或网络接口51连接到局域网50。当使用网络时,计算机20系统可以采用调制解调器54或本领域的普通技术人员所熟知的、实现与广域计算机网络(诸如因特网)的通信的其它模块。调制解调器54可以是内部设备或外部设备,可以通过串行端口46连接到系统总线23。本领域的普通技术人员将领会,所述网络连接是使用通信模块建立一个计算机与另一个计算机的连接的许多熟知方式的非限制性示例。在各个方面中,本文中所描述的系统和方法可以以硬件、软件、固件或它们的任何组合来实施。如果以软件来实施,则上述方法可以作为一个或多个指令或代码而被存储在非易失性计算机可读介质上。计算机可读介质包括数据存储器。以示例性而非限制性的方式,这种计算机可读介质可以包括RAM,ROM,EEPROM,CD-ROM,闪存或其它类型的电存储介质、磁存储介质或光存储介质,或可用来携带或存储所期望的指令或数据结构形式的程序代码并可以被通用计算机的处理器访问的任何其它介质。在各个方面中,本发明中所描述的系统和方法可以按照模块来处理。本文中所使用的术语“模块”指的是例如现实世界的设备、部件、或使用硬件(例如通过专用集成电路(ApplicationSpecificIntegratedCircuit,ASIC)或现场可编程门阵列(Field-ProgrammableGateArray,FPGA))实现的部件的布置,或者指的是硬件和软件的组合,例如通过微处理器系统和实现模块功能的指令集(该指令集在被执行时将微处理器系统转换成专用设备)来实现这样的组合。一个模块还可以被实施为两个模块的组合,其中单独地通过硬件促进某些功能,并且通过硬件和软件的组合促进其它功能。在某些实现方式中,模块的至少一部分(以及在一些情况下,模块的全部)可以被执行在通用计算机(例如上文在图4中更详细描述的通用计算机)的处理器上。因此,每个模块可以以各种适合的配置来实现,而不应受限于本文中所例示的任何特定的实现方式。为了清楚起见,本文中没有公开各个方面的所有例程特征。应当领会的是,在本发明的任何实际的实现方式的开发中,必须做出许多特定实现方式的决定,以便实现开发者的特定目标,并且这些特定目标将对于不同的实现方式和不同的开发者变化。应当理解的是,这种开发努力会是复杂的且费时的,但对于了解本发明的优点的本领域的普通技术人员来说仍然是工程的例行任务。此外,应当理解的是,本文中所使用的措辞或术语出于描述而非限制的目的,从而本说明书的术语或措辞应当由本领域技术人员根据本文中所提出的教导和指导结合相关领域技术人员的知识来解释。此外,不旨在将本说明书或权利要求中的任何术语归于不常见的或特定的含义,除非明确如此阐述。本文中所公开的各个方面包括本文中以说明性方式所引用的已知模块的现在和未来已知的等同物。此外,尽管已经示出并描述了各个方面和应用,但是对于了解本发明的优点的本领域技术人员将显而易见的是,在不脱离本文中所公开的发明构思的前提下,相比于上文所提及的内容而言的更多修改是可行的。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1