掌桥专利:专业的专利平台
掌桥专利
首页

软件的保护方法、装置、电子设备及存储介质

文献发布时间:2023-06-19 11:35:49


软件的保护方法、装置、电子设备及存储介质

技术领域

本发明涉及计算机技术,尤其涉及一种软件的保护方法、装置、电子设备及存储介质。

背景技术

计算机软件一直以来面临着严重的安全威胁,其中内存破坏漏洞是一种最为广泛存在的安全威胁,这些漏洞常被攻击者利用,用于破坏敏感操作所使用的敏感数据,进而劫持或者破坏敏感操作。

现有技术中,针对上述威胁,最根本性的防御方案是确保敏感数据的完整性,一种常见的机制就是基于块密码算法实现对敏感数据的完整性验证,但是这种方式性能开销较大。

发明内容

针对上述问题,本发明提供了一种软件的保护方法、装置、电子设备及存储介质。

第一方面,本发明提供了一种软件的保护方法,包括:识别软件源代码中的敏感数据,并确定敏感数据的使用点;将所述敏感数据设置在所述软件源代码的编译产物的只读节中,以使软件运行时将敏感数据存储在只读区内;在所述敏感数据的使用点,插入检查代码,其中,所述检查代码用于在软件运行时,检查所读取的敏感数据是否在只读区内,并根据检查结果确定是否继续运行软件。

在其他可选的实施方式中,所述识别软件源代码中的敏感数据,并确定敏感数据的使用点,包括:识别带有特殊标记符的数据为所述敏感数据;确定与所述敏感数据关联的内存读指令所在位置为所述敏感数据的使用点,其中,所述内存读指令用于通过指针读取所述敏感数据。

在其他可选的实施方式中,所述识别带有特殊标记符的数据为所述敏感数据之前,还包括:根据预设规则识别软件源代码中包含敏感操作的指令,并利用所述特殊标记符标记所述指令所使用的数据;将所述数据与内存读指令关联。

在其他可选的实施方式中,所述方法还包括:利用所述特殊标记符标记所述内存读指令;所述在所述敏感数据的使用点,插入检查代码,包括:在标记的内存读指令之前,插入所述检查代码;或者将所述标记的内存读指令修改为包含检查代码在内的内存读代码。

在其他可选的实施方式中,所述将所述敏感数据设置在所述软件源代码的编译产物的只读节中,包括:识别敏感数据的合法取值集合,构成白名单,并将白名单中的数据设置在所述软件源代码的编译产物的只读节中;将所述敏感数据设置为白名单中的数据。

在其他可选的实施方式中,所述根据检查结果确定软件是否继续运行,包括:若所读取的敏感数据在只读区内,则继续运行软件;若所读取的敏感数据不在只读区内,则阻断运行软件。

在其他可选的实施方式中,所述检查代码基于不同处理器、硬件或操作系统的特性生成。

第二方面,本发明提供一种软件的保护装置,包括:识别模块,用于识别软件源代码中的敏感数据,并确定敏感数据的使用点;处理模块,用于将所述敏感数据设置在所述软件源代码的编译产物的只读节中,以使软件运行时将敏感数据存储在只读区内;插入模块,用于在所述敏感数据的使用点,插入检查代码,其中,所述检查代码用于在软件运行时,检查所读取的敏感数据是否在只读区内,并根据检查结果确定是否继续运行软件。

第三方面,本发明提供一种电子设备,包括:至少一个处理器和存储器;所述存储器存储计算机执行指令;所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如第一方面任一项所述的方法。

第四方面,本发明提供一种可读存储介质,所述可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如第一方面任一项所述的方法。

本发明提供的软件的保护方法、装置、电子设备及存储介质,通过识别软件源代码中的敏感数据,并确定敏感数据的使用点;将所述敏感数据设置在所述软件源代码的编译产物的只读节中,以使软件运行时将敏感数据存储在只读区内;在所述敏感数据的使用点,插入检查代码,其中,所述检查代码用于在软件运行时,检查所读取的敏感数据是否在只读区内,并根据检查结果确定是否继续运行软件;即本发明实施例通过在敏感数据使用点插入检查代码,使得软件在运行时,通过调用的检查代码检查要读取的敏感数据是否在只读区内,从而实现对敏感数据的完整性验证,进而在性能开销较小的同时防御敏感数据被破坏。

附图说明

图1是现有技术的敏感数据被破坏的示意图;

图2是现有技术中验证敏感数据完整性的三种机制的示意图;

图3为本发明提供的一种软件的保护方法的流程示意图;

图4为本发明提供的另一种软件的保护方法的流程示意图;

图5为本发明提供的一种软件的保护方法示意图;

图6为本发明提供的一种软件的保护装置的结构示意图;

图7为本发明提供的一种电子设备的结构示意图。

具体实施方式

为使本发明示例的目的、技术方案和优点更加清楚,下面将结合本发明示例中的附图,对本发明示例中的技术方案进行清楚、完整地描述。

计算机软件一直以来面临着严重的安全威胁,其中内存破坏漏洞是一种最为广泛存在的安全威胁。这些漏洞常被攻击者利用,用于破坏敏感操作的操作数(即敏感数据),进而劫持或者破坏敏感操作。

其中,敏感操作包括但不限于:程序控制流跳转(程序计数器更新)、敏感API调用(如system()函数、SQL查询等)、安全检查(各种白名单检查等)、关键业务操作(如转账、密码解密等)。而敏感操作的操作数,即敏感数据,包括但不限于:程序控制流跳转的操作数(函数返回地址、函数指针等)、敏感API调用的参数(system()函数执行的命令、SQL查询的语句参数)、安全检查使用的白名单配置、关键业务操作的操作数(如转账操作的收款地址、解密操作的密文输入)等等。

敏感数据被破坏后,攻击者即可发动各种各样的攻击。图1是现有技术的敏感数据被破坏的示意图,如图1所示,当敏感数据,例如可能值1被攻击者破坏后变为恶意值,恶意值就被使用在敏感信息使用点。例如,攻击者可以破坏函数指针或函数返回地址来劫持程序控制流,或者破坏system()或execve()等敏感API函数的参数来执行危险操作(如命令注入攻击、SQL注入攻击),这些是当前最流行且危害最大的攻击类型。攻击者同样可以破坏安全检查中使用的白名单配置,例如用户标识符(uid)、条件标志或其他元数据(如配置信息、策略信息、或影子内存)等,来绕过已部署的安全防护措施或发起面向数据的攻击。攻击者还可以破坏关键业务操作的操作数,如劫持转账操作的收款地址、解密目标密文等等。

针对敏感数据被破坏进而导致敏感操作被劫持这一威胁,最根本性的防御方案需要确保数据流完整性(Data-Flow Integrity,简称:DFI),即确保软件的数据流图(定义点与使用点之间的关系)在运行时不被违反,保障敏感信息使用点不被破坏。数据有其定义点和使用点,根据防御部署阶段不同,数据流完整性机制可以分为三类:一是在定义点阻止恶意内存读写操作的机制;二是将敏感数据流与普通数据流相互隔离的机制;三是在使用点验证数据完整性并检测攻击的机制。图2是现有技术中验证敏感数据完整性的三种机制的示意图。

第一类机制通过在数据定义点(内存写操作)进行安全检查,确保不会出现非法的内存写。SoftBound、AddressSanitizer等方案在软件层面实现了边界检查或者时序检查,提供了较强的数据流完整性保护,但是其性能开销高。MPX(Memory ProtectionEXtension,内存保护扩展)是Intel的一个硬件扩展,其被设计用来高效地进行边界检查,从而阻止越界类型的内存破坏攻击,提供空间上的内存安全保护。ARM提出的MTE(MemoryTagging Extension,内存标签扩展)硬件机制将每个内存字与相应的标签关联,可以被用来实现空间上的和时间上的内存安全保护。这两种方案性能开销较高,相关特性目前从硬件中已移除或者尚未实现。

第二类机制通过隔离代码指针等敏感数据,阻断存在潜在危害的内存写操作破坏敏感数据,来提供数据流完整性保护。HDFI(Hardware-Assisted Data-flow Isolation,硬件辅助的数据流隔离)方案将每个内存字或每若干个内存字与一个1位的内存标签关联,而IMIX(In-Process Memory Isolation Extension,进程内内存隔离扩展)方案将每个内存页与一个1位的内存标签关联,从而提供较强的数据流隔离和安全保证。Intel MPK(MemoryProtection Keys,内存保护键)与ARM DACR(Domain Access Control Register,域访问控制寄存器)将内存页分为若干键(keys)或域(domains),并为用户提供控制寄存器调整内存页的权限来实现数据流隔离。Intel SMAP(Supervisor Mode Access Prevention,特权态访问阻止)、Intel SMEP(Supervisor Mode Execution Prevention,特权态执行阻止)、ARMPAN(Privileged Access Never,特权访问阻止)、RISC-V SUM(Supervisor User Memory,特权态用户内存访问)等硬件特性提供了内核态与用户态的隔离。这些方案的防御强度通常不够高。

第三类机制通过在使用点验证数据完整性,确保敏感操作所使用的操作数未被篡改,保护敏感操作。ARM PA(Pointer Authentication,指针验证)机制基于块密码算法实现了对敏感数据的完整性验证,在苹果手机等产品中得到初步应用,取得了较好的防护效果,但是其性能开销较大。StackGuard等方案通过在栈上放置Canary/Cookie,并在函数返回之前验证Canary/Cookie是否被破坏,来验证返回地址的完整性,但是其防御强度较低。

针对上述问题,本发明的技术构思在于:通过在敏感数据使用点插入检查代码,使得软件在运行时,通过调用的检查代码检查要读取的敏感数据是否在只读区内,从而实现对敏感数据的完整性验证,进而在性能开销较小的同时防御敏感数据被破坏。

第一方面,本发明示例提供了一种软件的保护方法,图3为本发明提供的一种软件的保护方法的流程示意图。

如图3所示,该软件的保护方法包括:

步骤101、识别软件源代码中的敏感数据,并确定敏感数据的使用点。

需要说明的是,本发明的执行主体为电子设备中的编译器,例如LLVM/Clang编译器,可通过对编译器扩展实现本实施例。

具体来说,对于待保护的软件源代码,扩展后的编译器对其进行编译,在编译过程中,扩展后的编译器识别用户提供的敏感操作或预定义规则刻画的敏感操作。常见的敏感操作包括:程序控制流跳转(程序计数器更新)、敏感API调用(如system()函数、SQL查询等)、安全检查(各种白名单检查等)、关键业务操作(如转账、密码解密等);扩展后的编译器自动识别软件中对这些敏感操作的调用点(即敏感数据的使用点),以及敏感操作所使用的敏感数据。

作为可选的实施例,所述步骤S101,包括:识别带有特殊标记符的数据为所述敏感数据;确定与所述敏感数据关联的内存读指令所在位置为所述敏感数据的使用点,其中,所述内存读指令用于通过指针读取所述敏感数据。

具体来说,敏感数据通过特殊标记符进行标记,比如用户可以通过软件提供的接口为LLVM编译器中间表示(LLVM IR)上的数据(或称为Value对象)打上特殊标记(例如命名为ROLoad-md标记);然后可以将这些数据与某些LLVM IR内存读指令关联,表示这些IR内存读指令所读取的数据需要被保护。

作为可选的实施例,所述识别带有特殊标记符的数据为所述敏感数据之前,还包括:根据预设规则识别软件源代码中包含敏感操作的指令,并利用所述特殊标记符标记所述指令所使用的数据;将所述数据与内存读指令关联。

具体来说,在软件源代码编译过程中,逐渐扫描每一行指令,根据预先定义的规则或者用户提供的目标操作,自动识别软件中包含敏感操作的指令,并用特殊标记符(例如ROLoad-md)对所述指令所使用的数据进行标记,并将所述数据与内存读指令关联。

步骤102、将所述敏感数据设置在所述软件源代码的编译产物的只读节中,以使软件运行时将敏感数据存储在只读区内。

具体来说,可以将敏感数据设置在软件源代码的编译产物的只读节中,从而使得编译产物(即可执行文件)在装载运行时,将敏感数据放置在软件进程的只读内存区内。

作为可选的实施例,所述步骤S102,包括:识别敏感数据的合法取值集合,构成白名单,并将白名单中的数据设置在所述软件源代码的编译产物的只读节中;将所述敏感数据设置为白名单中的数据。

具体来说,扩展后的编译器自动识别敏感数据合法操作数取值集合(白名单)。需要说明的是,大多数敏感数据的使用点上实质上含有一些白名单,这些白名单由一系列不可变的数据组成。这些白名单的例子包括但不限于:C++软件的虚函数表、软件开发者自定义的函数指针表、格式化字符串以及硬编码的配置信息、安全检查的白名单策略、转账操作的收款地址、敏感操作的发起人等。优选的,本发明提出的方法通过程序分析或者用户指定的方式,自动识别这些白名单信息。在某些情况下,白名单没有在软件源代码中显式地定义,例如,间接控制流转移的目标可以在编译期或运行时被计算出来,但它们并没有直接地写明在软件源代码中,对于这些情况,本发明在编译时预计算这些白名单。也就是说,用户可以创建白名单文件,在文件中指定白名单信息,使得LLVM Pass读取对应的文件后能够获得白名单信息;还可以基于LLVM Pass对源代码进行分析,自动识别并构建部分敏感数据的白名单,例如C++软件的虚函数表等。

进而,扩展后的编译器将这些不可变的白名单数据放置在防篡改的区域内来使其免受破坏(或污染)。优选的,基于性能和易用性考虑,本发明选择内存中的只读页作为防篡改的区域,也就是说,本发明可以通过将白名单数据放置在可执行文件中只读节(section)来实现保护,该可执行文件被装载运行后,这些数据就存储于进程的只读内存区中。

另外,本发明会将软件中对敏感数据的使用改为对放置在只读内存中白名单数据的内存访问,自动修改软件确保正确性。

步骤103、在所述敏感数据的使用点,插入检查代码,其中,所述检查代码用于在软件运行时,检查所读取的敏感数据是否在只读区内,并根据检查结果确定是否继续运行软件。

具体来说,扩展后的编译器在敏感数据使用点插入检查代码,在软件运行时调用检查代码,对敏感数据的只读属性进行验证;如果运行时验证成功,则继续执行软件;在运行时的验证失败,则阻断软件继续执行。也就是说,本发明能够限定只有来自防篡改(只读内存)区域的数据可在敏感数据使用点被使用,能够阻止被污染或破坏的数据(非只读数据)在敏感数据使用点被使用,以此缓解内存攻击,从而保护软件的敏感操作。

作为可选的实施例,所述方法还包括:利用所述特殊标记符标记所述内存读指令;所述步骤S103,包括:在标记的内存读指令之前,插入所述检查代码;或者将所述标记的内存读指令修改为包含检查代码在内的内存读代码。

具体来说,扩展后的编译器,对软件源代码进行详细分析,逐条指令分析判断该指令是否存在敏感操作(包括但不限于虚函数调用等)。若某指令存在敏感操作,则该LLVMPass分析其操作数的来源,找到相应的IR内存读指令,使用ROLoad-md标记该指令;然后逐条修改所有被ROLoad-md标记的IR内存读指令,并在标记的内存读指令之前,插入所述检查代码;或者将所述标记的内存读指令修改为包含检查代码在内的内存读代码。

作为可选的实施方式,所述检查代码基于不同处理器、硬件或操作系统的特性生成。

具体来说,根据目标平台的硬件特性或者操作系统提供的特性等功能,扩展后的编译器构建并生成可验证数据只读属性的功能代码。例如,部分平台的硬件特性可能提供只读内存页的权限设置及检查,部分操作系统提供内存页的访问权限信息或提供只读内存地址范围等,这些特性或者信息都可以用于检查目标数据是否处于只读内存区。基于这些特性,扩展后的编译器能够构建相应功能代码,实现对敏感数据只读属性的验证。

本实施例提供的软件的保护方法,通过识别软件中的敏感数据,并确定敏感数据的使用点;将所述敏感数据设置在所述软件源代码的编译产物的只读节中,以使软件运行时将敏感数据存储在只读区内;在所述敏感数据的使用点,插入检查代码,其中,所述检查代码用于在软件运行时,检查所读取的敏感数据是否在只读区内,并根据检查结果确定是否继续运行软件;即本发明通过在敏感数据使用点插入检查代码,使得软件在运行时,通过调用的检查代码检查要读取的敏感数据是否在只读区内,从而实现对敏感数据的完整性验证,进而在性能开销较小的同时防御敏感数据被破坏。

结合前述的各实现方式,图4为本发明提供的另一种软件的保护方法的流程示意图,如图4所示,该软件的保护方法包括:

步骤201、识别软件源代码中的敏感数据,并确定敏感数据的使用点。

步骤202、将所述敏感数据设置在所述软件源代码的编译产物的只读节中,以使软件运行时将敏感数据存储在只读区内。

步骤203、在所述敏感数据的使用点,插入检查代码。

步骤204、在软件运行时,根据检查代码判断所读取的敏感数据是否在只读区内。

若是,则执行步骤205;若否,则执行步骤206。

步骤204、继续运行软件。

步骤205、阻断运行软件。

本实施方式中的步骤201、步骤202以及步骤203分别与前述实施方式中的步骤101、步骤102以及步骤103的在所述敏感数据的使用点,插入检查代码的实现方式类似,在此不进行赘述。

与前述实施方式不同的是,本实施例进一步限定了判断软件是否继续运行的具体实现方式。在本实施方式中,若所读取的敏感数据在只读区内,则继续运行软件;若所读取的敏感数据不在只读区内,则阻断运行软件。

具体来说,若运行时验证只读属性失败,说明某敏感指令的敏感操作的操作数(即敏感数据)不在进程的只读内存区中,此时本发明认为该进程执行发生异常,并使用目标平台的硬件特性或者操作系统提供的特性来阻断该进程继续执行(例如向该进程发送一个段错误信号,SIGSEGV),以确保只有只读内存区域的数据能够被此类敏感指令或敏感操作使用。可选的,只读属性的验证和进程的阻断可以由目标平台的同一个硬件特性或者操作系统提供的同一个特性完成。

为了更直观的了解本发明,图5为本发明提供的一种软件的保护方法示意图;如图5所示,敏感数据(例如可能值1、可能值2……可能值N等)存储在只读内存区中,软件运行时是通过指针读取的;正常情况下,软件运行时通过指针获取存储在只读区的敏感数据;当攻击者攻击指针时,有可能将指针指向存储在攻击者希望的区域,但本实施例会因为检查代码检测到敏感数据不是在只读区域内读取的,会发出段错误信号,阻断软件的继续运行。

在前述实施方式的基础上,通过若所读取的敏感数据在只读区内,则继续运行软件;若所读取的敏感数据不在只读区内,则阻断运行软件,即通过验证要读取的敏感数据是否在只读区内,实现对敏感数据的完整性验证,进而在性能开销较小的同时防御敏感数据被破坏。

第二方面,本发明示例提供了一种软件的保护装置,图6为本发明提供的一种软件的保护装置的结构示意图,如图6所示,该保护装置包括:

识别模块10,用于识别软件源代码中的敏感数据,并确定敏感数据的使用点;处理模块20,用于将所述敏感数据设置在所述软件源代码的编译产物的只读节中,以使软件运行时将敏感数据存储在只读区内;插入模块30,用于在所述敏感数据的使用点,插入检查代码,其中,所述检查代码用于在软件运行时,检查所读取的敏感数据是否在只读区内,并根据检查结果确定是否继续运行软件。

在其他可选的实施方式中,所述识别模块10,具体用于:识别带有特殊标记符的数据为所述敏感数据;确定与所述敏感数据关联的内存读指令所在位置为所述敏感数据的使用点,其中,所述内存读指令用于通过指针读取所述敏感数据。

在其他可选的实施方式中,所述识别模块10,还用于:根据预设规则识别软件源代码中包含敏感操作的指令,并利用所述特殊标记符标记所述指令所使用的数据;将所述数据与内存读指令关联。

在其他可选的实施方式中,所述识别模块10还用于:利用所述特殊标记符标记所述内存读指令;所述插入模块30,具体用于:在标记的内存读指令之前,插入所述检查代码;或者将所述标记的内存读指令修改为包含检查代码在内的内存读代码。

在其他可选的实施方式中,所述处理模块20,具体用于:识别敏感数据的合法取值集合,构成白名单,并将白名单中的数据设置在所述软件源代码的编译产物的只读节中;将所述敏感数据设置为白名单中的数据。

在其他可选的实施方式中,所述根据检查结果确定软件是否继续运行,包括:若所读取的敏感数据在只读区内,则继续运行软件;若所读取的敏感数据不在只读区内,则阻断运行软件。

在其他可选的实施方式中,所述检查代码基于不同处理器、硬件或操作系统的特性生成。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的软件的保护装置的具体工作过程以及相应的有益效果,可以参考前述方法示例中的对应过程,在此不再赘述。

本发明提供的软件的保护装置,通过识别模块,用于识别软件源代码中的敏感数据,并确定敏感数据的使用点;处理模块,用于将所述敏感数据设置在所述软件源代码的编译产物的只读节中,以使软件运行时将敏感数据存储在只读区内;插入模块,用于在所述敏感数据的使用点,插入检查代码,其中,所述检查代码用于在软件运行时,检查所读取的敏感数据是否在只读区内,并根据检查结果确定是否继续运行软件,即本发明通过在敏感数据使用点插入检查代码,使得软件在运行时,通过调用的检查代码检查要读取的敏感数据是否在只读区内,从而实现对敏感数据的完整性验证,进而在性能开销较小的同时防御敏感数据被破坏。

第三方面,本发明示例提供了一种电子设备,图7为本发明提供的一种电子设备的硬件结构示意图,如图7所示,包括:

至少一个处理器701和存储器702。

在具体实现过程中,至少一个处理器701执行所述存储器702存储的计算机执行指令,使得至少一个处理器701执行如上的方法,其中,处理器701、存储器702通过总线703连接。

处理器701的具体实现过程可参见上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。

在上述的图7所示的实施例中,应理解,处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application SpecificIntegrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。

存储器可能包含高速RAM存储器,也可能还包括非易失性存储NVM,例如至少一个磁盘存储器。

总线可以是工业标准体系结构(Industry Standard Architecture,简称:ISA)总线、外部设备互连(Peripheral Component Interconnect,简称:PCI)总线或扩展工业标准体系结构(Extended Industry Standard Architecture,简称:EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。

第四方面,本发明还提供了一种可读存储介质,所述可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上方法。

上述的可读存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM)、电可擦除可编程只读存储器(EEPROM)、可擦除可编程只读存储器(EPROM)、可编程只读存储器(PROM)、只读存储器(ROM)、磁存储器、快闪存储器、磁盘或光盘。可读存储介质可以是通用或专用计算机能够存取的任何可用介质。

一种示例性的可读存储介质耦合至处理器,从而使处理器能够从该可读存储介质读取信息,且可向该可读存储介质写入信息。当然,可读存储介质也可以是处理器的组成部分。处理器和可读存储介质可以位于专用集成电路(Application Specific IntegratedCircuits,简称:ASIC)中。当然,处理器和可读存储介质也可以作为分立组件存在于设备中。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

相关技术
  • 软件的保护方法、装置、电子设备及存储介质
  • 电子设备跌落保护方法、装置、存储介质及电子设备
技术分类

06120112985992