虚拟机监控方法和系统的制作方法

文档序号:6385996阅读:242来源:国知局
专利名称:虚拟机监控方法和系统的制作方法
技术领域
本发明涉及计算机安全技术,尤其涉及一种虚拟机监控方法和系统。
背景技术
计算机安全是计算机技术领域所关注的重要课题之一,随着计算机技术的发展,人们已通过多种手段监控防范对计算机的攻击,保证计算机系统的安全。图1为现有虚拟机安全监控技术中虚拟机指令插桩方法的流程图,当虚拟机进行指令操作时,首先是获取虚拟指令块,然后对指令块进行翻译,翻译成机器可识别的语言,最后执行相应的指令。如图1所示,在这个指令操作过程中,其虚拟机监控设置在指令执行过程中,具体为当虚拟机的中央处理单元(Central Processing Unit,简称CPU)执行每条指令时,通过判断该指令的地址是否在预先设置监控断点的地址范围,若是,则先调用相应的用于监控的回调函数,执行完回调函数对应的代码后再接着执行原来的指令,否则直接执行原指令,其中设置监控断点即指令插桩操作,也就是在原指令代码处设置一段监控代码,当CPU执行指令时,若某指令处设置有监控代码,则先执行监控代码,再执行原指令代码。通过这种虚拟机指令插桩方法可使虚拟机能够自动地对设置监控断点的虚拟机系统进行安全监控。但是,上述虚拟机指令插桩方法中,CPU在每次执行指令时都会去检查监控断点,而且当同一个指令被执行多次时,需要多次判断是否为监控断点,从而导致了虚拟机CPU资源的极大浪费,而且由于虚拟机执行指令时占用指令操作大部分时间,所以上述方法还对虚拟机的指令执行效率有较大影响。

发明内容
本发明提供一种虚拟机监控方法和系统,用以降低上述现有技术中对虚拟机监控时引起的虚拟机CPU资源的浪费和虚拟机的指令执行效率不高的问题。本发明的第一个方面是提供一种虚拟机监控方法,包括获取虚拟机操作系统的虚拟指令块,所述虚拟指令块中包括多个虚拟指令;在所述虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点;当执行所述虚拟指令时,根据第一监控断点执行监控。本发明的第二个方面是提供一种虚拟机监控系统,包括 第一获取模块,用于获取虚拟机操作系统的虚拟指令块,所述虚拟指令块中包括多个虚拟指令;第一设置模块,用于在所述虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点;第一监控模块,用于当执行所述虚拟指令时,根据第一监控断点执行监控。
本发明通过在虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点,使得在指令执行阶段无需检查监控断点,提高虚拟机的执行效率,避免了虚拟机CPU资源的浪费,从而极大提升了虚拟机的性能;进一步地,通过预先存储不同版本操作系统对应的关键代码的位置和数据结构的偏移,可以使虚拟机启动操作系统时能够自动灵活选择相应的监控断点信息,有效地提高了监控方法的实用性。


图1为现有虚拟机安全监控技术中虚拟机指令插桩方法的流程图;图2为本发明虚拟机监控方法实施例一的流程图;图3为本发明图2中虚拟指令块翻译的流程图;图4为本发明虚拟机监控方法在实际应用的具体流程图;图5为本发明虚拟机监控方法实施例二中数据监控部分的流程图;图6为本发明虚拟机监控方法实施例三中引导代码监控部分的流程图;图7为图6所示引导代码监控在实际应用中的监控原理图;图8为本发明虚拟机监控方法实施例四中硬件监控部分的流程图;图9为图8所示硬件监控的实际应用中的监控原理图;图10为本发明虚拟机监控系统实施例一的结构示意图;图11为本发明虚拟机监控系统实施例二的结构示意图;图12为本发明虚拟机监控系统实施例的具体应用结构示意图。
具体实施例方式以下结合说明书附图对本发明实施例进行详细说明。图2为本发明虚拟机监控方法实施例一的流程图,如图2所示,本实施例的方法包括步骤201、获取虚拟机操作系统的虚拟指令块,所述虚拟指令块中包括多个虚拟指令。当虚拟机操作系统在执行每条虚拟指令时,首先读取指令,在对指令进行翻译,翻译成机器可识别的语言,最后执行指令。本实施例的监控方法中,首先是获取虚拟机操作系统中包含多个虚拟指令的虚拟指令块,后续在指令翻译阶段进行指令插桩操作。步骤202、在所述虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点。虚拟指令的翻译指的是虚拟机在指令运行时对虚拟指令进行的实时翻译,其翻译的整个过程为虚拟指令的翻译阶段。图3为本发明图2中虚拟指令块翻译的流程图,如图3所示,虚拟机一般以指令块为单位生成翻译的指令代码并进行缓存,当虚拟CPU执行指令时,首先从已翻译的指令块缓存中查找,若没有命中,则先构造指令块,并进行翻译,之后再执行,同时将翻译的指令块进行缓存,若在缓存中查找到,即命中,则可以直接执行指令,因此,若某个指令已翻译过,则后续无论CPU执行多少次该指令均不需再进行翻译,即一个指令只需翻译一次,而可以执行多次,从而本实施例进行的监控断点设置也只进行一次,后续可多次直接执行使用,有利于提高虚拟CPU的执行效率,而且还有效降低了 CPU的资源消耗。在上述步骤201获取虚拟指令块后,在虚拟指令的翻译阶段,监控系统判断当前翻译的虚拟指令的地址是否在监控断点列表中监控断点的地址范围,若在,则需要对相应的虚拟指令设置监控断点,在原虚拟指令的头部插入监控代码,也即在翻译的指令流中添加调用回调函数的指令,以精确在指令处设置监控断点,当后续执行指令时,可以直接先执行插入的监控代码,再执行原虚拟指令,而无需如现有技术中在执行指令前进行判断,从而有效提高了指令执行时的效率。其中,监控断点列表可以为监控系统预先设定的存储在数据库中的监控断点信息,也可以为实时获取的需插入的监控断点信息。具体应用中,监控系统预先设定的存储在数据库中的监控断点信息时,其操作步骤包括通过获取当前虚拟机操作系统预设的监控断点信息;根据预设的监控断点信息生成与所述虚拟机操作系统相关联的监控断点列表,所述监控断点列表中包含预设的监控断点的地址,从而在虚拟指令块的翻译阶段,监控系统确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,以进行相应的处理。与现有技术中在指令执行阶段在每个指令执行前判断是否此指令地址为监控断点地址范围内相比,本实施例通过在翻译阶段进行插桩操作,设置监控断点。由于一个指令可能会被执行多次,而此指令的翻译只有一次,而且虚拟机指令执行时间要占指令操作总时间的99%以上,因此指令翻译阶段消耗的时间可以忽略不计,在翻译阶段进行插桩不会占用太多时间,而且一旦一个指令插桩完成,后续即使多次执行该指令,均可直接执行指令,无需判断,因此本发明的监控方法可以提高虚拟机的执行效率,同时也有效避免了虚拟机CPU资源的浪费。在实际应用中,由于虚拟机操作系统在不断改进完善,因此会存在多种操作系统版本,而不同版本中,需要对其进行监控的监控断点位置是不同的,因此有必要对不同版本操作系统的监控断点信息进行提取,建立与该版本对应的监控断点信息数据库,以便于虚拟机启动相应版本的操作系统时,可以根据对应版本的监控断点信息设置监控断点。具体操作中,针对不同版本提取并设置相应的监控断点的特征代码和数据结构,即提取并设置监控断点信息,包括步骤获取与虚拟机操作系统版本对应的系统文件的符号文件中的关键代码的位置和数据结构的偏移,所述关键代码和数据结构为预设的需设置监控断点的特征代码和数据结构;将获取的关键代码的位置和数据结构的偏移与虚拟机操作系统版本的对应关系存储在数据库中,以使虚拟机操作系统运行时根据所述数据库中存储的与虚拟机操作系统版本对应的关键代码的位置和数据结构的偏移设置监控断点。如windows操作系统中的系统文件的符号文件(Pdb后缀文件),在进行监控之前,可以从该符号文件中获取监控相关的关键代码位置和数据结构的偏移,并将其与windows系统版本的对应关系存储在数据库中。本实施例的监控方法中进一步通过提取并存储相应版本系统的监控断点信息,可以使虚拟机根据操作系统版本的不同自动灵活地选择适合的监控断点信息,从而有效地提高了监控方法的实用性。步骤203、当执行所述虚拟指令时,根据第一监控断点执行监控。当上述步骤202完成监控断点插桩操作后,后续虚拟机操作系统在执行虚拟指令时,可以根据设置的监控断点执行监控操作,获取监控记录文件,根据监控记录文件可以分析出虚拟机操作系统是否存在病毒或恶意代码攻击,以采取进行的防攻击处理,从而可有效保证虚拟机操作系统的安全。图4为本发明虚拟机监控方法在实际应用的具体流程图,如图4所示,该图显示了与现有技术中图1所示监控方法的区别,由图4可知,本发明中是在指令块的翻译阶段执行断点判断,并在指令翻译后在断点指令中添加监控断点信息,设置监控断点,从而在执行设置断点的指令时,可以直接回调函数并执行相应的指令。本实施例通过在虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点,使得在指令执行阶段无需检查监控断点,提高虚拟机的执行效率,避免了虚拟机CPU资源的浪费,从而极大提升了虚拟机的性能;进一步地,通过预先存储不同版本操作系统对应的关键代码的位置和数据结构的偏移,可以使虚拟机启动操作系统时能够自动灵活选择相应的监控断点信息,有效地提高了监控方法的实用性。本发明上述实施例是对虚拟机操作系统的指令代码进行监控保护,然而当虚拟机操作系统的核心数据受到恶意程序攻击时,仅仅通过监控代码以阻止攻击还是远远不够的,因此还需要进行数据监控。通常,操作系统的核心数据在内存中以链表形式保存,为防止恶意程序对核心数据的攻击,如对核心数据的链表的插入或移除操作等,需要对这些链表进行监控。图5为本发明虚拟机监控方法实施例二中数据监控部分的流程图,如图5所示,本实施例的方法在上述图2所示实施例的基础上,进一步还对核心数据的链表操作进行监控,其监控的具体步骤包括步骤501、当虚拟机操作系统的核心数据以双向链表形式保存时,在双向链表的前向指针和后向指针处设置第二监控断点。步骤502、当虚拟机操作系统进行指针操作时根据第二监控断点执行监控。本实施例中,虚拟机操作系统的核心数据以双向链表形式保存,双向链表包括前向指针和后向指针,通过在两个指针处设置监控断点,当进行指针操作时,若恶意程序对链表进行修改,则可以监控到,从而实现对链表修改的监控,保证链表维护的数据的安全性。本实施例在达到上述图1所示实施例技术效果的基础上,进一步在虚拟机操作系统的核心数据的双向链表的指针处设置监控断点,有效实现了链表修改的监控,从而实现对核心数据的保护。上述实施例中,虚拟监控方法从对指令代码及内存中的核心数据进行监控保护,当虚拟操作系统启动后,如bootkit和rootkit等恶意代码也已完成了加载,因此,在此后的监控中是无法监控到的,而且这些恶意代码还有可能产生干扰而导致监控失效,因此,有必要在虚拟机操作系统被引导启动时就执行监控,以提高监控的有效性。图6为本发明虚拟机监控方法实施例三中引导代码监控部分的流程图,如图6所示,本实施例的方法在上述图1或图5所示实施例的基础上,进一步还对虚拟机操作系统的启动引导程序进行了监控设置,其监控的具体步骤包括步骤601、对虚拟机操作系统的引导程序设置第三监控断点。步骤602、当所述引导程序在引导加载虚拟机操作系统时根据所述第三监控断点执行监控。
本实施例中,监控系统通过在虚拟机操作系统的系统引导程序中设置监控断点,当启动虚拟机操作系统时,引导程序在引导加载操作系统时就可以实现监控,即对系统loader的函数进行了监控,从而避免了加载操作系统后无法监控如bootkit和rootkit等恶意代码的问题,可以监控到恶意代码对主引导记录(Master Boot Record,简称MBR)的篡改行为,实现了提前监控处理,避免攻击。具体应用中,可以采用上述的代码监控和数据监控相结合的方式对引导程序进行设置监控断点。图7为图6所示引导代码监控在实际应用中的监控原理图。如图7所示,在引导代码监控中,对MBR设置代码监控断点,而对系统引导代码采用设置数据监控断点和代码监控断点相结合的方式,由图示可知,在加载操作系统之前已进行了监控,所以能够有效监控到bootkit和rootkit等恶意代码的攻击行为,达到了全面的监控。在上述的任一中监控方法实施例中,当恶意代码隐藏的更深的情况下,可能上述的监控方法也监控不到,但是无论恶意代码隐藏有多深,在其进行输入输出(10)操作时。必然会反映在硬件上,因此可以通过对硬件进行监控实现最底层的监控。图8为本发明虚拟机监控方法实施例四中硬件监控部分的流程图,如图8所示,本实施例的方法在上述图1、图5或图7所示实施例的基础上,进一步还对虚拟机的硬件进行了监控,其监控的具体步骤包括步骤801、采集虚拟机虚拟硬件输入输出的数据;步骤802、根据采集的输入输出数据对虚拟机进行监控。本实施例中,通过对执行网络数据收发的网卡和存储数据的磁盘等的10操作进行监控,实现了对最底层数据操作的监控。图9为图8所示硬件监控的实际应用中的监控原理图,如图9所示,通过对硬件进行监控,如通过获取网卡或磁盘的10数据,对这些获取的数据进行分析,从而可以获知10操作的数据是否异常数据,从而进一步实施监控处理。当进行监控时,对10操作的数据进行记录分析生成监控记录数据,以便于后续进行查看。上述监控方法实施例分别从不同角度不同层次对虚拟机进行监控,实现了针对不断升级的恶意攻击采取了有效监控,极大提升了虚拟机系统的性能。本领域普通技术人员可以理解实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括R0M、RAM、磁碟或者光盘等各种可以存储程序代码的介质。图10为本发明虚拟机监控系统实施例一的结构示意图,如图10所示,本实施例的监控系统包括第一获取模块10、第一设置模块11和第一监控模块12,其中,第一获取模块10,用于获取虚拟机操作系统的虚拟指令块,所述虚拟指令块中包括多个虚拟指令;第一设置模块11,用于在所述虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点;第一监控模块12,用于当执行所述虚拟指令时,根据第一监控断点执行监控。本实施例中,第一获取模块10获取虚拟机操作系统待执行的虚拟指令块,第一设置模块11在指令块翻译阶段设置监控断点,第一监控模块12在虚拟机操作系统执行所述虚拟指令时,根据第一设置模块11设置的第一监控断点执行监控。
本实施例可用于执行上述图2所示方法实施例的技术方案,其达到的技术效果和技术原理,在此不再详细赘述。图11为本发明虚拟机监控系统实施例二的结构示意图,如图11所示,本实施例的监控系统除了具有代码监控部分100,其包括上述图10中的第一获取模块10、第一设置模块11和第一监控模块12,而且还具有数据监控部分200、引导代码监控部分300、硬件监控部分400等,即在上述图10所示实施例的基础上,还进一步包括用于预先获取监控断点信息的收集模块13和生成模块14,其中,收集模块13,用于获取当前虚拟机操作系统预设的监控断点信息;生成模块14,用于根据预设的监控断点信息生成与所述虚拟机操作系统相关联的监控断点列表,所述监控断点列表中包含预设的监控断点的地址。在本实施例的一种实现方式中还可以进一步包括用于对核心数据的链表进行监控保护的数据监控部分200,即还包括第二设置模块20和第二监控模块21,其中第二设置模块20,用于当虚拟机操作系统的核心数据以双向链表形式保存时,在双向链表的前向指针和后向指针处设置第二监控断点;第二监控模块21,用于当虚拟机操作系统进行指针操作时根据第二监控断点执行监控。在本实施例的另一种实现方式中还可以进一步包括用于对虚拟机操作系统加载前的引导程序进行监控的引导代码监控部分300,即还包括第三设置模块30和第三监控模块31,其中,第三设置模块30,用于对虚拟机操作系统的引导程序设置第三监控断点;第三监控模块31,用于当所述引导程序在引导加载虚拟机操作系统时根据所述第三监控断点执行监控。在本实施例的又一种实现方式中还可以进一步包括用于对虚拟机操作系统的虚拟硬件进行监控的硬件监控部分400,即还包括采集模块40和第四监控模块41,其中,采集模块40,用于获取虚拟机虚拟硬件输入输出的数据;第四监控模块41,用于根据采集的输入输出数据对虚拟机进行监控。当监控系统用于对多个版本的虚拟机操作系统能够适用时,在本实施例的再一种实现方式中还可以进一步包括用于针对不同虚拟机操作系统版本的进行监控断点设置自动选择的部分,即还包括第二获取模块50和存储模块51,其中,第二获取模块50,用于获取与虚拟机操作系统版本对应的系统文件的符号文件中的关键代码的位置和数据结构的偏移,所述关键代码和数据结构为预设的需设置监控断点的特征代码和数据结构;存储模块51,用于将获取的关键代码的位置和数据结构的偏移与虚拟机操作系统版本的对应关系存储在数据库中,以使虚拟机操作系统运行时根据所述数据库中存储的与虚拟机操作系统版本对应的关键代码的位置和数据结构的偏移设置监控断点。本实施例的上述各种实现方式可以组合使用,也可以单独使用,本发明对此不作限制。上述各种实现方式分别可用于执行上述对应的方法实施例的技术方案,其达到的技术效果和技术原理,在此不再详细赘述。图12为本发明虚拟机监控系统实施例的具体应用结构示意图,如图11所示,图中左边的虚线框中为断点信息采集并存储部分,右边虚线框中为虚拟机操作系统运行时执行的监控并生成相应的监控记录。当虚拟机运行时,在系统内核加载之前利用翻译断点技术将断点信息数据库中存储的监控断点信息设置在相应断点处,从而后续进程、线程、模块信息运行时,应用程序接口(Application Programming Interface,简称API)调用信息以及其他信息运行时可以直接运行监控断点处设置的回调函数生成监控信息,存储在监控记录中,以备后续分析查看。其可用于执行上述方法实施例中的任一技术方案,其达到的技术效果和技术原理,在此不再详细赘述。最后应说明的是以上实施例仅用以说明本发明的技术方案而非对其进行限制,尽管参照较佳实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解其依然可以对本发明的技术方案进行修改或者等同替换,而这些修改或者等同替换亦不能使修改后的技术方案脱离本发明技术方案的精神和范围。
权利要求
1.一种虚拟机监控方法,其特征在于,包括 获取虚拟机操作系统的虚拟指令块,所述虚拟指令块中包括多个虚拟指令; 在所述虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点; 当执行所述虚拟指令时,根据第一监控断点执行监控。
2.根据权利要求1所述的方法,其特征在于,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围之前,还包括 获取当前虚拟机操作系统预设的监控断点信息; 根据预设的监控断点信息生成与所述虚拟机操作系统相关联的监控断点列表,所述监控断点列表中包含预设的监控断点的地址。
3.根据权利要求1所述的方法,其特征在于,还包括 当虚拟机操作系统的核心数据以双向链表形式保存时,在双向链表的前向指针和后向指针处设置第二监控断点; 当虚拟机操作系统进行指针操作时根据第二监控断点执行监控。
4.根据权利要求1所述的方法,其特征在于,还包括 对虚拟机操作系统的引导程序设置第三监控断点; 当所述引导程序在引导加载虚拟机操作系统时根据所述第三监控断点执行监控。
5.根据权利要求1所述的方法,其特征在于,还包括 采集虚拟机虚拟硬件输入输出的数据; 根据采集的输入输出数据对虚拟机进行监控。
6.根据权利要求1飞中任一项所述的方法,其特征在于,还包括获取与虚拟机操作系统版本对应的系统文件的符号文件中的关键代码的位置和数据结构的偏移,所述关键代码和数据结构为预设的需设置监控断点的特征代码和数据结构;将获取的关键代码的位置和数据结构的偏移与虚拟机操作系统版本的对应关系存储在数据库中,以使虚拟机操作系统运行时根据所述数据库中存储的与虚拟机操作系统版本对应的关键代码的位置和数据结构的偏移设置监控断点。
7.一种虚拟机监控系统,其特征在于,包括 第一获取模块,用于获取虚拟机操作系统的虚拟指令块,所述虚拟指令块中包括多个虚拟指令; 第一设置模块,用于在所述虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点; 第一监控模块,用于当执行所述虚拟指令时,根据第一监控断点执行监控。
8.根据权利要求7所述的系统,其特征在于,还包括 收集模块,用于获取当前虚拟机操作系统预设的监控断点信息; 生成模块,用于根据预设的监控断点信息生成与所述虚拟机操作系统相关联的监控断点列表,所述监控断点列表中包含预设的监控断点的地址。
9.根据权利要求7所述的系统,其特征在于,还包括 第二设置模块,用于当虚拟机操作系统的核心数据以双向链表形式保存时,在双向链表的前向指针和后向指针处设置第二监控断点; 第二监控模块,用于当虚拟机操作系统进行指针操作时根据第二监控断点执行监控。
10.根据权利要求7所述的系统,其特征在于,还包括 第三设置模块,用于对虚拟机操作系统的引导程序设置第三监控断点; 第三监控模块,用于当所述引导程序在引导加载虚拟机操作系统时根据所述第三监控断点执行监控。
11.根据权利要求7所述的系统,其特征在于,还包括 采集模块,用于获取虚拟机虚拟硬件输入输出的数据; 第四监控模块,用于根据采集的输入输出数据对虚拟机进行监控。
12.根据权利要求7 11中任一项所述的系统,其特征在于,还包括 第二获取模块,用于获取与虚拟机操作系统版本对应的系统文件的符号文件中的关键代码的位置和数据结构的偏移,所述关键代码和数据结构为预设的需设置监控断点的特征代码和数据结构; 存储模块,用于将获取的关键代码的位置和数据结构的偏移与虚拟机操作系统版本的对应关系存储在数据库中,以使虚拟机操作系统运行时根据所述数据库中存储的与虚拟机操作系统版本对应的关键代码的位置和数据结构的偏移设置监控断点。
全文摘要
本发明公开了一种虚拟机监控方法和系统。其中虚拟机监控方法,包括获取虚拟机操作系统的虚拟指令块,所述虚拟指令块中包括多个虚拟指令;在所述虚拟指令块的翻译阶段,确定当前翻译的虚拟指令的地址是否在监控断点列表中预设的监控断点的地址范围,若在,则对所述虚拟指令设置第一监控断点;当执行所述虚拟指令时,根据第一监控断点执行监控。本发明适用于在指令翻译阶段进行监控断点设置,而指令执行阶段无需检查监控断点,提高虚拟机的执行效率,能有效提升虚拟机的性能。
文档编号G06F9/50GK103019865SQ201210587189
公开日2013年4月3日 申请日期2012年12月28日 优先权日2012年12月28日
发明者刘业欣, 邱鹏 申请人:北京神州绿盟信息安全科技股份有限公司, 北京神州绿盟科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1