SO文件的保护方法及装置与流程

文档序号:13427011阅读:430来源:国知局
本申请涉及数据安全
技术领域
:,尤其涉及一种so(sharedobject,共享对象)文件的保护方法及装置。
背景技术
::so文件是linux系统中的动态链接库,其通过c语言或者c++语言编写的代码程序编译而来。在安卓系统中,通常使用c语言或c++语言编写核心函数,之后编译生成so文件,以供java层调用,由此可见,so文件的安全性至关重要。然而,相关技术中,攻击者,例如黑客通过使用一些较为常见的破解工具,例如ida破解工具,即可轻易地将so文件进行反编译,得到汇编代码,从而导致so文件中的核心函数暴露无疑,给恶意攻击者实施违法破坏行为提供了可能。基于此,亟需一种so文件的保护方法,以提高so文件的安全性,避免由于核心函数泄露而造成不必要的损失。技术实现要素:有鉴于此,本申请提供一种so文件的保护方法及装置,以提高so文件的安全性,避免由于核心函数泄露而造成不必要的损失。具体地,本申请是通过如下技术方案实现的:根据本申请实施例的第一方面,提供一种so文件的保护方法,so文件中包括保存有核心函数的自定义节区,所述自定义节区为待加密节区;所述方法包括:确定所述待加密节区之后是否存在下一待加密节区;若所述待加密节区之后存在下一待加密节区,则在所述待加密节区的指定位置插入第一设定标识和所述下一待加密节区的地址信息,并对所述待加密节区进行加密,得到第一加密节区。根据本申请实施例的第二方法,提供一种so文件的保护方法,所述so文件中存在加密节区,所述方法包括:对所述加密节区进行解密,得到所述加密节区的第一原始数据;若所述第一原始数据的指定位置上包括第一设定标识,则在所述第一原始数据的指定位置上获取下一加密节区的第一地址信息;基于所述第一地址信息获取所述下一加密节区,并对所述下一加密节区进行解密,得到所述下一加密节区的第二原始数据。根据本申请实施例的第三方面,提供一种so文件的保护装置,so文件中包括保存有核心函数的自定义节区,所述自定义节区为待加密节区;所述装置包括:第一确定模块,用于确定所述待加密节区之后是否存在下一待加密节区;第一加密模块,用于若所述待加密节区之后存在下一待加密节区,则在所述待加密节区的指定位置插入第一设定标识和所述下一待加密节区的地址信息,并对所述待加密节区进行加密,得到第一加密节区。根据本申请实施例的第四方面,提供一种so文件的保护装置,所述so文件中存在加密节区,所述装置包括:第一解密模块,用于对所述加密节区进行解密,得到所述加密节区的第一原始数据;第一数据获取模块,用于若所述第一原始数据的指定位置上包括第一设定标识,则在所述第一原始数据的指定位置上获取下一加密节区的第一地址信息;第二解密模块,用于基于所述第一地址信息获取所述下一加密节区,并对所述下一加密节区进行解密,得到所述下一加密节区的第二原始数据。由上述实施例可见,本申请通过在对待加密节区进行加密之前,首先确定该待加密节区之后是否存在下一待加密节区,若存在,则将下一待加密节区的地址信息添加在该待加密节区中,之后,再对该待加密节区进行加密。通过该种处理,可以实现后续在对so文件进行解密时,需要首先获取首个加密节区,对该首个加密节区进行解密,得到首个加密节区的原始数据,基于该原始数据才能获取其他加密节区的地址信息,从而获取其他加密节区。由此可见,由于后续在对加密后的so文件进行解密的过程中,对每一加密节区的解密过程是环环相扣的,从而增大了so文件的破解难度,也即有效提高了so文件的安全性,从而可以有效地避免由于核心函数泄露而造成不必要的损失。附图说明图1为elf格式的示意图;图2a为本申请so文件的保护方法的一个实施例流程图;图2b为自定义数据头header的格式的一种示例;图2c为加密后的so文件的一示例性结构图;图2d为加密后的so文件的另一示例性结构图;图3为本申请so文件的保护方法的另一个实施例流程图;图4为本申请so文件的保护装置的一个实施例框图;图5为本申请so文件的保护装置的另一个实施例框图。具体实施方式这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。so文件是eif格式的文件,如图1所示,为elf格式的示意图,其中,elf文件头,即“elfheader”中保存了路线图(roadmap),用于描述elf文件的组织情况;程序头部表,即“programheadertable”用于描述系统如何创建进程映像,用于构造进程映像的elf文件中必须具有该程序头部表,用于可重定位的elf文件中不需要具有该程序头部表;节区部分,即“sections”用于保存object文件的信息,从链接角度来看,该信息可以包括指令、数据、符号表、重定位信息、等等;节区头部表,即“sectionheadertable”用于描述节区部分的信息,节区部分中的每一节区在该节区头部表中都有一项,每一项描述了节区名称、节区大小等信息,用于链接的elf文件中必须包含该节区头部表,该节区头部表在其他用途的elf文件中可有可无。在安卓系统中,通常使用c语言或c++语言编写核心函数,之后编译生成so文件,以供java层调用,由此可见,so文件的安全性至关重要。然而,相关技术中,攻击者,例如黑客通过使用一些较为常见的破解工具,例如ida破解工具,即可轻易地将so文件进行反编译,得到汇编代码,从而导致so文件中的核心函数暴露无疑,给恶意攻击者实施违法破坏行为提供了可能。基于此,本申请实施例提供一种so文件的保护方法,在该方法中,考虑到实际应用中很可能存在不止一个待保护的核心函数,从而在“将核心函数放在so文件的自定义节区中,之后,找到该自定义节区,对该自定义节区进行加密”这一基础之上,进一步提出在对自定义节区加密之前,在该自定义节区中添加下一自定义节区的地址信息,之后,再对该自定义节区进行加密,通过该种处理,后续在对so文件进行解密时,则需要首先获取首个加密节区,对该首个加密节区进行解密,得到首个加密节区的原始数据,基于该原始数据才能获取下一加密节区的地址信息,从而获取其他加密节区。由此可见,通过执行本申请提出的so文件的保护方法,由于后续在对加密后的so文件进行解密的过程中,对每一加密节区的解密过程是环环相扣的,从而增大了so文件的破解难度,也即有效提高了so文件的安全性,从而可以有效地避免由于核心函数泄露而造成不必要的损失。为了使本领域技术人员可以更加清楚地明了本申请所提供的so文件的保护方法,列举下述实施例对该方法进行说明。首先,从“加密端”,例如服务端,对本申请所提供的so文件的保护方法进行说明:请参见图2a,为本申请so文件的保护方法的一个实施例流程图,该方法用于对so文件进行加密处理,在该so文件中包括保存有核心函数的自定义节区,该自定义节区即为待加密节区,该方法可以包括以下步骤:步骤201:确定待加密节区之后是否存在下一待加密节区,若是,则执行步骤202;否则,执行步骤203。步骤202:在待加密节区的指定位置插入第一设定标识和下一待加密节区的地址信息,并对待加密节区进行加密,得到第一加密节区。结束流程。步骤203:在待加密节区的指定位置插入第二设定标识,并对所述待加密节区进行加密,得到第二加密节区,其中,第一设定标识与第二设定标识不同。如下,对上述步骤201~步骤203进行说明:在本申请实施例中,可以使用“_attribute_((section("name")));”这个属性,将要保护的核心函数放在so文件的自定义节区中,该自定义节区即为待加密节区。在对自定义节区进行加密的过程中,首先获取待加密节区,具体获取过程包括:解析so文件,找到其中的节区头部表,即“sectionheadertable”,根据自定义节区的名称,即“name”,遍历该节区头部表中的每一表项,由上述图1的相关描述可知,so文件的节区部分中的每一节区在该节区头部表中都有一项,每一项描述了节区名称、节区大小等信息,从而通过遍历的方式,可以找到自定义节区“name”对应的表项,进而在该找到的表项中,获取到自定义节区“name”的偏移地址、大小等信息。后续则可以依据所获取到的偏移地址、大小在so文件中获取到自定义节区“name”。之后,确定待加密节区之后是否存在下一待加密节区,具体可根据预先定义的自定义节区的信息确定是否存在下一待加密节区,如下,首先对存在下一待加密节区的情况进行说明:当存在下一待加密节区时,获取该下一待加密节区的偏移地址与大小,具体是如何获取该下一待加密节区的偏移地址与大小的,可以参见上述“获取到自定义节区“name”的偏移地址、大小等信息”的相关描述,在此不再详述。后续,在待加密节区的指定位置插入第一设定标识,例如“1”,以及下一待加密节区的地址信息,这里所说的地址信息即可以包括偏移地址、大小等信息。由此可见,上述第一设定标识可用于表示存在下一加密节区,该第一设定标识可用于后续对so文件进行解密的过程中,具体解密过程可参见后续描述,在此先不作详述。在一个可选的实现方式中,可以在待加密节区的开始位置处插入上述第一设定标识与地址信息,具体的,可以在待加密节区的开始位置处插入一个自定义数据头header,如图2b所示,为自定义数据头header的格式的一种示例。在图2b所示例的自定义数据头header中,flag为设定标识,占用4个字节,此时其值为上述第一设定标识;offest表示偏移地址,占用4个字节;size表示大小,占用4个字节。需要说明的是,图2b所示例的自定义数据头header的格式仅仅作为举例,本申请对自定义数据头header的具体格式并不作限制。后续,对待加密节区进行加密,得到第一加密节区。其中,加密方式可以包括des、idea、等等,本申请对具体的加密方式并不作限制。其次,对不存在下一待加密节区的情况进行说明:当不存在下一待加密节区时,可以在待加密节区的指定位置插入第二设定标识,例如为“0”,后续,对待加密节区进行加密,得到第二加密节区。其中,加密方式可以包括des、idea、等等,本申请对具体的加密方式并不作限制。由上述描述可知,第二设定标识与第一设定标识不同,该第二设定标识可用于表示不存在下一加密节区,该第二设定标识也可用于后续对so文件进行解密的过程中,具体解密过程可参见后续描述,在此先不作详述。在一个可选的实现方式中,可以在待加密节区的开始位置处插入上述第二设定标识,具体的,可以与上述描述类似,在待加密节区的开始位置处插入一个自定义数据头header,该自定义数据头header与图2b所示例的自定义数据头header的区别在于:该自定义数据头header中仅包括flag,即设定标识,此时flag的值为第二设定标识。至此,完成步骤201~步骤203的描述。此外,还需要说明的是,在本申请实施例中,对待加密节区进行加密,得到第一加密节区之后,可以将第一加密节区的偏移地址记录在so文件的文件头中的e_entry字段,并将第一加密节区的大小记录在文件头中的e_shoff字段,以便后续可以基于e_entry字段和e_shoff字段对so文件进行解密,具体解密过程请参见后续描述,在此先不作详述。其中,由于e_entry字段用于表示程序开始的虚地址,其对程序运行并无任何意义,从而,可以对e_entry字段进行修改;由于e_shoff字段表示sectionheadertableoffset,其仅在程序链接过程中起作用,在程序装载过程中并无任何作用,从而,也可以对e_shoff字段进行修改。此外,还需要说明的是,在本申请实施例中,对待加密节区进行加密,得到第一加密节区之后,确定上述下一待加密节区之后是否存在其他加密节区,若存在,则可以在该下一待加密节区的指定位置上插入第一设定标识和其他待加密节区的地址信息,并对该下一待加密节区进行加密,得到第三加密节区;若不存在,则可以在该下一待加密节区的指定位置上插入第二设定标识,并对该下一待加密节区进行加密,得到第四加密节区。具体是如何在该下一待加密节区的指定位置上插入第一设定标识和其他待加密节区的地址信息;或者插入第二设定标识的,可以参加上述相关描述,再此不再详述。为了使本领域技术人员可以更清楚地理解本申请实施例所提供的so文件的保护方法的加密原理,列举下述举例:例一:以要保护两个核心函数为例,可以使用“_attribute_((section(".mytext1")));”这个属性,将其中一个核心函数放在自定义节区“.mytext1”中,使用“_attribute_((section(".mytext2")));”这个属性,将另一个核心函数放在自定义节区“.mytext2”中,自定义节区“.mytext1”和“.mytext2”即为待加密节区。首先,在so文件中获取自定义节区“.mytext1”,由于存在下一待加密节区,即自定义节区“.mytext2”,则可以在自定义节区“.mytext1”中插入自定义数据头部header1,在该自定义数据头部header1中,flag的值为第一设定标识,例如为“1”,offset2表示自定义节区“.mytext2”的偏移地址,size2表示自定义节区“.mytext2”的大小,并对自定义节区“.mytext1”进行加密。之后,将加密后的自定义节区“.mytext1”的偏移地址offset1记录在so文件的文件头中的e_entry字段,并将加密后的自定义节区“.mytext1”的大小size1记录在文件头中的e_shoff字段。后续,由于自定义节区“.mytext2”之后不存在其他待加密节区,则可以在自定义节区“.mytext2”中插入自定义数据头部header2,在该自定义数据头部header2中,flag的值为第二设定标识,例如为“0”。如图2c所示,为加密后的so文件的一示例性结构图。至此,完成例一的描述。例二:以要保护三个核心函数为例,可以使用“_attribute_((section(".mytext1")));”这个属性,将其中一个核心函数放在自定义节区“.mytext1”中,使用“_attribute_((section(".mytext2")));”这个属性,将另一个核心函数放在自定义节区“.mytext2”中,使用“_attribute_((section(".mytext3")));”这个属性,将再一个核心函数放在自定义节区“.mytext3”中,自定义节区“.mytext1”、“.mytext2”,以及“.mytext3”即为待加密节区。首先,在so文件中获取自定义节区“.mytext1”,由于存在下一待加密节区,即自定义节区“.mytext2”,则可以在自定义节区“.mytext1”中插入自定义数据头部header1,在该自定义数据头部header1中,flag的值为第一设定标识,例如为“1”,offset2表示自定义节区“.mytext2”的偏移地址,size2表示自定义节区“.mytext2”的大小,之后,对自定义节区“.mytext1”进行加密。之后,将加密后的自定义节区“.mytext1”的偏移地址offset1记录在so文件的文件头中的e_entry字段,并将加密后的自定义节区“.mytext1”的大小size1记录在文件头中的e_shoff字段。后续,由于下一待加密节区,即自定义节区“.mytext2”之后还存在其他待加密节区,即自定义节区“.mytext3”,则可以在自定义节区“.mytext2”中插入自定义数据头部header2,在该自定义数据头部header2中,flag的值为第一设定标识,例如为“1”,offset3表示自定义节区“.mytext3”的偏移地址,size3表示自定义节区“.mytext3”的大小,之后,对自定义节区“.mytext2”进行加密。后续,由于自定义节区“.mytext3”之后不存在其他待加密节区,则可以在自定义节区“.mytext3”中插入自定义数据头部header3,在该自定义数据头部header3中,flag的值为第二设定标识,例如为“0”。如图2d所示,为加密后的so文件的一示例性结构图。至此,完成例二的描述。由上述实施例可见,本申请通过在对待加密节区进行加密之前,首先确定该待加密节区之后是否存在下一待加密节区,若存在,则将下一待加密节区的地址信息添加在该待加密节区中,之后,再对该待加密节区进行加密。通过该种处理,可以实现后续在对so文件进行解密时,需要首先获取首个加密节区,对该首个加密节区进行解密,得到首个加密节区的原始数据,基于该原始数据才能获取其他加密节区的地址信息,从而获取其他加密节区。由此可见,由于后续在对加密后的so文件进行解密的过程中,对每一加密节区的解密过程是环环相扣的,从而增大了so文件的破解难度,也即有效提高了so文件的安全性,从而可以有效地避免由于核心函数泄露而造成不必要的损失。如下,从“解密端”,例如客户端,对本申请所提供的so文件的保护方法进行说明:请参见图3,为本申请so文件的保护方法的另一个实施例流程图,该方法用于对so文件进行解密处理,在该so文件中包括保存有加密节区,该方法可以包括以下步骤:步骤301:对加密节区进行解密,得到加密节区的第一原始数据。步骤302:若第一原始数据的指定位置上包括第一设定标识,则在第一原始数据的指定位置上获取下一加密节区的第一地址信息。步骤303:基于第一地址信息获取下一加密节区,并对下一加密节区进行解密,得到下一加密节区的第二原始数据。首先说明,在本申请实施例中,可以使用“_attribute_((constructor))”这个属性,对解密程序进行声明,以便顺利执行本申请提供的so文件的保护方法。如下,对步骤301~步骤303进行说明:在本申请实施例中,以对图2c所示例的加密后的so文件进行解密为例:在开始解密时,首先获取加密节区,为了描述方便,此处将获取到的加密节区称为首个加密节区,基于上述图2a所示实施例中的相关描述,可以在图2c所示例的加密后的so文件的文件头,即“elfheader”中,获取e_entry字段和e_shoff字段,该e_entry字段的值则表示首个加密节区的偏移地址,该e_shoff字段的值则表示首个加密节区的大小,那么,根据获取到的e_entry字段和e_shoff字段,即可获取首个加密节区,例如获取到自定义节区“.mytext1”节区1。后续,则可以对自定义节区“.mytext1”进行解密,得到自定义节区“.mytext1”的第一原始数据。基于上述图2a所示实施例中的相关描述,该第一原始数据中至少包括第一设定标识或第二设定标识,那么,则可以首先确定所获取到的原始数据的指定位置上存在第一设定标识还是第二设定标识,例如,结合图2b所示例的自定义数据头header的结构图,可以从原始数据的起始字节处(包括起始字节)开始,获取4个字节的数据,确定该4个字节的数据为第一设定标识还是第二设定标识。若第一原始数据的指定位置上存在第一设定标识,则可以确定还存在下一加密节区,则可以进一步在第一原始数据的指定位置上获取下一加密节区的第一地址信息,例如,结合图2b所示例的自定义数据头header的结构图,可以从第一原始数据的第5个字节处(包括第5个字节)开始,获取4个字节的数据,该4个字节的数据即为下一加密节区的偏移地址;继续从第一原始数据的第9个字节处(包括第9个字节)开始,获取4个字节的数据,该4个字节的数据即为下一加密节区的大小。后续,基于下一加密节区的第一地址信息,即可以在so文件中获取该下一加密节区,例如自定义节区“.mytext2”,并对自定义节区“.mytext2”进行解密,得到自定义节区“.mytext2”的第二原始数据。若第一原始数据的指定位置上存在第二设定标识,则可以确定不存在下一加密节区,即表示至此完成了对so文件的解密工作。至此,完成步骤301~步骤303的描述。此外,还需要说明的是,在对上述下一加密节区进行解密,得到下一加密节区的第二原始数据之后,可以确定该第二原始数据的指定位置上包括第一设定标识还是第二设定标识。若为第一设定标识,则可以在该第二原始数据的指定位置上获取其他加密节区的第二地址信息,基于该第二地址信息获取该其他加密节区,并对该其他加密节区进行解密,得到该其他加密节区的第三原始数据。此外,在本申请实施例中,在对加密节区,例如自定义节区“.mytext1”完成解密,得到第一原始数据后,可以在该第一原始数据中获取自定义节区“.mytext1”中的有效原始数据,使用该有效原始数据覆盖自定义节区“.mytext1”即可。具体的,结合图2b所示例的自定义数据头header的结构图,由于自定义节区“.mytext1”的头部插入有4个字节的第一设定标识,8个字节的地址信息,那么,则可以将该第一原始数据从头部开始,第13个字节处(包括第13个字节)之后的数据确定为有效原始数据。此外,如图2c所示,自定义节区“.mytext2”的头部中仅插入有4个字节的第二设定标识,那么,则可以将自定义节区“.mytext2”的第二原始数据从头部开始,第5个字节处(包括第5个字节)之后的数据确定为有效原始数据。由上述实施例可见,本申请通过在对加密后的so文件进行解密时,需要首先获取首个加密节区,对该首个加密节区进行解密,得到首个加密节区的原始数据,基于该原始数据才能获取其他加密节区的地址信息,从而获取其他加密节区。由此可见,由于在对加密后的so文件进行解密的过程中,对每一加密节区的解密过程是环环相扣的,从而增大了so文件的破解难度,也即有效提高了so文件的安全性,从而可以有效地避免由于核心函数泄露而造成不必要的损失。与前述so文件的保护方法的实施例相对应,本申请还提供了so文件的保护装置的实施例。首先,从“加密端”,例如服务端,对本申请so文件的保护装置进行说明:请参见图4,为本申请so文件的保护装置的一个实施例框图,该装置可以包括第一确定模块41、第一加密模块42。其中,该第一确定模块41,可以用于确定所述待加密节区之后是否存在下一待加密节区;该第一加密模块42,可以用于若所述待加密节区之后存在下一待加密节区,则在所述待加密节区的指定位置插入第一设定标识和所述下一待加密节区的地址信息,并对所述待加密节区进行加密,得到第一加密节区。在一实施例中,所述装置还可以包括(图4中未示出):第二加密模块,用于若所述待加密节区之后不存在下一待加密节区,则在所述待加密节区的指定位置插入第二设定标识,并对所述待加密节区进行加密,得到第二加密节区,其中,所述第一设定标识与所述第二设定标识不同。在一实施例中,所述装置还可以包括(图4中未示出):记录模块,用于将所述第一加密节区的偏移地址记录在所述so文件的文件头中的e_entry字段,并将所述第一加密节区的大小记录在所述文件头中的e_shoff字段。在一实施例中,所述装置还可以包括(图4中未示出):第二确定模块,用于确定所述下一待加密节区之后是否存在其他待加密节区;第三加密模块,用于若所述下一待加密节区之后存在其他待加密节区,则在所述下一待加密节区的指定位置上插入第一设定标识和所述其他待加密节区的地址信息,并对所述下一待加密节区进行加密,得到第三加密节区;第四加密模块,用于若所述下一待加密节区之后不存在其他待加密节区,则在所述下一待加密节区的指定位置插入第二设定标识,并对所述下一待加密节区进行加密,得到第四加密节区。其次,从“解密端”,例如客户端,对本申请so文件的保护装置进行说明:请参见图5,为本申请so文件的保护装置的另一个实施例框图,该装置可以包括第一解密模块51、第一数据获取模块52,以及第二解密模块53。其中,该第一解密模块51,可以用于对所述加密节区进行解密,得到所述加密节区的第一原始数据;该第一数据获取模块52,可以用于若所述第一原始数据的指定位置上包括第一设定标识,则在所述第一原始数据的指定位置上获取下一加密节区的第一地址信息;该第二解密模块53,可以用于基于所述第一地址信息获取所述下一加密节区,并对所述下一加密节区进行解密,得到所述下一加密节区的第二原始数据。在一实施例中,所述装置还可以包括(图5中未示出):第二数据获取模块,用于若所述第二原始数据的指定位置上包括所述第一设定标识,则在所述第二原始数据的指定位置上获取其他加密节区的第二地址信息;第三解密模块,用于基于所述第二地址信息获取所述其他加密节区,并对所述其他加密节区进行解密,得到所述其他加密节区的第三原始数据。上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1