CN117492900A - 类文件加载方法、装置、电子设备及存储介质 - Google Patents
类文件加载方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN117492900A CN117492900A CN202310369290.6A CN202310369290A CN117492900A CN 117492900 A CN117492900 A CN 117492900A CN 202310369290 A CN202310369290 A CN 202310369290A CN 117492900 A CN117492900 A CN 117492900A
- Authority
- CN
- China
- Prior art keywords
- library
- virtual machine
- target
- address
- expansion
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000011068 loading method Methods 0.000 title claims abstract description 252
- 238000003860 storage Methods 0.000 title claims abstract description 115
- 238000000034 method Methods 0.000 claims abstract description 78
- 238000012545 processing Methods 0.000 claims abstract description 54
- 230000008569 process Effects 0.000 claims abstract description 48
- 230000006870 function Effects 0.000 claims description 350
- 238000013507 mapping Methods 0.000 description 18
- 238000010586 diagram Methods 0.000 description 16
- 238000004590 computer program Methods 0.000 description 7
- 238000003780 insertion Methods 0.000 description 7
- 230000037431 insertion Effects 0.000 description 7
- 238000005516 engineering process Methods 0.000 description 4
- 230000005540 biological transmission Effects 0.000 description 3
- 230000005055 memory storage Effects 0.000 description 3
- 238000004422 calculation algorithm Methods 0.000 description 2
- 238000005336 cracking Methods 0.000 description 2
- 238000009826 distribution Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 239000004065 semiconductor Substances 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000008030 elimination Effects 0.000 description 1
- 238000003379 elimination reaction Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45587—Isolation or security of virtual machine instances
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请实施例提供了类文件加载方法、装置、电子设备以及存储介质,类文件加载方法包括:获取待加载的目标扩展库的标识信息;根据目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到目标扩展库对应的扩展库参数信息;在创建虚拟机实例的情况下,根据虚拟机实例的地址信息和目标扩展库对应的扩展库参数信息对虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,扩展后的虚拟机实例包括目标扩展库;在扩展后的虚拟机实例接收到初始类文件时,通过解密函数对初始类文件进行解密处理,得到对应的目标类文件。本申请能够在虚拟机加载类文件的过程中提高数据安全性。
Description
技术领域
本申请涉及数据处理技术领域,尤其涉及一种类文件加载方法、装置、电子设备及存储介质。
背景技术
随着互联网技术的发展,Java应用的使用越来越广泛。实际应用中,可以通过虚拟机运行Java应用。虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
在通过虚拟机运行Java应用之前,往往需要基于类加载器ClassLoader加载机制,在ClassLoader中加载Java应用的类文件时执行动态解密,得到解密后的明文代码。ClassLoader的解密过程采用了Java字节码且该解密过程发生于虚拟机外部,对不法分子来说,该Java字节码的获取难度和破解难度相对较低,故ClassLoader的解密过程存在一定的安全性隐患,可能导致类文件对应的明文代码泄漏,给Java应用的生产方或使用方带来数据安全风险和经济损失。因此,在通过虚拟机加载类文件的过程中,数据安全性面临巨大的挑战。
发明内容
本申请实施例提供了一种类文件加载方法、装置、电子设备及存储介质,以在通过虚拟机加载类文件的过程中提高数据安全性。
第一方面,本申请实施例提供了一种类文件加载方法,包括:
获取待加载的目标扩展库的标识信息,所述标识信息用于确定唯一对应的扩展库,所述目标扩展库中封装有数据提供方写入的解密函数,所述解密函数用于对所述数据提供方提供的初始类文件进行解密;
根据所述目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到所述目标扩展库对应的扩展库参数信息;
在创建虚拟机实例的情况下,根据所述虚拟机实例的地址信息和所述目标扩展库对应的扩展库参数信息对所述虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,所述扩展后的虚拟机实例包括所述目标扩展库;
在所述扩展后的虚拟机实例接收到所述初始类文件时,通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件。
第二方面,本申请实施例提供了一种类文件加载装置,包括:
获取单元,用于获取待加载的目标扩展库的标识信息,所述标识信息用于确定唯一对应的扩展库,所述目标扩展库中封装有数据提供方写入的解密函数,所述解密函数用于对所述数据提供方提供的初始类文件进行解密;
查询单元,用于根据所述目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到所述目标扩展库对应的扩展库参数信息;
加载单元,用于在创建虚拟机实例的情况下,根据所述虚拟机实例的地址信息和所述目标扩展库对应的扩展库参数信息对所述虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,所述扩展后的虚拟机实例包括所述目标扩展库;
解密单元,用于在所述扩展后的虚拟机实例接收到所述初始类文件时,通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件。
第三方面,本申请实施例提供了一种电子设备,包括:处理器;以及,被配置为存储计算机可执行指令的存储器,所述计算机可执行指令在被执行时使所述处理器执行如第一方面所述的类文件加载方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,用于存储计算机可执行指令,所述计算机可执行指令在被处理器执行时实现如第一方面所述的类文件加载方法。
可以看出,在本申请实施例中,首先,获取待加载的目标扩展库的标识信息,标识信息用于确定唯一对应的扩展库,目标扩展库中封装有数据提供方写入的解密函数,解密函数用于对数据提供方提供的初始类文件进行解密;其次,根据目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到目标扩展库对应的扩展库参数信息;然后,在创建虚拟机实例的情况下,根据虚拟机实例的地址信息和目标扩展库对应的扩展库参数信息对虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,扩展后的虚拟机实例包括目标扩展库;最后,在扩展后的虚拟机实例接收到初始类文件时,通过解密函数对初始类文件进行解密处理,得到对应的目标类文件。以此,一方面,同一个数据提供方将解密函数封装入目标扩展库,以及,预先生成密文形式的初始类文件,则该数据提供方预先根据该解密函数对应的加密函数对明文代码进行加密处理,得到密文形式的初始类文件,故目标扩展库中封装的解密函数可以用于对该密文形式的初始类文件解密;另一方面,在创建虚拟机实例的情况下对虚拟机实例进行扩展库加载处理,使得扩展后的虚拟机实例包括目标扩展库,进而,在扩展后的虚拟机实例接收到初始类文件时,可以利用自身内部的目标扩展库中的解密函数对初始类文件进行解密处理,整个解密过程均发生在扩展后的虚拟机实例的内部,不法分子既不了解对初始类文件进行解密所需的解密函数,又难以获取扩展后的虚拟机实例内部的解密过程所使用的代码,故初始类文件对应的明文代码的破解难度相对较高,提高了通过虚拟机加载类文件过程中的数据安全性。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图;
图1为本申请实施例提供的一种类文件加载方法的处理流程图;
图2为本申请实施例提供的一种类文件加载方法中一个虚拟机工作示意图;
图3为本申请实施例提供的一种类文件加载方法中另一个虚拟机工作示意图;
图4为本申请实施例提供的一种类文件加载装置示意图;
图5为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请实施例中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本申请实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请的保护范围。
在虚拟机运行Java应用之前,往往需要先进行类文件的加载。类文件,即class文件,全名为Java class文件,主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。Java class文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。
实际应用中,虚拟机可以携带有一个或多个位于虚拟机之外且由Java语言编写的ClassLoader,该ClassLoader可以用于对class文件进行动态解密,得到对应的明文代码并将其传输至虚拟机中,以实现class文件的加载。ClassLoader可以在一定程度上保护class文件的数据安全,但ClassLoader本身是由Java语言编写的,其解密过程采用了Java字节码且解密过程发生于虚拟机外部,使得该Java字节码存在被不法分子获取并破解的安全隐患,最终导致明文代码泄漏,给Java应用的生产方或使用方带来了数据安全风险和经济损失。因此,在通过虚拟机加载class文件的过程中,数据安全性面临着较大的挑战。为了解决上述问题,本申请实施例提供了一种类文件加载方法。
图1为本申请实施例提供的一种类文件加载方法的处理流程图。图1的类文件加载方法可由电子设备执行,该电子设备可以是终端设备,比如手机、笔记本电脑、智能交互设备等等;或者,该电子设备还可以是服务器,比如独立的物理服务器、服务器集群或者是能够进行云计算的云服务器。参照图1,本实施例提供的类文件加载方法,具体包括步骤S102至步骤S108。
步骤S102,获取待加载的目标扩展库的标识信息,标识信息用于确定唯一对应的扩展库,目标扩展库中封装有数据提供方写入的解密函数,解密函数用于对数据提供方提供的初始类文件进行解密。
虚拟机可以是JVM(Java Virtual Machine,Java虚拟机)。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java应用只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
实际应用中,Java应用的分发方式逐渐从zip程序包转向fatjar模式,以简化应用分发和应用启动。zip程序包包括且不限于:启动脚本、程序jar包和依赖jar包,而fatjar是一种java应用的包结构,fatjar中主要包含了Java应用启动入口类和Java应用依赖的全部jar文件。jar是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的资源(文本、图片等)文件到一个文件。
示例性地,Java应用的fatjar包中申明一个或多个类文件,例如,Main-Class,Start-Class,等等。fatjar模式极大简化了java应用包的结构。实际应用中,可以通过在fatjar中申明Main-Class,通过JVM运行加载Main-Class,并在JarLauncher中通过类加载器ClassLoader支持JVM从fatjar包中加载指定Start-Class类,完成直接运行应用fatjar。
初始类文件,可以是由数据提供方提供的Java应用的class文件,该class文件可以是通过数据提供方指定的加密函数对明文代码进行加密处理所得到的密文形式的class文件,该明文代码可以是Java应用的源码。
目标扩展库中封装有数据提供方写入的解密函数,该解密函数可以用于对前述的初始类文件进行解密处理,得到对应的明文代码。在目标扩展库中写入并封装解密函数的数据提供方与初始类文件的数据提供方可以是同一个数据提供方,该数据提供方可以是初始类文件对应的Java应用的生产方。
明文与密文是相对的概念。明文,是指没有加密的文字或者字符串;密文是对明文进行加密后得到的文字或字符串。数据提供方在目标扩展库中写入并封装的解密函数和前述的数据提供方指定的加密函数之间存在对应关系,该解密函数可以用于对通过该加密函数对任意明文加密所得到的密文进行解密。
目标扩展库可以是预先配置的扩展库集合中的一个扩展库。该预先配置的扩展库集合可以包括多个扩展库。具体实施时,可以预先配置扩展库与标识信息的对应关系,每个扩展库具有唯一对应的标识信息。标识信息可以是扩展库编号,可以是扩展库名称,还可以是其他类型的可以用于确定唯一对应的扩展库的标识信息。例如,扩展库集合包括3个扩展库,分别对应于扩展库名称1、扩展库名称2以及扩展库名称3。
待加载的扩展库的数量可以是一个,也可以是多个。在待加载的扩展库的数量为一个的情况下,目标扩展库可以是该唯一的待加载的扩展库;在待加载的扩展库的数量为多个的情况下,目标扩展库可以是该多个待加载的扩展库中的一者。
扩展库可以用于扩展JVM的功能。例如,LIBZJAR扩展库,可以用于动态调试,在程序开发人员开发Java应用时利用该扩展库可以实现单行断点调试,也可以用于检测本地序号是否是规定的标准序号,从而实现版本安全检测,还可以用于动态解密,等等。
可选的,初始类文件可以包括class文件字节流。
可选的,解密函数可以是Sm4_decrypt函数,也可以是其他解密函数。该Sm4_decrypt函数可以使用标准sm4算法,对class文件字节流进行解密处理。
在一种具体的实现方式中,获取待加载的目标扩展库的标识信息,包括:检测指定存储目录中存储的扩展库标识信息集合;目标扩展库的标识信息为扩展库标识信息集合中的一个标识信息;或者,接收扩展库选择指令,并将扩展库选择指令携带的标识信息确定为待加载的目标扩展库的标识信息。
具体实施时,可以预先配置指定存储目录,该指定存储目录中存储有扩展库标识信息集合,该扩展库标识信息集合可以包括一个或多个标识信息。
若扩展库标识信息集合仅包括一个标识信息,则目标扩展库的标识信息为该唯一的标识信息。若扩展库标识信息集合包括多个标识信息,则目标扩展库的标识信息为该多个标识信息中的其中一者。例如,扩展库标识信息集合包括编号01、编号02……编号05,每个编号分别对应于一个扩展库,目标扩展库的标识信息为编号02。
在指定存储目录中存储的扩展库标识信息集合包括多个标识信息的情况下,其中每个扩展库均为待加载的扩展库,分别用于从不同的角度对JVM进行功能扩展。
扩展库标识信息集合对应的多个扩展库包括目标扩展库和其他待加载的扩展库。目标扩展库与其他待加载的扩展库的区别在于:目标扩展库中封装有数据提供方写入的解密函数,该解密函数用于对数据提供方提供的初始类文件进行解密;而其他待加载的扩展库中未封装该解密函数。
扩展库选择指令可以携带有一个或多个标识信息,该一个或多个标识信息中每个标识信息对应的扩展库均为待加载的扩展库。
在待加载的扩展库仅包括目标扩展库的情况下,获取待加载的目标扩展库的标识信息,可以是接收扩展库选择指令,并将扩展库选择指令携带的标识信息确定为待加载的目标扩展库的标识信息。
对于其他待加载的扩展库,也可以通过接收扩展库选择指令的方式获取该其他待加载的扩展库对应的标识信息,与获取待加载的目标扩展库的标识信息类似,不再赘述。
步骤S104,根据目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到目标扩展库对应的扩展库参数信息。
具体实施时,可以预先配置包括多个扩展库的扩展库参数信息,即预先配置多个扩展库参数信息,每个扩展库参数信息对应于一个扩展库。在该包括多个扩展库的扩展库参数信息基础上,可以配置标识信息与扩展库参数信息之间的对应关系。
扩展库参数信息包括且不限于:扩展库的初始加载函数地址,扩展库的功能描述信息,扩展库的类型信息,等等。
例如,标识信息包括扩展库名称1、扩展库名称2以及扩展库名称3。包括多个扩展库的扩展库参数信息如下所示:初始加载函数地址1101、初始加载函数地址2101以及初始加载函数地址3101。其中,扩展库名称1对应于初始加载函数地址1101,扩展库名称2对应于初始加载函数地址2101,扩展库名称3对应于初始加载函数地址3101。
扩展库的初始加载函数地址为用于存储扩展库的预设加载函数的虚拟存储地址。该虚拟存储地址不是在执行本实施例提供的类文件加载方法的电子设备的存储区域中的真实存储地址,而是用于在上述电子设备的存储区域中查询该虚拟存储地址对应的真实存储地址的索引信息。需要注意的是,在不同的电子设备或不同的虚拟机中,标识信息与扩展库参数信息之间的对应关系可以保持固定不变。
扩展库的功能描述信息可以是描述扩展库的功能的信息。
扩展库的类型信息可以包括多种预设扩展库类型中的一者。
根据目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到目标扩展库对应的扩展库参数信息,可以是根据目标扩展库的标识信息和预先配置的标识信息与扩展库参数信息之间的对应关系,在预先配置的包括多个扩展库的扩展库参数信息中查询得到目标扩展库的标识信息所对应的扩展库参数信息,并将该目标扩展库的标识信息所对应的扩展库参数信息确定为目标扩展库对应的扩展库参数信息。例如,标识信息包括扩展库名称1、扩展库名称2以及扩展库名称3。包括多个扩展库的扩展库参数信息如下所示:初始加载函数地址1101、初始加载函数地址2101以及初始加载函数地址3101。其中,扩展库名称1对应于初始加载函数地址1101;扩展库名称2对应于初始加载函数地址2101;扩展库名称3对应于初始加载函数地址3101。目标扩展库的标识信息为扩展库名称1,根据扩展库名称1和标识信息与扩展库参数信息之间的对应关系,在初始加载函数地址1101、初始加载函数地址2101以及初始加载函数地址3101中查询得到扩展库名称1对应的初始加载函数地址为1101,将该1101确定为目标扩展库对应的初始加载函数地址。
步骤S106,在创建虚拟机实例的情况下,根据虚拟机实例的地址信息和目标扩展库对应的扩展库参数信息对虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,扩展后的虚拟机实例包括目标扩展库。
需要强调的是,本说明书中的通过虚拟机加载类文件,在实际应用中,均为通过虚拟机实例加载类文件。创建虚拟机可以包括进行虚拟机计算资源的配置处理,例如,电子设备的存储区域具有8G空间大小,在创建虚拟机过程中配置虚拟机可用的存储空间的空间大小为4G;电子设备具有四核处理器,即该电子设备的基于单个半导体的一个处理器上拥有四个一样功能的处理器核心,在创建虚拟机过程中配置虚拟机可用的处理器核心为两个。
在创建虚拟机过程中,配置了虚拟机允许使用的计算资源的大小数值,但并没有分配实际的计算资源。例如,电子设备在创建虚拟机后,虚拟机计算资源的配置信息可以包括虚拟机被允许使用的存储资源的空间大小,但实际上在电子设备的存储区域中还没有为虚拟机分配实际的存储资源。在创建虚拟机之后,可以创建虚拟机实例,具体地,可以根据虚拟机计算资源的配置信息,创建虚拟机实例。
虚拟机实例可以是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统的实例,该实例可以运行Java应用。在创建虚拟机实例时,电子设备可以根据虚拟机计算资源的配置信息,在自身的存储区域中为该虚拟机实例分配可用的虚拟机存储区域,以及,在自身具有的处理器的多个处理器核心中为该虚拟机实例分配可用的处理器核心,等等。例如,电子设备的存储区域具有8G空间大小,在创建虚拟机过程中配置虚拟机可用的存储空间的空间大小为4G;电子设备具有四核处理器,即该电子设备的基于单个半导体的一个处理器上拥有四个一样功能的处理器核心k1-k4,在创建虚拟机过程中配置虚拟机可用的处理器核心为两个。在创建虚拟机实例时,电子设备的存储区域为由地址x1至地址x2构成的区域,电子设备为该虚拟机实例分配可用的虚拟机存储区域为由地址(x1+x2)/2至地址x2构成的区域;电子设备为该虚拟机实例分配可用的处理器核心包括k2和k4。x1与x2为自然数。
需要强调的是,在创建虚拟机之后,创建虚拟机实例之前,电子设备并未分配计算资源,不存在可运行Java应用的模拟的计算机系统。在创建虚拟机实例之后,才可以通过该虚拟机实例运行Java应用。本说明书中出现的“通过虚拟机加载类文件”可以是通过虚拟机实例加载类文件。
前述的待加载的扩展库,可以是待加载至虚拟机实例中的扩展库。前述的待加载的目标扩展库,可以是待加载至虚拟机实例中的目标扩展库。
通过每个虚拟机实例可以加载并运行一个或多个jar包,具体地,可以通过该虚拟机实例加载并运行jar包中一个或多个初始类文件。
需要注意的是,在创建该虚拟机实例时进行扩展库加载处理,得到扩展后的虚拟机实例之后,无论是通过该扩展后的虚拟机实例加载一个初始类文件,还是通过该扩展后的虚拟机实例先后加载多个初始类文件,都可以调用该扩展后的虚拟机实例包括的目标扩展库中的解密函数。在虚拟机实例的整个生命周期中,即从创建虚拟机实例到运行虚拟机实例再到消除虚拟机实例,只需要在创建虚拟机实例时进行一次性的扩展库加载处理,之后无需再重复加载。
在一种具体的实现方式中,扩展库参数信息包括目标扩展库的初始加载函数地址;根据虚拟机实例的地址信息和目标扩展库对应的扩展库参数信息对虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,包括:将初始加载函数地址加载到虚拟机进程中,并确定初始加载函数地址对应的目标加载函数地址,目标加载函数地址为虚拟机实例的内存中用于存储目标扩展库的预设加载函数的存储地址;预设加载函数用于对虚拟机实例进行目标扩展库的扩展库加载处理;根据虚拟机实例的地址信息和目标加载函数地址对虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例。
其中,目标扩展库对应的扩展库参数信息包括目标扩展库的初始加载函数地址。初始加载函数地址是一个虚拟地址,该虚拟地址可以是用于根据预先配置的映射方式确定在电子设备的存储区域中该虚拟地址对应的真实存储地址的索引信息。但由于该预先配置的映射方式是一种建立在电子设备已经为虚拟机实例分配计算资源的前提下的映射方式,初始加载函数地址无法直接使用,需要先将初始加载函数地址加载到该虚拟机实例对应的虚拟机进程中,才能够根据该映射方式对该初始加载函数地址进行映射处理,得到该初始加载函数地址对应的目标加载函数地址。该映射方式依赖于电子设备为虚拟机实例分配的可用的存储资源的地址信息,即虚拟机存储区域的地址信息。
目标加载函数地址为虚拟机实例的内存中用于存储目标扩展库的预设加载函数的存储地址,即电子设备为该虚拟机实例分配的存储资源中用于存储目标扩展库的预设加载函数的存储地址。预设加载函数用于对虚拟机实例进行目标扩展库的扩展库加载处理。示例性地,预设加载函数可以是扩展库初始化标准入口函数,即JVM_Onload入口函数。通过调用目标扩展库的预设加载函数,可以实现对虚拟机实例进行目标扩展库的扩展库加载处理,使得扩展后的虚拟机实例包括该目标扩展库。
初始加载函数地址与电子设备的存储区域中的任一存储地址不存在固定的对应关系,在不同的电子设备或虚拟机实例中,电子设备可能为当前创建中的虚拟机实例分配地址不同的存储资源,故在不同的电子设备或虚拟机实例中,初始加载函数地址对应的目标加载函数地址可能是不同的。
例如,目标数据库的初始加载函数地址为3101。
(a1)虚拟机实例1:
在创建虚拟机实例1时,电子设备在自身的存储区域中为该虚拟机实例1分配的存储资源为由地址a1-地址a2构成的区域A。
将该初始加载函数地址“3101”加载到该虚拟机实例1的虚拟机进程中,并根据预先配置的映射方式对“3101”进行映射处理,得到位于区域A中的目标加载函数地址a3。
(a2)虚拟机实例2:
在创建虚拟机实例2时,电子设备在自身的存储区域中为该虚拟机实例2分配的存储资源为由地址b1-地址b2构成的区域B。b1与a1不同,b2与a2不同,区域B为和区域A不相同,且没有重合部分的区域。
将该初始加载函数地址“3101”加载到该虚拟机实例2的虚拟机进程中,并根据预先配置的映射方式对“3101”进行映射处理,得到位于区域B中的目标加载函数地址b3。b3与a3不同。
(a3)虚拟机实例3:
在创建虚拟机实例3时,电子设备在自身的存储区域中为该虚拟机实例3分配的存储资源为由地址c1-地址c2构成的区域C。c1与a1、b1不同,c2与a2、b2不同,区域C为和区域A、区域B均不相同,且没有重合部分的区域。
将该初始加载函数地址“3101”加载到该虚拟机实例2的虚拟机进程中,并根据预先配置的映射方式对“3101”进行映射处理,得到位于区域C中的目标加载函数地址c3。c3与a3不同,且c3与b3不同。
在一种具体的实现方式中,目标加载函数地址通过如下方式确定:获取虚拟机实例的内存中的扩展库初始存储地址;扩展库初始存储地址用于标识预先配置的多个扩展库中首个扩展库对应的存储子区域的起始地址;对初始加载函数地址进行拆分处理,得到第一子地址和第二子地址;第一子地址用于标识目标扩展库在多个扩展库中的排列序号;第二子地址用于标识预设加载函数在其对应的存储子区域中的存储单元序号,其中,每个扩展库对应一个存储子区域,每个存储子区域包括多个存储单元;根据扩展库初始存储地址、第一子地址以及多个扩展库中每个扩展库对应的存储子区域的存储单元数量,计算得到目标扩展库对应的存储子区域的起始地址;根据目标扩展库对应的存储子区域的起始地址和第二子地址,确定初始加载函数地址对应的目标加载函数地址。
初始加载函数地址与目标加载函数地址之间的映射方式可以如下所示:
(b1)在电子设备为虚拟机实例分配可用的存储资源之后,获取虚拟机实例的内存中的扩展库初始存储地址;扩展库初始存储地址用于标识预先配置的多个扩展库中首个扩展库对应的存储子区域的起始地址。
例如,电子设备在自身的存储区域中为虚拟机实例分配可用的存储资源包括由地址a1至地址a2构成的区域A,该区域A包括由地址k1至地址kn’构成的扩展库存储区域,该扩展库存储区域包括多个扩展库中每个扩展库对应的存储子区域,其中,扩展库1对应的存储子区域由地址k1至地址k1’构成,扩展库2对应的存储子区域由地址k2至地址k2’构成,扩展库3对应的存储子区域由地址k3至地址k3’构成……扩展库n对应的存储子区域由地址kn至地址kn’构成,k1’位于k2之前,k2’位于k3之前……k(n-1)’位于kn之前,n为大于0的自然数,用于表示前述的扩展库存储区域对应的扩展库数量。
获取虚拟机实例的内存中的扩展库初始存储地址,可以是获取扩展库存储区域中首个扩展库对应的存储子区域的起始地址,参照上述例子,该起始地址为地址k1。
(b2)按照预先配置的拆分方式,对目标扩展库的初始加载函数地址进行拆分处理,得到第一子地址和第二子地址。
初始加载函数地址可以是一个字符数量为预设字符数量的字符串,该字符串可以包括字母,也可以包括数字,还可以包括其他形式的字符,如标点符号,等等。例如,初始加载函数地址可以是1101,可以是K101,可以是K1-01,还可以是其他格式的字符串。
按照预先配置的拆分方式,对目标扩展库的初始加载函数地址进行拆分处理,得到第一子地址和第二子地址,可以是根据预先确定的字符串拆分位置,对目标扩展库的初始加载函数地址进行拆分处理,得到两个子字符串,将该两个子字符串中在前的子字符串确定为第一子地址,将在后的子字符串确定为第二子地址。例如,初始加载函数地址为K101,预先确定的字符串拆分位置为第二个字符与第三个字符之间,则对K101进行拆分处理,得到在前的子字符串K1与在后的子字符串01,将K1确定为第一子地址,将01确定为第二子地址。
第一子地址用于标识目标扩展库在多个扩展库中的排列序号。对于不同电子设备或不同的虚拟机实例,可以为该多个扩展库配置共同的排列顺序,使得该多个扩展库中的每个扩展库在该多个扩展库中的排序序号是固定不变的。例如,第一扩展库的排列序号为1,第二扩展库的排序序号为2,第三扩展库的排列扩展库为3。在第三扩展库为待加载的目标扩展库的情况下,对该目标扩展库的初始加载函数地址为K301进行拆分处理,可以得到第一子地址K3,该K3用于标识目标扩展库在该多个扩展库中的排列序号为3。
第二子地址用于标识预设加载函数在其对应的存储子区域中的存储单元序号,其中,每个扩展库对应一个存储子区域,每个存储子区域包括多个存储单元。扩展库存储区域中,任意两个扩展库对应的存储子区域所包括的存储单元的数量可以相同,也可以不同。例如,扩展库存储区域包括该多个扩展库中每个扩展库对应的存储子区域,其中,扩展库1对应的存储子区域由地址k1至地址k1’构成,该存储子区域可以包括10个存储单元;扩展库2对应的存储子区域由地址k2至地址k2’构成,该存储子区域可以包括10个存储单元;扩展库3对应的存储子区域由地址k3至地址k3’构成,该存储子区域可以包括15个存储单元……扩展库n对应的存储子区域由地址kn至地址kn’构成,该存储子区域可以包括15个存储单元。k1’位于k2之前,k2’位于k3之前……k(n-1)’位于kn之前,n为大于0的自然数,用于表示前述的扩展库存储区域对应的扩展库数量。
对于每个扩展库,可以预先配置预设存储单元序号对应的存储单元均用于存储该扩展库的预设加载函数。例如,预设存储单元序号可以是1。即每个扩展库对应的存储子单元中第一个存储单元均用于存储该扩展库的预设加载函数。目标扩展库的初始加载函数地址为K101,对其进行拆分处理,得到第一子地址K1和第二子地址01,该第二子地址01用于表示预设存储单元序号为1,即扩展库1对应的存储子区域中第一个存储单元用于存储扩展库1的预设加载函数。
(b3)根据扩展库初始存储地址、第一子地址以及多个扩展库中每个扩展库对应的存储子区域的存储单元数量,计算得到目标扩展库对应的存储子区域的起始地址。
第一子地址用于标识目标扩展库在多个扩展库中的排列序号。根据第一子地址和该多个扩展库中排列序号位于目标扩展库之前的每个扩展库对应的存储子区域的存储单元数量,可以计算得到扩展库初始存储地址与目标扩展库对应的存储子区域的起始地址之间的存储单元的数量,进而,可以根据扩展库初始存储地址和该扩展库初始存储地址与目标扩展库对应的存储子区域的起始地址之间的存储单元的数量,确定目标扩展库对应的存储子区域的起始地址。需要注意的是,对于不同的电子设备或虚拟机实例,目标扩展库对应的第一子地址可以是固定值,且每个扩展库对应的存储子区域的存储单元数量可以是固定的,而扩展库初始存储地址可能是不同的。
(b4)根据目标扩展库对应的存储子区域的起始地址和第二子地址,确定初始加载函数地址对应的目标加载函数地址。
第二子地址用于标识预设加载函数在其对应的存储子区域中的存储单元序号,则根据目标扩展库对应的存储子区域的起始地址和第二子地址,可以在目标扩展库对应的存储子区域中,确定用于存储预设加载函数的存储单元的存储单元序号,从而得到目标加载函数地址。
上述(b1)-(b4)流程用于说明目标扩展库的初始加载函数地址与目标加载函数地址之间的映射方式,其他待加载的扩展库的初始加载函数地址与目标加载函数地址之间的映射方式与目标扩展库类似。
在创建虚拟机实例时,例如,待加载的扩展库的初始加载函数地址包括1-1、2-1、3-1以及4-1,分别将1-1、2-1、3-1、4-1加载到虚拟机进程中,确定1-1对应的目标加载函数地址为11,2-1对应的目标加载函数地址为21,3-1对应的目标加载函数地址为31,4-1对应的目标加载函数地址为41。具体地,在将3-1加载到虚拟机进程中,可以获取虚拟机实例的内存中的扩展库初始存储地址11,按照预先配置的拆分方式,对3-1进行拆分处理,得到第一子地址3和第二子地址1。第一子地址为“3”表示该多个扩展库中该3-1对应的扩展库的排列序号为3,第二子地址为“1”表示该排序序号为3的扩展库的存储子区域中,用于存储该扩展库的预设加载函数的存储单元的存储单元序号为1,即该存储子区域中第一个存储单元用于存储该扩展库的预设加载函数。
又预先配置多个扩展库中每个扩展库对应的存储子区域的存储单元数量均为10,则根据扩展库初始存储地址“11”、第一子地址“3”以及多个扩展库中每个扩展库对应的存储子区域的存储单元数量,可以计算得到目标扩展库对应的存储子区域的起始地址,如下所示:
11+10*2=31,
其中,“2”为该多个扩展库中排列序号位于目标扩展库之前的扩展库的数量,由第一子地址“3”确定,“10”为多个扩展库中每个扩展库对应的存储子区域的存储单元数量,“11”为扩展库初始存储地址。
初始加载函数地址1-1、2-1、以及4-1的计算处理流程与3-1类似,可以参照对应说明部分。
通过标识信息与初始加载函数之间的对应关系,以及,初始加载函数地址与目标加载函数地址之间的映射关系,可以在不同的电子设备或不同的虚拟机实例中,使用户只需要知道待加载的扩展库的标识信息,不需要了解该待加载的扩展库的预设入口函数实际存储于哪个地址,由电子设备自动将标识信息转换为初始加载函数地址,进而在将初始加载函数地址加载至虚拟机进程中时自动将该初始加载函数地址映射为对应的目标函数加载地址。内容固定且可读性相对较高的标识信息与在不同的虚拟机实例中可能不同的目标函数加载地址相比,更容易记忆,以此,提高了创建虚拟机实例之前确定选择待加载的扩展库的用户操作友好性。
在一种具体的实现方式中,根据虚拟机实例的地址信息和目标加载函数地址对虚拟机实例进行扩展库加载处理,包括:查询目标加载函数地址中是否存储有预设加载函数;若是,则将虚拟机实例的地址信息确定为预设加载函数的函数入参,并根据函数入参调用预设加载函数;若检测到预设返回值,则确定目标扩展库加载成功;预设返回值是目标扩展库根据虚拟机实例的地址信息获取虚拟机实例对应的虚拟机接口集合,根据解密函数和虚拟机接口集合中的待扩展函数进行接口事件回调注册,在注册成功时所生成的。
需要说明的是,尽管目标加载函数地址为虚拟机实例的内存中用于存储目标扩展库的预设加载函数的存储地址,但该目标加载函数地址中可能存储有预设加载函数,也可能未存储有预设加载函数。具体实施时,在建立虚拟机实例之前,电子设备可以预先根据JVM加载要求进行预设加载函数的配置,使得满足JVM加载要求的预设加载函数在电子设备的存储区域中存储于对应地址。
考虑到对于不同电子设备或不同的虚拟机实例,可以为该多个扩展库配置共同的排列顺序,使得该多个扩展库中的每个扩展库在该多个扩展库中的排序序号是固定不变的,且第一子地址用于标识目标扩展库在多个扩展库中的排列序号,故即便有不满足JVM加载要求的扩展库,在电子设备预先根据JVM加载要求进行预设加载函数的配置时会将该不满足JVM加载要求的扩展库的存储子区域空着,而不是将该不满足JVM加载要求的扩展库之后的各个满足JVM加载要求的扩展库的存储子区域向前移动。例如,扩展库1、扩展库3以及扩展库4为满足JVM加载要求的扩展库,则:扩展库1的预设加载函数存储于地址11;扩展库3的预设加载函数存储于地址31;扩展库4的预设加载函数存储于地址41;扩展库2为不满足JVM加载要求的扩展库,地址21未存储有扩展库2的预设加载函数。而不是:扩展库1的预设加载函数存储于地址11;扩展库3的预设加载函数存储于地址21;扩展库4的预设加载函数存储于地址31。
查询目标加载函数地址中是否存储有预设加载函数:若目标加载函数地址中存储有预设加载函数,则将虚拟机实例的地址信息确定为预设加载函数的函数入参,并根据函数入参调用预设加载函数。例如,目标加载函数地址为地址31,通过查询确定该地址31中存储有目标扩展库的预设加载函数,则将虚拟机实例的地址信息确定为预设加载函数的函数入参,并根据函数入参调用预设加载函数。
若目标加载函数地址中未存储有预设加载函数,则确定目标扩展库不满足JVM加载要求。例如,目标加载函数地址为地址21,通过查询确定该地址21中未存储有目标扩展库的预设加载函数,则确定目标扩展库不满足JVM加载要求。在根据函数入参调用预设加载函数之后,若检测到预设返回值,则确定目标扩展库加载成功;若未检测到预设返回值,则确定目标扩展库加载失败。预设返回值是目标扩展库根据虚拟机实例的地址信息获取虚拟机实例对应的虚拟机接口集合,根据解密函数和虚拟机接口集合中的待扩展函数进行接口事件回调注册,在注册成功时所生成的。
具体地,在调用预设加载函数的过程中:首先,通过虚拟机实例向目标扩展库发送该函数入参,即虚拟机实例的地址信息。其次,目标扩展库根据该地址信息,通过JVM的GetEnv函数获取JVMTI(JVM Tool Interface,JVM暴露扩展的接口集合)信息,即虚拟机实例对应的虚拟机接口集合。然后,目标扩展库根据解密函数和虚拟机接口集合中的待扩展函数进行接口事件回调注册,例如,目标扩展库定义jvmtiEventCallbacks类型的变量callbacks,并将callbacks的ClassFileLoadHook值设为un_chipher_class_func函数,调用JVMTI的SetEventCallbacks,参数为变量callbacks,完成JVMTI事件回调注册。un_chipher_class_func函数可以是接收JVMTI加载class文件的回调入口函数,其函数参数包括且不限于类名和class文件字节流。最后,在接口事件回调注册成功的情况下,目标扩展库返回预设返回值,例如,JNI_OK。
需要注意的是,在接口事件回调注册成功的情况下,扩展后的虚拟机实例中的一个回调函数与目标扩展库的解密函数之间可以建立映射关系,使得该回调函数被调用时,该扩展后的虚拟机实例可以通过该回调函数向目标扩展库发送待解密的密文字节流,并接收由目标扩展库返回的该密文字节流对应的明文字节流,该明文字节流由目标扩展库通过解密函数对该密文字节流进行解密后得到。该回调函数与目标扩展库之间的数据传输均发生于扩展后的虚拟机实例中,不容易被扩展后的虚拟机实例之外的用户获取。
该密文字节流可以是初始类文件中的class文件字节流。即当扩展后的虚拟机实例接收到初始类文件时,可以将该class文件字节流确定为回调函数的函数入参,并基于该函数入参调用该回调函数,以及,接收由目标扩展库返回的明文代码,将该明文代码确定为目标类文件,该明文代码由目标扩展库通过解密函数对该class文件字节流进行解密处理所得到。
另外,在实际应用中,可以基于每个待加载的扩展库的标识信息和初始加载函数地址构建该待加载的扩展库对应的扩展库参数信息结构,例如,load_entry结构,该load_entry结构可以包括对应的扩展库的标识信息,以及,对应的扩展库的初始加载函数地址。
在生成每个待加载的扩展库的扩展库参数信息结构之后,可以将各个扩展库参数信息结构存储于预设扩展库数组中,例如,将每个待加载的扩展库的load_entry结构存储于load_entry_list数组中。
通过虚拟机实例可以迭代该预设扩展库数组种的每个扩展库参数信息结构,依次查找每个待加载的扩展库的初始加载函数地址对应的目标加载函数地址中是否存在该待加载的扩展库的预设加载函数。例如,通过虚拟机实例可以迭代load_entry_list数组中的每个load_entry结构,依次使用dl_open函数查找每个load_entry结构中的初始加载函数地址对应的目标加载函数地址中是否存储有该待加载的扩展库的预设加载函数。若是,则确定通过虚拟机实例可以调用该预设加载函数;若否,则跳过该load_entry结构对应的待加载的扩展库,继续使用dl_open函数继续查找下一个load_entry结构中的初始加载函数地址对应的目标加载函数地址中是否存储有该待加载的扩展库的预设加载函数。
步骤S108,在扩展后的虚拟机实例接收到初始类文件时,通过解密函数对初始类文件进行解密处理,得到对应的目标类文件。
具体实施时,在扩展后的虚拟机实例的生命周期内,该扩展后的虚拟机实例可能接收到一个或多个初始类文件。该初始类文件可以是由数据提供方提供的密文形式的class文件。通过解密函数对该密文形式的class文件进行解密处理,可以得到该密文形式的class文件对应的明文代码,将该明文代码确定为该密文形式的class文件对应的目标类文件。
由于扩展后的虚拟机实例包括目标扩展库,目标扩展库中封装有解密函数,通过扩展后的虚拟机实例中的解密函数对初始类文件进行解密处理,而不是由位于虚拟机实例之外的类加载器ClassLoader进行解密处理,对不法分子来说,当解密流程发生于虚拟机实例内部时,比发生于虚拟机实例之外时代码的获取难度更高,不法分子难以直接跟踪和反编译虚拟机实例内部的代码。
另外,由于解密函数是由数据提供方预先写入并封装于目标扩展库中的,解密函数可以采用与编写ClassLoader时所使用的Java字节码相比破解难度更高的代码编写,例如,二进制指令格式的代码。二进制指令格式的解密函数可以是一串由“0”和“1”中的至少一者构成的字符串,二进制指令格式格式的代码可读性很低,破解难度与Java字节码相比更大,因此,该二进制指令格式的解密函数的破解难度更高,不容易被不法分子反编译。
在一种具体的实现方式中,通过解密函数对初始类文件进行解密处理,得到对应的目标类文件,包括:对初始类文件进行解析处理,得到初始类文件中包括的秘钥和加密字符串;根据解密函数和秘钥,对加密字符串进行解密处理,得到目标类文件。
解密函数可以是一种用于解密的算法,可以和密钥结合共同进行解密。初始类文件可以是由数据提供方通过指定的加密函数和密钥对明文代码进行加密处理所得到的密文形式的class文件。具体地,数据提供方可以根据密钥和该加密函数共同对明文代码进行加密,得到加密字符串,再基于预设插入位置,将密钥插入到该加密字符串中,得到密文形式的class文件。例如,加密函数表示:将明文代码中的每个字母转换为1-26中对应的数字之后再加上秘钥的数值,密钥为5,明文代码为ABC,则A可以转化为1再加5得到6,同理,B可以转化为7,C可以转化为8,根据密钥和加密函数共同对明文代码ABC进行加密,可以得到密文字符串678。预设插入位置为加密字符串中第二个字符与第三个字符之间。基于该预设插入位置,将密钥5插入到该加密字符串中,得到密文形式的class文件6758。
上述加密函数以及加密流程仅仅是示例性地,对本实施例不构成特殊限制。
对于不法分子来说,即便获得密文形式的class文件,不知道该class文件通过什么方式解密,不知道密钥是多少,也不知道密钥的插入位置,破解难度较大。
对初始类文件进行解析处理,得到初始类文件中包括的密钥和加密字符串,可以是基于预设插入位置,对初始类文件进行拆分处理和拼接处理,得到密钥和加密字符串。例如:
(c1)初始类文件为密文形式的class文件“6758”,预设插入位置为第三个字符所处的字符位置,基于该预设插入位置对“6758”进行拆分处理,得到“67”、“5”以及“8”;
(c2)对“67”和“8”进行拼接处理,得到“678”;
(c3)将预设插入位置对应的“5”确定为密钥,将拼接得到的“678”确定为加密字符串。
根据解密函数和秘钥,对加密字符串进行解密处理,得到目标类文件。例如,解密函数表示:将密文中的每个数字减去密钥的数值再转换为A-Z中对应的字母。密钥为“5”,则6减去5等于1,再转化为A,同理,7可以转化为B,8可以转化为C。根据解密函数和秘钥,共同对加密字符串“678”进行解密处理,得到明文代码“ABC”,将该明文代码确定为目标类文件。
通过密钥和解密函数共同解密,一方面,可以将密钥和加密字符串混合在一起形成加密形式的class文件,以提高初始类文件的破解难度,另一方面,数据提供方可以为不同的初始类文件分别配置不同的密钥,从而在个别密钥泄露的情况下不影响其他初始类文件的安全性。在一种具体的实现方式中,通过解密函数对初始类文件进行解密处理,得到对应的目标类文件,包括:根据初始类文件的类名,确定初始类文件是否存在解密需求;若是,则通过解密函数对初始类文件进行解密处理,得到目标类文件;若否,则将初始类文件确定为目标类文件。
初始类文件可以包括class文件字节流以及该初始类文件的类名。根据初始类文件的类名,可以确定该初始类文件是否存在解密需求:若是,则通过解密函数对该class文件字节流进行解密处理,得到目标类文件。例如,调用目标扩展库中的“sm4_decrypt”函数对class文件字节流进行解密处理,得到明文代码,将该明文代码确定为目标类文件。若否,则无需进行解密,可以直接将该初始类文件确定为目标类文件。该情况下,初始类文件并非密文形式的class文件,而是可以直接运行的明文形式的class文件。
在得到目标类文件之后,虚拟机实例可以使用该目标类文件进行加载class文件的后续操作,从而运行该目标类文件对应的Java应用。
本申请实施例中,首先,获取待加载的目标扩展库的标识信息,标识信息用于确定唯一对应的扩展库,目标扩展库中封装有数据提供方写入的解密函数,解密函数用于对数据提供方提供的初始类文件进行解密;其次,根据目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到目标扩展库对应的扩展库参数信息;然后,在创建虚拟机实例的情况下,根据虚拟机实例的地址信息和目标扩展库对应的扩展库参数信息对虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,扩展后的虚拟机实例包括目标扩展库;最后,在扩展后的虚拟机实例接收到初始类文件时,通过解密函数对初始类文件进行解密处理,得到对应的目标类文件。以此,一方面,同一个数据提供方将解密函数封装入目标扩展库,以及,预先生成密文形式的初始类文件,则该数据提供方预先根据该解密函数对应的加密函数对明文代码进行加密处理,得到密文形式的初始类文件,故目标扩展库中封装的解密函数可以用于对该密文形式的初始类文件解密;另一方面,在创建虚拟机实例的情况下对虚拟机实例进行扩展库加载处理,使得扩展后的虚拟机实例包括目标扩展库,进而,在扩展后的虚拟机实例接收到初始类文件时,可以利用自身内部的目标扩展库中的解密函数对初始类文件进行解密处理,整个解密过程均发生在扩展后的虚拟机实例的内部,不法分子既不了解对初始类文件进行解密所需的解密函数,又难以获取扩展后的虚拟机实例内部的解密过程所使用的代码,故初始类文件对应的明文代码的破解难度相对较高,提高了通过虚拟机加载类文件过程中的数据安全性。
出于与前述的方法实施例相同的技术构思,本申请实施例还提供了一种类文件加载方法的实施例。图2为本申请实施例提供的一种类文件加载方法中一个虚拟机工作示意图。
如图2所示,虚拟机202包括实例创建模块2022和回调函数2024。该回调函数2024可以是按JVMTI标准所注册的扩展函数event_callbacks。实例创建模块2022可以在创建JVM实例的过程中,调用扩展库204中的扩展库初始化标准入口函数2042,以实现对扩展库实例进行该扩展库204的扩展库加载处理,得到扩展后的虚拟机实例,该扩展后的虚拟机实例包括该扩展库204。
通过扩展后的虚拟机实例可以调用该回调函数2024,以实现对待加载的类文件进行解密处理,并加载解密后的类文件。待加载的类文件可以是由数据提供方提供的密文形式的class文件,可以参照图1实施例中的初始类文件。解密后的类文件可以参照图1实施例中的目标类文件。该回调函数2024与解密函数2044之间可以存在对应关系,具体地,该回调函数2024被调用时可以通过解密函数2044进行解密处理。
由于技术构思相同,本实施例中描述得比较简单,相关的部分请参见上述提供的方法实施例的对应说明即可。
出于与前述的方法实施例相同的技术构思,本申请实施例还提供了一种类文件加载方法的实施例。图3为本申请实施例提供的一种类文件加载方法中另一个虚拟机工作示意图。
虚拟机实例302为扩展之前的虚拟机实例,该虚拟机实例302在进行扩展库加载处理之后,与扩展库304共同构成扩展后的虚拟机实例300。
虚拟机实例302中可以根据扩展库选择指令的命令参数生成多个load_entry结构,每个load_entry结构对应于一个待加载的扩展库。其中,load_entry结构,即扩展库参数信息3022对应于扩展库304,存储有该扩展库304的名称“扩展库1”和函数地址“1-1”,该函数地址可以参照图1实施例中的初始加载函数地址的对应说明部分。
示例性地,在扩展库1、扩展库2、……、扩展库n均为待加载的扩展库的情况下,如图3所示的虚拟机实例302还可以包括扩展库2、……、扩展库n中每个扩展库分别对应的load_entry结构,该n为大于1的自然数。图3中仅示例性示出了扩展库参数信息3022以及扩展库n对应的load_entry结构,该扩展库n对应的load_entry结构存储有该扩展库n的名称“扩展库n”和函数地址“n-1”,该函数地址可以参照图1实施例中的初始加载函数地址的对应说明部分。
利用该函数地址,可以调用该扩展库304中的扩展库初始化标准入口函数3042,进而,该扩展库304可以按JVMTI标准进行回调函数3024的注册,即在回调函数3024与解密函数3044之间建立映射关系。
在检测到类文件加载,即扩展后的虚拟机实例300接收到待加载的类文件3026的情况下,调用该该回调函数3024,以实现对该待加载的类文件3026进行解密处理。
具体地,该回调函数3024被调用时可以通过解密函数3044进行解密处理。
由于技术构思相同,本实施例中描述得比较简单,相关的部分请参见上述提供的方法实施例的对应说明即可。
在上述的实施例中,提供了一种类文件加载方法,与之相对应的,基于相同的技术构思,本申请实施例还提供了一种类文件加载装置,下面结合附图进行说明。
图4为本申请实施例提供的一种类文件加载装置示意图。
本实施例提供一种类文件加载装置400,包括:
获取单元402,用于获取待加载的目标扩展库的标识信息,所述标识信息用于确定唯一对应的扩展库,所述目标扩展库中封装有数据提供方写入的解密函数,所述解密函数用于对所述数据提供方提供的初始类文件进行解密;
查询单元404,用于根据所述目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到所述目标扩展库对应的扩展库参数信息;
加载单元406,用于在创建虚拟机实例的情况下,根据所述虚拟机实例的地址信息和所述目标扩展库对应的扩展库参数信息对所述虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,所述扩展后的虚拟机实例包括所述目标扩展库;
解密单元408,用于在所述扩展后的虚拟机实例接收到所述初始类文件时,通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件。可选地,获取单元402,包括:
检测指定存储目录中存储的扩展库标识信息集合;所述目标扩展库的标识信息为所述扩展库标识信息集合中的一个标识信息;
或者,
接收扩展库选择指令,并将所述扩展库选择指令携带的标识信息确定为所述待加载的目标扩展库的标识信息。
可选地,所述扩展库参数信息包括所述目标扩展库的初始加载函数地址;加载单元406,具体用于:
将所述初始加载函数地址加载到虚拟机进程中,并确定所述初始加载函数地址对应的目标加载函数地址,所述目标加载函数地址为所述虚拟机实例的内存中用于存储所述目标扩展库的预设加载函数的存储地址;所述预设加载函数用于对所述虚拟机实例进行所述目标扩展库的扩展库加载处理;
根据所述虚拟机实例的地址信息和所述目标加载函数地址对所述虚拟机实例进行扩展库加载处理,得到所述扩展后的虚拟机实例。
可选地,所述目标加载函数地址通过如下方式确定:
获取所述虚拟机实例的内存中的扩展库初始存储地址;所述扩展库初始存储地址用于标识预先配置的多个扩展库中首个扩展库对应的存储子区域的起始地址;
对所述初始加载函数地址进行拆分处理,得到第一子地址和第二子地址;所述第一子地址用于标识所述目标扩展库在所述多个扩展库中的排列序号;所述第二子地址用于标识所述预设加载函数在其对应的存储子区域中的存储单元序号,其中,每个扩展库对应一个存储子区域,每个存储子区域包括多个存储单元;
根据所述扩展库初始存储地址、所述第一子地址以及所述多个扩展库中每个扩展库对应的存储子区域的存储单元数量,计算得到所述目标扩展库对应的存储子区域的起始地址;
根据所述目标扩展库对应的存储子区域的起始地址和所述第二子地址,确定所述初始加载函数地址对应的所述目标加载函数地址。
可选地,加载单元406,还具体用于:
查询所述目标加载函数地址中是否存储有所述预设加载函数;
若是,则将所述虚拟机实例的地址信息确定为所述预设加载函数的函数入参,并根据所述函数入参调用所述预设加载函数;
若检测到预设返回值,则确定所述目标扩展库加载成功;所述预设返回值是所述目标扩展库根据所述虚拟机实例的地址信息获取所述虚拟机实例对应的虚拟机接口集合,根据所述解密函数和所述虚拟机接口集合中的待扩展函数进行接口事件回调注册,在注册成功时所生成的。
可选地,解密单元408,具体用于:
对所述初始类文件进行解析处理,得到所述初始类文件中包括的秘钥和加密字符串;
根据所述解密函数和所述秘钥,对所述加密字符串进行解密处理,得到所述目标类文件。
可选地,解密单元408,具体用于:
根据所述初始类文件的类名,确定所述初始类文件是否存在解密需求;
若是,则通过所述解密函数对所述初始类文件进行解密处理,得到所述目标类文件;
若否,则将所述初始类文件确定为所述目标类文件。
本申请实施例所提供的类文件加载装置包括获取单元,用于获取待加载的目标扩展库的标识信息,标识信息用于确定唯一对应的扩展库,目标扩展库中封装有数据提供方写入的解密函数,解密函数用于对数据提供方提供的初始类文件进行解密;查询单元,用于根据目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到目标扩展库对应的扩展库参数信息;加载单元,用于在创建虚拟机实例的情况下,根据虚拟机实例的地址信息和目标扩展库对应的扩展库参数信息对虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,扩展后的虚拟机实例包括目标扩展库;解密单元,用于在扩展后的虚拟机实例接收到初始类文件时,通过解密函数对初始类文件进行解密处理,得到对应的目标类文件。以此,一方面,同一个数据提供方将解密函数封装入目标扩展库,以及,预先生成密文形式的初始类文件,则该数据提供方预先根据该解密函数对应的加密函数对明文代码进行加密处理,得到密文形式的初始类文件,故目标扩展库中封装的解密函数可以用于对该密文形式的初始类文件解密;另一方面,在创建虚拟机实例的情况下对虚拟机实例进行扩展库加载处理,使得扩展后的虚拟机实例包括目标扩展库,进而,在扩展后的虚拟机实例接收到初始类文件时,可以利用自身内部的目标扩展库中的解密函数对初始类文件进行解密处理,整个解密过程均发生在扩展后的虚拟机实例的内部,不法分子既不了解对初始类文件进行解密所需的解密函数,又难以获取扩展后的虚拟机实例内部的解密过程所使用的代码,故初始类文件对应的明文代码的破解难度相对较高,提高了通过虚拟机加载类文件过程中的数据安全性。
对应上述描述的一种类文件加载方法,基于相同的技术构思,本申请实施例还提供一种电子设备,该电子设备用于执行上述提供的类文件加载方法,图5为本申请实施例提供的一种电子设备的结构示意图。
如图5所示,电子设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上的处理器501和存储器502,存储器502中可以存储有一个或一个以上存储应用程序或数据。其中,存储器502可以是短暂存储或持久存储。存储在存储器502的应用程序可以包括一个或一个以上模块(图示未示出),每个模块可以包括电子设备中的一系列计算机可执行指令。更进一步地,处理器501可以设置为与存储器502通信,在电子设备上执行存储器502中的一系列计算机可执行指令。电子设备还可以包括一个或一个以上电源503,一个或一个以上有线或无线网络接口504,一个或一个以上输入/输出接口505,一个或一个以上键盘506等。
在一个具体的实施例中,电子设备包括有存储器,以及一个或一个以上的程序,其中一个或者一个以上程序存储于存储器中,且一个或者一个以上程序可以包括一个或一个以上模块,且每个模块可以包括对电子设备中的一系列计算机可执行指令,且经配置以由一个或者一个以上处理器执行该一个或者一个以上程序包含用于进行以下计算机可执行指令:
获取待加载的目标扩展库的标识信息,所述标识信息用于确定唯一对应的扩展库,所述目标扩展库中封装有数据提供方写入的解密函数,所述解密函数用于对所述数据提供方提供的初始类文件进行解密;
根据所述目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到所述目标扩展库对应的扩展库参数信息;
在创建虚拟机实例的情况下,根据所述虚拟机实例的地址信息和所述目标扩展库对应的扩展库参数信息对所述虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,所述扩展后的虚拟机实例包括所述目标扩展库;
在所述扩展后的虚拟机实例接收到所述初始类文件时,通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件。
本说明书提供的一种计算机可读存储介质实施例如下:
对应上述描述的一种类文件加载方法,基于相同的技术构思,本申请实施例还提供一种计算机可读存储介质。
本实施例提供的计算机可读存储介质,用于存储计算机可执行指令,计算机可执行指令在被处理器执行时实现以下流程:
获取待加载的目标扩展库的标识信息,所述标识信息用于确定唯一对应的扩展库,所述目标扩展库中封装有数据提供方写入的解密函数,所述解密函数用于对所述数据提供方提供的初始类文件进行解密;
根据所述目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到所述目标扩展库对应的扩展库参数信息;
在创建虚拟机实例的情况下,根据所述虚拟机实例的地址信息和所述目标扩展库对应的扩展库参数信息对所述虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,所述扩展后的虚拟机实例包括所述目标扩展库;
在所述扩展后的虚拟机实例接收到所述初始类文件时,通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件。
需要说明的是,本说明书中关于计算机可读存储介质的实施例与本说明书中关于类文件加载方法的实施例基于同一发明构思,因此该实施例的具体实施可以参见前述对应方法的实施,重复之处不再赘述。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域内的技术人员应明白,本申请实施例可提供为方法、系统或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可读存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程设备的处理器以产生一个机器,使得通过计算机或其他可编程设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本申请实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书的一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本文件的实施例而已,并不用于限制本文件。对于本领域技术人员来说,本文件可以有各种更改和变化。凡在本文件的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本文件的权利要求范围之内。
Claims (10)
1.一种类文件加载方法,其特征在于,包括:
获取待加载的目标扩展库的标识信息,所述标识信息用于确定唯一对应的扩展库,所述目标扩展库中封装有数据提供方写入的解密函数,所述解密函数用于对所述数据提供方提供的初始类文件进行解密;
根据所述目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到所述目标扩展库对应的扩展库参数信息;
在创建虚拟机实例的情况下,根据所述虚拟机实例的地址信息和所述目标扩展库对应的扩展库参数信息对所述虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,所述扩展后的虚拟机实例包括所述目标扩展库;
在所述扩展后的虚拟机实例接收到所述初始类文件时,通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件。
2.根据权利要求1所述的方法,其特征在于,所述获取待加载的目标扩展库的标识信息,包括:
检测指定存储目录中存储的扩展库标识信息集合;所述目标扩展库的标识信息为所述扩展库标识信息集合中的一个标识信息;
或者,
接收扩展库选择指令,并将所述扩展库选择指令携带的标识信息确定为所述待加载的目标扩展库的标识信息。
3.根据权利要求1所述的方法,其特征在于,所述扩展库参数信息包括所述目标扩展库的初始加载函数地址;所述根据所述虚拟机实例的地址信息和所述目标扩展库对应的扩展库参数信息对所述虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,包括:
将所述初始加载函数地址加载到虚拟机进程中,并确定所述初始加载函数地址对应的目标加载函数地址,所述目标加载函数地址为所述虚拟机实例的内存中用于存储所述目标扩展库的预设加载函数的存储地址;所述预设加载函数用于对所述虚拟机实例进行所述目标扩展库的扩展库加载处理;
根据所述虚拟机实例的地址信息和所述目标加载函数地址对所述虚拟机实例进行扩展库加载处理,得到所述扩展后的虚拟机实例。
4.根据权利要求3所述的方法,其特征在于,所述目标加载函数地址通过如下方式确定:
获取所述虚拟机实例的内存中的扩展库初始存储地址;所述扩展库初始存储地址用于标识预先配置的多个扩展库中首个扩展库对应的存储子区域的起始地址;
对所述初始加载函数地址进行拆分处理,得到第一子地址和第二子地址;所述第一子地址用于标识所述目标扩展库在所述多个扩展库中的排列序号;所述第二子地址用于标识所述预设加载函数在其对应的存储子区域中的存储单元序号,其中,每个扩展库对应一个存储子区域,每个存储子区域包括多个存储单元;
根据所述扩展库初始存储地址、所述第一子地址以及所述多个扩展库中每个扩展库对应的存储子区域的存储单元数量,计算得到所述目标扩展库对应的存储子区域的起始地址;
根据所述目标扩展库对应的存储子区域的起始地址和所述第二子地址,确定所述初始加载函数地址对应的所述目标加载函数地址。
5.根据权利要求3所述的方法,其特征在于,所述根据所述虚拟机实例的地址信息和所述目标加载函数地址对所述虚拟机实例进行扩展库加载处理,包括:
查询所述目标加载函数地址中是否存储有所述预设加载函数;
若是,则将所述虚拟机实例的地址信息确定为所述预设加载函数的函数入参,并根据所述函数入参调用所述预设加载函数;
若检测到预设返回值,则确定所述目标扩展库加载成功;所述预设返回值是所述目标扩展库根据所述虚拟机实例的地址信息获取所述虚拟机实例对应的虚拟机接口集合,根据所述解密函数和所述虚拟机接口集合中的待扩展函数进行接口事件回调注册,在注册成功时所生成的。
6.根据权利要求1所述的方法,其特征在于,所述通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件,包括:
对所述初始类文件进行解析处理,得到所述初始类文件中包括的秘钥和加密字符串;
根据所述解密函数和所述秘钥,对所述加密字符串进行解密处理,得到所述目标类文件。
7.根据权利要求1所述的方法,其特征在于,所述通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件,包括:
根据所述初始类文件的类名,确定所述初始类文件是否存在解密需求;
若是,则通过所述解密函数对所述初始类文件进行解密处理,得到所述目标类文件;
若否,则将所述初始类文件确定为所述目标类文件。
8.一种类文件加载装置,其特征在于,所述装置包括:
获取单元,用于获取待加载的目标扩展库的标识信息,所述标识信息用于确定唯一对应的扩展库,所述目标扩展库中封装有数据提供方写入的解密函数,所述解密函数用于对所述数据提供方提供的初始类文件进行解密;
查询单元,用于根据所述目标扩展库的标识信息,在预先配置的包括多个扩展库的扩展库参数信息中进行查询处理,得到所述目标扩展库对应的扩展库参数信息;
加载单元,用于在创建虚拟机实例的情况下,根据所述虚拟机实例的地址信息和所述目标扩展库对应的扩展库参数信息对所述虚拟机实例进行扩展库加载处理,得到扩展后的虚拟机实例,所述扩展后的虚拟机实例包括所述目标扩展库;
解密单元,用于在所述扩展后的虚拟机实例接收到所述初始类文件时,通过所述解密函数对所述初始类文件进行解密处理,得到对应的目标类文件。
9.一种电子设备,其特征在于,所述设备包括:
处理器;以及,被配置为存储计算机可执行指令的存储器,所述计算机可执行指令在被执行时使所述处理器执行如权利要求1-7任一项所述的类文件加载方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质用于存储计算机可执行指令,所述计算机可执行指令在被处理器执行时实现如权利要求1-7任一项所述的类文件加载方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310369290.6A CN117492900A (zh) | 2023-04-07 | 2023-04-07 | 类文件加载方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310369290.6A CN117492900A (zh) | 2023-04-07 | 2023-04-07 | 类文件加载方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117492900A true CN117492900A (zh) | 2024-02-02 |
Family
ID=89677036
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310369290.6A Pending CN117492900A (zh) | 2023-04-07 | 2023-04-07 | 类文件加载方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117492900A (zh) |
-
2023
- 2023-04-07 CN CN202310369290.6A patent/CN117492900A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101490047B1 (ko) | 자가변환 기반 애플리케이션 코드 난독화 장치 및 그 방법 | |
US11120018B2 (en) | Spark query method and system supporting trusted computing | |
CN108229112B (zh) | 一种保护应用程序、应用程序的运行方法以及装置 | |
CN109062582B (zh) | 一种应用安装包的加密方法及装置 | |
EP2897073A1 (en) | Device for obfuscating application code and method for same | |
CN113079200A (zh) | 一种数据处理的方法、装置及系统 | |
CN110309630B (zh) | 一种Java代码加密方法及装置 | |
CN109614772B (zh) | 基于应用安装包文件的代码转换方法及装置 | |
CN109840400B (zh) | 提供安全性的设备和方法以及针对通用中间语言执行安全性的设备和方法 | |
CN112966227A (zh) | 代码加密解密方法和装置、存储介质 | |
CN110333872B (zh) | 一种应用的处理方法、装置、设备和介质 | |
CN110597496B (zh) | 应用程序的字节码文件获取方法及装置 | |
CN117492900A (zh) | 类文件加载方法、装置、电子设备及存储介质 | |
CN113220314B (zh) | App资源加载及apk生成方法、装置、设备及介质 | |
JP6698775B2 (ja) | 共有オブジェクトのコード保護のための保安提供装置と方法、及び保安実行装置と方法 | |
CN111488286A (zh) | 一种Android模块独立开发的方法及装置 | |
US10726109B2 (en) | Method and system for identifying whether an application is genuine by means of digital watermarks | |
CN117150515B (zh) | Eda二次开发源代码的安全保护方法、电子设备及存储介质 | |
CN117708850A (zh) | 数据加密方法、数据获取方法、装置和电子设备 | |
KR101788296B1 (ko) | 에뮬레이터 기반 웹 어플리케이션 소스코드 보안방법 | |
CN117828556A (zh) | 一种代码处理方法、装置、电子设备及可读存储介质 | |
CN113642015A (zh) | 一种文件加密方法、装置、电子设备及存储介质 | |
CN113486330A (zh) | 应用程序运行方法、装置、设备和存储介质 | |
CN114185556A (zh) | 一种智能合约部署方法、装置、设备以及存储介质 | |
CN115935302A (zh) | 安卓安装包的生成方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |