CN112988157B - 字节码验证方法、装置及存储介质 - Google Patents

字节码验证方法、装置及存储介质 Download PDF

Info

Publication number
CN112988157B
CN112988157B CN202011521527.0A CN202011521527A CN112988157B CN 112988157 B CN112988157 B CN 112988157B CN 202011521527 A CN202011521527 A CN 202011521527A CN 112988157 B CN112988157 B CN 112988157B
Authority
CN
China
Prior art keywords
function
instance
verification
thread
segment
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.)
Active
Application number
CN202011521527.0A
Other languages
English (en)
Other versions
CN112988157A (zh
Inventor
邱炜伟
黄方蕾
胡麦芳
张珂杰
刘明美
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Qulian Technology Co Ltd
Original Assignee
Hangzhou Qulian Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Hangzhou Qulian Technology Co Ltd filed Critical Hangzhou Qulian Technology Co Ltd
Priority to CN202011521527.0A priority Critical patent/CN112988157B/zh
Publication of CN112988157A publication Critical patent/CN112988157A/zh
Application granted granted Critical
Publication of CN112988157B publication Critical patent/CN112988157B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种字节码验证方法、装置及存储介质,用于提高字节码的验证效率。方法部分包括:按照字节码的格式对所述字节码的段类型进行解析,以获取解析结果;依据所述解析结果为不同的段类型创建对应的段实例,并将所述段实例存放至结构体实例中,所述段实例包括函数段所对应的每个函数的函数实例;为所述结构体实例中所包含的每个函数实例创建对应的线程;通过所述每个函数实例对应的线程,对所述每个函数实例的函数体进行并行验证,以获取每个函数实例对应的线程所反馈的验证结果。

Description

字节码验证方法、装置及存储介质
技术领域
本发明涉及字节码技术领域,尤其涉及一种字节码验证方法、装置及存 储介质。
背景技术
字节码是一种经过编译器编译得到的中间文件,发明人意识到,传统的 方案中,在对字节码进行验证时,采用的是串行验证的方式,也即字节码文 件中的一个函数验证完成之后再验证下一个,字节码的验证效率较低。
发明内容
本发明提供一种字节码验证方法、装置及存储介质,以解决现有技术中, 字节码的验证效率较低的问题。
一种字节码验证方法,包括:
按照字节码的格式对所述字节码的段类型进行解析,以获取解析结果;
依据所述解析结果为不同的段类型创建对应的段实例,并将所述段实例 存放至结构体实例中,所述段实例包括函数段所对应的每个函数的函数实例;
为所述结构体实例中所包含的每个函数实例创建对应的线程;
通过所述每个函数实例对应的线程,对所述每个函数实例的函数体进行 并行验证,以获取每个函数实例对应的线程所反馈的验证结果。
进一步地,所述按照字节码的格式对所述字节码进行解析,以获取解析 结果之前,还包括:
验证所述字节码的类型是否为预设字节码类型;
当所述字节码的类型是所述预设字节码类型时,则按照字节码的格式对 所述字节码进行解析,以获取所述解析结果。
进一步地,所述通过所述每个函数实例对应的线程,对所述每个函数实 例的函数体进行并行验证,以获取每个函数实例对应的线程所反馈的验证结 果,包括:
a、创建消息通道,所述消息通道用于接收所述线程反馈的信息;
b、选取所述结构体实例中的未开启线程验证的函数实例作为目标函数实 例;
c、开启所述目标函数实例对应的目标线程,以通过所述目标线程对所述 目标函数实例进行验证,其中,所述目标线程对所述目标函数实例的验证结 果写入所述消息通道中;
d、循环b-c,直至所述结构体实例中的所有函数实例的线程均已开启;
e、从所述消息通道获取所述结构体实例中,所有函数实例的验证结果。
进一步地,所述通过所述目标线程对所述目标函数实例进行验证,包括:
通过所述目标线程,实现如下验证过程:
A、创建用于模拟执行所述目标函数实例中函数体的栈式虚拟机;
B、根据所述函数体中用到的入参和局部变量的类型,以及所述入参和局 部变量的个数模拟所述函数体的函数变量,以获取模拟函数变量;
C、读取所述函数体中的字节,以获取所述字节对应的目标指令;
E、根据所述目标指令,对所述栈式虚拟机和模拟函数变量进行相应的操 作;
F、循环C-E,直至所述操作过程出现异常情况或者所述函数体中的字节 均被读取过,以获取所述目标函数对应的验证结果;
G、将所述目标函数对应的验证结果写入所述目标消息通道中。
进一步地,通过所述目标线程,实现的验证过程,还包括:
当所述操作过程出现异常情况时,将对应的异常信息作为所述目标函数 对应的验证结果;
当所述函数体中的字节均被读取过时,验证所述函数体的返回值的个数 与所述栈式虚拟机中当前栈中的数据的个数是否匹配,并验证所述函数体的 返回值的类型与所述栈式虚拟机中当前栈中的数据的类型是否匹配;
将匹配结果作为所述目标函数对应的验证结果。
进一步地,通过所述目标线程,实现的验证过程,还包括:
当所述操作过程出现异常情况时,将对应的异常信息作为所述目标函数 对应的验证结果;
当所述函数体中的指令格式均被读取过时,验证所述函数体的返回值的 个数与所述栈式虚拟机中当前栈中的数据的个数是否匹配,并验证所述函数 体的返回值的类型与所述栈式虚拟机中当前栈中的数据的类型是否匹配;
将匹配结果作为所述目标函数对应的验证结果;
根据所述验证结果更新线程的数量。
进一步地,所述根据所述目标指令,对所述栈式虚拟机和模拟函数变量 进行相应的操作,包括:
解析所述目标指令以获取相应的指令码和操作数;
依据所述指令码和操作数,对所述栈式虚拟机和模拟函数变量进行相应 的操作。
进一步地,所述解析结果包括所述字节码中包含的每一段的段类型、段 长度和段内容,所述依据所述解析结果为不同的段类型创建对应的段实例, 包括:
将所述段类型为全局变量段中包含的所有全局变量复制添加到所述结构 体实例对应的全局变量索引表中;
将所述段类型为函数段中包含的所有函数类型创建函数实例,并存放在 所述结构体实例对应的预设字段中;
将所述段类型为表段中包含的所有表存放在所述结构体实例对应的表结 构中。
一种字节码验证装置,包括:
解析模块,用于按照字节码的格式对所述字节码的段类型进行解析,以 获取解析结果;
实例创建模块,用于依据所述解析结果为不同的段类型创建对应的段实 例,并将所述段实例存放至结构体实例中,所述段实例包括函数段所对应的 每个函数的函数实例;
线程创建模块,用于为所述结构体实例中所包含的每个函数实例创建对 应的线程;
验证模块,用于通过所述每个函数实例对应的线程,对所述每个函数实 例的函数体进行并行验证;
获取模块,用于获取每个函数实例对应的线程所反馈的验证结果。
一种字节码验证装置,包括存储器、处理器以及存储在所述存储器中并 可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实 现上述字节码验证方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序, 所述计算机程序被处理器执行时实现上述字节码验证方法的步骤。
上述字节码验证方法、装置及存储介质所提供的一个方案中,先是对字 节码的段类型进行解析,依据解析结果将字节码中所涉及的所有函数创建函 数实例并存放至特定的结构体实例中,将字节码中的函数利用函数实例的形 式解析,如此,通过分析结构体实例存储的段实例,便可为所有函数实例对 应的函数创建线程,并开启线程验证函数实例对应的函数体,完成该函数实例的验证,在等待所有函数实例的线程验证完之后,便可得到该字节码所有 函数实例的验证结果,有效地提高了对字节码验证的效率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的 描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅 仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性 劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例中字节码验证方法的一流程示意图;
图2是本发明实施例中函数实例对应线程的一流程示意图;
图3是本发明实施例中线程对函数实例的函数体进行验证的一流程示意 图;
图4是本发明一实施例中字节码验证装置的一结构示意图;
图5是本发明一实施例中字节码验证装置的另一结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行 清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是 全部的实施例。基于本发明中的实施例前提下所获得的所有其他实施例,都 属于本发明保护的范围。
本发明实施例提供一种字节码验证方法,主要包括如下步骤:
S10:按照字节码的格式对字节码的段类型进行解析,以获取解析结果。
字节码(Byte-code),是一种包含执行程序、由一序列op代码/数据对 组成的二进制文件,依据源代码(也即转化为字节码的源文件)的内容,编 译得到的字节码中的字段具有相应的含义,包含各种不同的段类型。其中, 不同的段类型对应有作为开头的标识符、总长度以及实际的段内容。在获取 到字节码之后,需对字节码进行验证,以确定编译得到的字节码是否符合所 需的要求。
在对字节码进行验证时,需先获取被验证的字节码,并按照字节码中的 格式对字节码的段类型进行解析,因此,可以解析出字节码中包含的段类型, 以获取解析结果。
S20:依据解析结果为不同的段类型创建对应的段实例,并将段实例存放 至结构体实例中,段实例包括函数段对应的每个函数的函数实例。
在按照字节码中的格式对字节码的段类型进行解析,以获取解析结果之 后,依据解析结果,便可知道该字节码中包括的所有段类型,以及每个段类 型相应的段内容。依据字节码的实际情况,段类型可以包括但不局限于函数 段、表段、全局变量段等,该步骤会为不同的段类型创建对应的段实例,并 将段实例存放至结构体实例中。
需要说明的是,本发明实施例会预先构建一特定结构的结构体实例,该 结构体实例是用于存储经过解析后的字节码的存储实例,该结构体实例包括 段类型相应的段示例的存放空间,用于存储解析后的字节码的各个段实例。 在为不同的段类型创建对应的段实例之后,将段实例存放至结构体实例相应 的存放空间中,其中,字节码对应的段实例包括函数段对应的每个函数的函数实例。
例如,对于该字节码中,某一部分表示类型段的字节码为“01 8C 80 80 80 00 0260 01 7F 01 7F 60 02 7F 7F 01 7F”而言,其中“01”表示当 前段类型为类型段,后面段“8C 80 80 00”是LEB28编码方式表示长度为0c, 后面的则为该类型段的内容。对于该类型段而言,“02”表示两种类型,后面 则是对这两种类型对描述。“60 01 7F 01 7F”中“60”表示当前类型是函数 类型,“01”表示这个函数有一个入参,“7F”表示这个参数类型为i32,后面 的“01 7F”则表示这个函数类型有一个返回值,返回值类型为i32;后面的“02 7F 7F 017F”表示第二个函数类型有两个i32类型的入参,一个i32 类型的返回值。依据上述函数段,创建对应的函数实例。可见,字节码对应 有多少不同的函数段,则创建相应的函数实例,创建的函数实例包括函数签 名、函数体和函数名。
S30:为结构体实例中所包含的每个函数实例创建对应的线程。
S40:通过每个函数实例对应的线程,对每个函数实例的函数体进行并行 验证,并获取每个函数实例对应的线程所反馈的验证结果。
在依据解析结果为不同的段类型创建对应的段实例,并将段实例存放至 结构体实例中之后,为结构体实例中所包含的每个函数实例创建对应的线程, 并开启线程,以通过每个函数实例对应的线程,对每个函数实例的函数体进 行并行验证,并获取每个函数实例对应的线程所反馈的验证结果。
可见,本发明实施例中,提供了一种字节码验证方法,先是对字节码的 段类型进行解析,依据解析结果将字节码中所涉及的所有函数创建函数实例 并存放至特定的结构体实例中,将字节码中的函数利用函数实例的形式解析, 如此,通过分析结构体实例存储的段实例,便可为所有函数实例对应的函数 创建线程,并开启线程验证函数实例对应的函数体,完成该函数实例的验证,在等待所有函数实例的线程验证完之后,便可得到该字节码所有函数实例的 验证结果,有效地提高了对字节码验证的效率。
在一实施例中,步骤S10之前,也即按照字节码的格式对字节码进行解 析,以获取解析结果之前,还需验证字节码的类型是否为预设字节码类型, 当字节码的类型是预设字节码类型时,则按照字节码的格式对字节码进行解 析,以获取解析结果。
其中,作为一个示例,该预设字节码类型可以为WASM(WebAssembly)字 节码,但不做限定。需要说明的是,由于字节码可以包括多种类型,为了使 得本方案的验证过程完整、无误,可以依据所需验证字节码的类型的特殊情 况构建相应的结构体实例,因此,可以针对某种特殊类型的字节码预先构建 结构体实例,在利用结构体实例进行字节码的验证之前,需确定字节码的类 型,当是所需的预设字节码类型,才按照被验证字节码中的格式对字节码进行解析,以获取解析结果,从而可以利用特有的结构体实例进行后续的字节 码验证过程。
在一实施例中,步骤S10中,也即按照被验证字节码中的格式对字节码 的段类型进行解析,指的是,根据字节码的格式,循环读取字节码中包含的 每个段的格式,直到读取到字节码的最末尾为止,从而完成字节码中所有段 的读取,以解析出该字节码中所有的段类型和对应的段类型。
需要说明的是,字节码中,每一个段的格式是以该段的标识符作为开头, 标识符后面的为当前段的总长度以及实际的段内容,也即,每一个段,对应 有标识符、总长度和段内容。其中,依据每个段的标识符,可以确定出当前 段的段类型,依据段类型,可以按照段类型相应的规则读取出段内容的相应 数据。
如前述例子,对于该字节码中,某一部分表示类型段的字节码为“01 8C 80 80 8000 02 60 01 7F 01 7F 60 02 7F 7F 01 7F”而言,其中“01”表 示当前段类型为类型段,后面段“8C 80 80 00”是LEB28编码方式表示长度 为0c,后面的则为该类型段的内容。对于该类型段而言,”02”表示两种类型, 后面则是对这两种类型对描述。“60 01 7F 01 7F”中“60”表示当前类型是 函数类型,“01”表示这个函数有一个入参,“7F”表示这个参数类型为i32, 后面的“01 7F”则表示这个函数类型有一个返回值,返回值类型为i32;后面的“02 7F7F 01 7F”表示第二个函数类型有两个i32类型的入参,一个 i32类型的返回值。依据上述函数段,创建对应的函数实例。
作为另一个示例,字节码中,有一个特定的段类型表示对外暴露的函数、 全局变量和内存等,就是导出段,例如,“07 88 80 80 00 01 04 6D 61 69 6E 00 01”而言,“07”表示当前段为导出段,“88 80 80 00”为LEB28编 码方式表示长度为08,“01”表示导出数量为1,“04”表示第一个导出类 型的名称长度为4,“6D 61 66 6E”表示第一个导出类型的名称为main,“00”表示导出的类型为函数类型,“01”表示导出类型在类型段中的索引。 为了区分不同的导出类型,其对应关系为:00表示函数,01表示表,02表示 内存,03表示全局变量。
从上述例子可以看出,依据字节码的解析结果,可以判断该字节码是否 需要用到其他字节码或系统提供的对外暴露的函数、全局变量和内存等。在 判断该字节码需要用到其他字节码或系统提供的对外暴露的函数、全局变量 和内存等,从而依据解析结果,为不同的段类型创建对应的段实例。
作为一个示例,在一实施例中,S20中依据解析结果,为不同的段类型创 建对应的段实例,包括:
S21:将段类型为全局变量段中包含的所有全局变量复制添加到结构体实 例的全局变量索引表中。
本发明实施例中,预先构建的结构体实例包括全局变量索引表、函数实 例存储的字段和表结构,在对字节码进行解析获得解析结果之后,将解析出 的段类型为全局变量段的所有全局变量,也即该字节码所涉及的所有全局变 量,存入结构体实例中的全局变量索引表中,便于线程在验证函数实例的时 候,函数实例所涉及的全局变量。
S22:为段类型为函数段中包含的所有函数类型创建函数实例,并存放在 结构体实例的预设字段中。
S23将段类型为表段中包含的所有表存放在结构体实例的表结构中。
对于步骤S22-S23,可以理解,段类型还包括函数段、表段或者其他的类 型段的情况,其中,对于结构体实例中段类型为函数段,可依据相应段类型 为所有函数类型创建函数实例,并存放在结构体实例的预设字段中。可以理 解,函数段中包含有函数体以及对应的类型段段索引,根据索引可以找到类型段中表示的第几个类型,类型段中包含有函数签名和函数名称。根据结构 体实例中的表段和元素段,可将段类型为表段中包含的所有表存放在结构体 实例的表结构中。可见,本发明实施例中,预先构建了一特定的结构体实例 的存储分布空间,分别用于存储相应段类型所创建的段实例。需要说明的是, 所有的表段以及其他的类型段都是为函数段的服务段,例如表段和内存段, 可能会在函数体中使用到,即验证函数时,会根据操作码执行对应段操作时 可能会使用到相应的表段或者内存段。对于内存段,可能函数体里会有从内存段中读取数据或者写数据的情况;对于表段,可能函数体里会有执行表中 逻辑或者从表中读取数据的情况。
在一实施例中,如图2所示,通过每个函数实例对应的线程,对每个函 数实例的函数体进行并行验证,包括如下步骤:
a、创建消息通道,消息通道用于接收线程反馈的信息。
可以理解,在解析字节码并得到包含有函数实例的结构体实例之后,需 对结构体实例中的每个函数实例的函数体进行验证,具体地,本发实施例会 预先创建消息通道,需要说明的是,该消息通道为线程反馈信息和存储信息 的通道。
b、选取结构体实例中的未开启线程验证的函数实例作为目标函数实例。
在对结构体实例中的每个函数实例的函数体进行验证时,需遍历结构体 实例中的所有函数实例,以对结构体实例中的所有函数实例进行验证,以保 证验证的完整性。具体地,先是选取结构体实例中的未验证函数实例作为目 标函数实例。
c、开启目标函数实例对应的目标线程,以通过目标线程对目标函数实例 进行验证,其中,目标线程对目标函数实例的验证结果写入消息通道中。
d、判断结构体实例中的所有函数实例对应的线程是否均已开启,若结构 体实例中的所有函数实例对应的线程未均已开启,则循环b-d,直至结构体实 例中的所有函数实例的线程均已开启。
e、若结构体实例中的所有函数实例对应的线程均已开启,等待验证结果, 并从消息通道获取所有函数实例对应的线程所反馈的验证结果。
例如,若结构体实例中的函数实例包括函数实例1、函数实例2、函数实 例3、…、函数实例N,函数实例1-函数N对应的线程为线程1-线程N,本发 明中,会先选取函数实例1作为目标函数实例,并开启该函数实例1对应的 线程1,以通过线程1对函数实例1的函数体进行验证,在线程1完成对函数 实例1的验证之后,线程1将函数实例1对应的验证结果写入消息通道中。 在开启线程1对函数实例1进行验证之后,会继续选取结构体实例中的函数2,并开启该函数实例2对应的线程2,以通过线程2对函数实例2的函数体进行 验证,在线程2完成对函数实例2的验证之后,线程2将函数实例2对应的验证结果写入消息通道中,以此类推,通过不断从结构体实例中继续选取出 其他未开启线程的函数实例3-函数N,从而开启相应的线程3-N,以通过线程 3-线程N对函数实例3-函数实例N进行验证。
作为一个示例,本发明实施例可以预先初始化一个线程计数器,通过该 线程计数器的数值和结构体实例中的函数个数,来判断当前开启了多少个线 程,从而确定是否已经开启了所需的线程对结构体实例中的函数实例进行验 证。具体地,在通过每个函数实例对应的线程,对每个函数实例的函数体进 行并行验证之前,初始化线程计数器的个数为0,在通过开启每个函数实例对 应的线程,对每个函数实例的函数体进行并行验证时,每当开启一个线程时, 线程计数器加1,判断线程计数器的计数是否小于结构体实例中的函数实例个 数,若线程计数器的计数小于结构体实例中的函数实例个数,则说明还未开 启全部线程,会继续选取结构体实例中的未被选取过的函数实例作为目标函 数实例,并开启目标函数实例对应的目标线程进行验证;若线程计数器的计数等于结构体实例中的函数实例个数,则说明结构体实例中所有函数实例对 应的线程均已开启,此时等待所有线程的验证完成即可,在所有线程验证完 成之后,最后从消息通道中,获取所有线程对相应函数实例的验证结果便可。
作为一个示例,如图3所示,通过目标线程对目标函数实例进行验证, 指的是,通过目标线程,实现如下验证过程:
A、创建用于模拟执行目标函数实例中函数体的栈式虚拟机。
虚拟机,指通过软件模拟的具有完整硬件系统功能的、运行在一个完全 隔离环境中的完整计算机系统,目标线程会预先创建一栈式虚拟机,用于模 拟实行目标函数实例中函数体的栈式虚拟机。
B、根据函数体中用到的入参和局部变量的类型,以及入参和局部变量的 个数模拟函数体的函数变量,以获取模拟函数变量。
可以理解,函数体通常包括若干语句,若干语句用于实现该函数的具体 功能,其中,若干语句中包括涉及到的入参和局部变量的类型,以及入参和 局部变量的个数,本发明实施例中,可以获取该目标函数实例中函数体所涉 及的入参个数和类型,以及局部变量的个数和类型,从而根据函数体中用到 的入参和局部变量的类型,以及入参和局部变量的个数模拟函数体的函数变量,以获取模拟函数变量。例如,某个函数实现的是传入一个整数,然后将 该整数加1赋值给另外一个变量,则调用这个函数,传入一个4,在函数内部 会将4加1得到5复制给一个新的变量,这个4就是一个整数类型的入参,1 是一个数值,5是整数类型的局部变量。
C、读取函数体中字节,以该字节对应的目标指令。
D、根据目标指令,对栈式虚拟机和模拟函数变量进行相应的操作。
E、判断操作过程是否出现异常,若未出现异常,则重复C-E。
F、若出现异常,则终止对函数体的指令的模拟操作,并将异常信息作为 验证结果写入消息通道。
G、对函数体的返回值的个数和类型进行验证,并将验证结果写入消息通 道。
例如,某个函数实现的是传入一个整数,然后将这个整数加1返回。要 实现这样的功能,首先需要将传入的参数加载到栈式虚拟机中,然后将1这 个数值也加载到栈式虚拟机中,在执行整数加的操作时,从栈式虚拟机中取 出两个整数类型的数值,将这两个数值相加得到一个和,然后将这个和写入 栈式虚拟机中,最后将栈式虚拟机中的这个整数读出,作为结果返回。由于这里是验证,所以在执行加载整数类型时,会判断加载的数据是否为整数类 型;在执行整数加的操作时,需要验证栈式虚拟机中是否有两个整数类型的 数据;在执行返回操作时验证栈式虚拟机中是否有一个整数类型的数据。
如前述,函数体中包括若干语句,其中,每个语句对应一某个指令,本 发明实施例中,可以循环读取函数体中包含的每个指令格式,并解析读取出 的指令格式相应的指令,然后通过指令格式相应的指令,对栈式虚拟机和模 拟函数变量进行相应的操作。其中,依据指令相应的指令码和操作数,对栈 式虚拟机和模拟函数变量进行相应的操作,从而可以模拟出执行该函数体的所有指令时,该函数体的执行情况。其中,当直至操作过程出现异常情况或 者函数体中的指令格式均被选取过,从而完成出目标函数对应的验证结果, 并将目标函数对应的验证结果写入目标消息通道中。
例如,若函数体中各个字节为字节1、字节2、字节3、…、字节N,其 中,字节1-字节N对应的指令为指令1-指令N,本发明中,会先从函数体中 选取字节1进行解析,以解析出该字节1对应的指令1,根据该指令1对栈式 虚拟机和模拟函数变量进行相应的操作;若针对指令1的模拟操作过程中出现异常,则终止该函数体的验证,并将异常信息反馈至消息通道。若未出现 异常,则继续从函数体中读取字节,由于函数体中还有其他字节,会继续读取到字节2进行解析,以解析出该字节2对应的指令2,根据该指令2对栈式 虚拟机和模拟函数变量进行相应的操作,以此类推,若针对指令2的模拟操 作过程中出现异常,则终止该函数体的验证,并将异常信息反馈至消息通道, 若未出现异常,则进行下一个字节的读取和解析,直至某个字节对应的指令 的模拟操作过程中出现异常,或者直至函数体中的字节均被读取,且相应的指令均被模拟操作过,也即被验证过。
需要说明的是,当指令格式对应的指令模拟操作过程出现异常情况时, 将对应的异常信息作为目标函数对应的验证结果写入到消息通道中;若模拟 操作过程中未发现异常,说明函数体中的指令格式均被选取过时,则会验证 函数体的返回值的个数与栈式虚拟机中当前栈中的数据的个数是否匹配,并 验证函数体的返回值的类型与栈式虚拟机中当前栈中的数据的类型是否匹配;并将匹配结果作为目标函数对应的验证结果。
例如,一个函数实现的是传入一个整数,然后将这个整数加1返回。要 实现这样的功能,首先需要将传入的参数加载到栈式虚拟机中,然后将1这 个数值也加载到栈式虚拟机中,在执行整数加的操作时,从栈式虚拟机中出 栈两个整数类型的数值,将这两个数值相加得到一个和,然后将这个和写入 栈式虚拟机中,最后将栈式虚拟机中的这个整数读出,作为结果返回。此时栈式虚拟机中需要存在一个整数类型的数据,作为这个函数的执行结果返 回。
其中,若均不匹配,则说明出现异常,会终止验证该函数并将异常信息 写入消息通道。若均匹配,则说明通过验证,将验证结果写入消息通道。
值得说明的是,在得到上述目标函数的验证结果之后,对于该目标函数 则已经完成验证,根据验证结果便可更新线程的数量。如前面所述,若结构 体实例中的函数实例包括函数实例1、函数实例2、函数实例3、…、函数实 例N,函数实例1-函数N对应的线程为线程1-线程N,本发明中,会先选取函数实例1作为目标函数实例,并开启该函数实例1对应的线程1,以通过线 程1对函数实例1的函数体进行验证,在线程1完成对函数实例1的验证之后,线程1将函数实例1对应的验证结果写入消息通道中。在开启线程1对 函数实例1进行验证并得到相应的验证结果之后,便可选择关闭该线程1,会 继续选取结构体实例中的函数2继续验证,从而更新当前开启的线程的数量, 减少资源的占用。
需要说明的是,在读取函数体时,由于不知道这个函数体对应的函数中 到底包含有多少个指令的,因此需先读取函数体的一个字节,如果能够读到, 则表示函数体中还有指令,则根据具体的指令来继续从函数体中读取指令的 内容(操作数等),然后再读一个字节,再判断是否能够读到,如果不能读到 则表示函数中的指令读取完毕,从而完成函数体指令的读取和验证。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后, 各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实 施过程构成任何限定。
在一实施例中,提供一种字节码验证装置,该字节码验证装置与上述实 施例中字节码验证一一对应。如图4所示,该字节码验证装置包括解析模块101、实例创建模块102、线程创建模块103、验证模块104和获取模块105。 各功能模块详细说明如下:
解析模块101,用于按照字节码的格式对所述字节码的段类型进行解析, 以获取解析结果;
实例创建模块102,用于依据所述解析结果为不同的段类型创建对应的段 实例,并将所述段实例存放至结构体实例中,所述段实例包括函数段所对应 的每个函数的函数实例;
线程创建模块103,用于为所述结构体实例中所包含的每个函数实例创建 对应的线程;
验证模块104,用于通过所述每个函数实例对应的线程,对所述每个函数 实例的函数体进行并行验证;
获取模块105,用于获取每个函数实例对应的线程所反馈的验证结果。
在一实施例中,字节码验证装置还包括判断模块,用于所述按照字节码 的格式对所述字节码进行解析,以获取解析结果之前,验证所述字节码的类 型是否为预设字节码类型;当所述字节码的类型是所述预设字节码类型时, 则触发解析模块按照字节码的格式对所述字节码进行解析,以获取所述解析 结果。
在一实施例中,验证模块具体用于:
a、创建消息通道,所述消息通道用于接收所述线程反馈的信息;
b、选取所述结构体实例中的未开启线程验证的函数实例作为目标函数实 例;
c、开启所述目标函数实例对应的目标线程,以通过所述目标线程对所述 目标函数实例进行验证,其中,所述目标线程对所述目标函数实例的验证结 果写入所述消息通道中;
d、循环b-c,直至所述结构体实例中的所有函数实例的线程均已开启;
获取模块,具体用于:
e、从所述消息通道获取所述结构体实例中,所有函数实例的验证结果。
在一实施例中,验证模块,具体用于:
通过所述目标线程,实现如下验证过程:
A、创建用于模拟执行所述目标函数实例中函数体的栈式虚拟机;
B、根据所述函数体中用到的入参和局部变量的类型,以及所述入参和局 部变量的个数模拟所述函数体的函数变量,以获取模拟函数变量;
C、读取所述函数体中的字节,以获取所述字节对应的目标指令;
D、根据所述目标指令,对所述栈式虚拟机和模拟函数变量进行相应的操 作;
E、循环C-D,直至所述操作过程出现异常情况或者所述函数体中的字节 均被读取过,以获取所述目标函数对应的验证结果;
F、将所述目标函数对应的验证结果写入所述目标消息通道中。
在一实施例中,该线程还用于:
当所述操作过程出现异常情况时,将对应的异常信息作为所述目标函数 对应的验证结果;
当所述函数体中的指令格式均被读取过时,验证所述函数体的返回值的 个数与所述栈式虚拟机中当前栈中的数据的个数是否匹配,并验证所述函数 体的返回值的类型与所述栈式虚拟机中当前栈中的数据的类型是否匹配;
将匹配结果作为所述目标函数对应的验证结果;
根据所述验证结果更新线程的数量。
在一实施例中,该线程还用于:
解析所述目标指令以获取相应的指令码和操作数;
依据所述指令码和操作数,对所述栈式虚拟机和模拟函数变量进行相应 的操作。
在一实施例中,解析模块具体用于:
将所述段类型为全局变量段中包含的所有全局变量复制添加到所述结构 体实例对应的全局变量索引表中;
将所述段类型为函数段中包含的所有函数类型创建函数实例,并存放在 所述结构体实例对应的预设字段中;
将所述段类型为表段中包含的所有表存放在所述结构体实例对应的表结 构中。
可见,本发明实施例中,提供了一种字节码验证装置,先是对字节码的 段类型进行解析,依据解析结果将字节码中所涉及的所有函数创建函数实例 并存放至特定的结构体实例中,将字节码中的函数利用函数实例的形式解析, 如此,通过分析结构体实例存储的段实例,便可为所有函数实例对应的函数 创建线程,并开启线程验证函数实例对应的函数体,完成该函数实例的验证,在等待所有函数实例的线程验证完之后,便可得到该字节码所有函数实例的 验证结果,有效地提高了对字节码验证的效率。
关于字节码验证装置的具体限定可以参见上文中对于字节码验证方法的 限定,在此不再赘述。上述字节码验证装置中的各个模块可全部或部分通过 软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算 机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中, 以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种字节码验证装置,该字节码验证装置可包 括通过系统总线连接的处理器、存储器。其中,该字节码验证装置的处理器 用于提供计算和控制能力。该字节码验证装置的存储器包括非易失性存储介 质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存 储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机程序被处理器执行时以实现一种字节码验证方法。
在一个实施例中,如图5所示,提供了一种字节码验证装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执 行计算机程序时实现以下步骤:
按照字节码的格式对所述字节码的段类型进行解析,以获取解析结果;
依据所述解析结果为不同的段类型创建对应的段实例,并将所述段实例 存放至结构体实例中,所述段实例包括函数段所对应的每个函数的函数实例;
为所述结构体实例中所包含的每个函数实例创建对应的线程;
通过所述每个函数实例对应的线程,对所述每个函数实例的函数体进行 并行验证,以获取每个函数实例对应的线程所反馈的验证结果。
在一个实施例中,提供了一种可读存储介质,其上存储有计算机程序, 计算机程序被处理器执行时实现以下步骤:
按照字节码的格式对所述字节码的段类型进行解析,以获取解析结果;
依据所述解析结果为不同的段类型创建对应的段实例,并将所述段实例 存放至结构体实例中,所述段实例包括函数段所对应的每个函数的函数实例;
为所述结构体实例中所包含的每个函数实例创建对应的线程;
通过所述每个函数实例对应的线程,对所述每个函数实例的函数体进行 并行验证,以获取每个函数实例对应的线程所反馈的验证结果。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程, 是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储 于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如 上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对 存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失 性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、 电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM (SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路 (Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、 直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以 上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而 将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划 分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。
以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参 照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解: 其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技 术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱 离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。

Claims (9)

1.一种字节码验证方法,其特征在于,包括:
按照字节码的格式对所述字节码的段类型进行解析,以获取解析结果;
依据所述解析结果为不同的段类型创建对应的段实例,并将所述段实例存放至结构体实例中,所述段实例包括函数段所对应的每个函数的函数实例;
为所述结构体实例中所包含的每个函数实例创建对应的线程;
通过所述每个函数实例对应的线程,对所述每个函数实例的函数体进行并行验证,以获取每个函数实例对应的线程所反馈的验证结果;
其中,所述通过所述每个函数实例对应的线程,对所述每个函数实例的函数体进行并行验证,以获取每个函数实例对应的线程所反馈的验证结果,包括:
a、创建消息通道,所述消息通道用于接收所述线程反馈的信息;
b、选取所述结构体实例中的未开启线程验证的函数实例作为目标函数实例;
c、开启所述目标函数实例对应的目标线程,以通过所述目标线程对所述目标函数实例进行验证,其中,所述目标线程对所述目标函数实例的验证结果写入所述消息通道中;
d、循环b-c,直至所述结构体实例中的所有函数实例的线程均已开启;
e、从所述消息通道获取所述结构体实例中,所有函数实例的验证结果。
2.如权利要求1所述的字节码验证方法,其特征在于,所述按照字节码的格式对所述字节码进行解析,以获取解析结果之前,还包括:
验证所述字节码的类型是否为预设字节码类型;
当所述字节码的类型是所述预设字节码类型时,则按照字节码的格式对所述字节码进行解析,以获取所述解析结果。
3.如权利要求1所述的字节码验证方法,其特征在于,所述通过所述目标线程对所述目标函数实例进行验证,包括:
通过所述目标线程,实现如下验证过程:
A、创建用于模拟执行所述目标函数实例中函数体的栈式虚拟机;
B、根据所述函数体中用到的入参和局部变量的类型,以及所述入参和局部变量的个数模拟所述函数体的函数变量,以获取模拟函数变量;
C、读取所述函数体中的字节,以获取所述字节对应的目标指令;
D、根据所述目标指令,对所述栈式虚拟机和模拟函数变量进行相应的操作;
E、循环C-D,直至所述操作过程出现异常情况或者所述函数体中的字节均被读取过,以获取所述目标函数对应的验证结果;
F、将所述目标函数对应的验证结果写入所述目标消息通道中。
4.如权利要求3所述的字节码验证方法,其特征在于,通过所述目标线程,实现的验证过程,还包括:
当所述操作过程出现异常情况时,将对应的异常信息作为所述目标函数对应的验证结果;
当所述函数体中的字节均被读取过时,验证所述函数体的返回值的个数与所述栈式虚拟机中当前栈中的数据的个数是否匹配,并验证所述函数体的返回值的类型与所述栈式虚拟机中当前栈中的数据的类型是否匹配;
将匹配结果作为所述目标函数对应的验证结果;
根据所述验证结果更新线程的数量。
5.如权利要求3所述的字节码验证方法,其特征在于,所述根据所述目标指令,对所述栈式虚拟机和模拟函数变量进行相应的操作,包括:
解析所述目标指令以获取相应的指令码和操作数;
依据所述指令码和操作数,对所述栈式虚拟机和模拟函数变量进行相应的操作。
6.一种字节码验证装置,其特征在于,包括:
解析模块,用于按照字节码的格式对所述字节码的段类型进行解析,以获取解析结果;
实例创建模块,用于依据所述解析结果为不同的段类型创建对应的段实例,并将所述段实例存放至结构体实例中,所述段实例包括函数段所对应的每个函数的函数实例;
线程创建模块,用于为所述结构体实例中所包含的每个函数实例创建对应的线程;
验证模块,用于通过所述每个函数实例对应的线程,对所述每个函数实例的函数体进行并行验证;
获取模块,用于获取每个函数实例对应的线程所反馈的验证结果;
所述字节码验证装置用于实现如权利要求1所述的方法。
7.如权利要求6所述的字节码验证装置,其特征在于,所述验证模块具体用于:
a、创建消息通道,所述消息通道用于接收所述线程反馈的信息;
b、选取所述结构体实例中的未开启线程验证的函数实例作为目标函数实例;
c、开启所述目标函数实例对应的目标线程,以通过所述目标线程对所述目标函数实例进行验证,其中,所述目标线程对所述目标函数实例的验证结果写入所述消息通道中;
d、循环b-c,直至所述结构体实例中的所有函数实例的线程均已开启;
所述获取模块,用于:
e、从所述消息通道获取所述结构体实例中,所有函数实例的验证结果。
8.一种字节码验证装置,其特征在于,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至5任一项所述字节码验证的步骤。
9.一种可读存储介质,所述可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述字节码验证的步骤。
CN202011521527.0A 2020-12-21 2020-12-21 字节码验证方法、装置及存储介质 Active CN112988157B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011521527.0A CN112988157B (zh) 2020-12-21 2020-12-21 字节码验证方法、装置及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011521527.0A CN112988157B (zh) 2020-12-21 2020-12-21 字节码验证方法、装置及存储介质

Publications (2)

Publication Number Publication Date
CN112988157A CN112988157A (zh) 2021-06-18
CN112988157B true CN112988157B (zh) 2024-05-07

Family

ID=76345071

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011521527.0A Active CN112988157B (zh) 2020-12-21 2020-12-21 字节码验证方法、装置及存储介质

Country Status (1)

Country Link
CN (1) CN112988157B (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0718764B1 (en) * 1994-12-20 2001-10-04 Sun Microsystems, Inc. Bytecode program interpreter apparatus and method with pre-verification of data type restrictions
CN108037926A (zh) * 2017-12-26 2018-05-15 网易(杭州)网络有限公司 字节码的优化方法、装置、存储介质、处理器及终端
CN109214184A (zh) * 2018-07-20 2019-01-15 北京大学 一种Android加固应用程序通用自动化脱壳方法和装置
CN109426546A (zh) * 2017-09-01 2019-03-05 腾讯科技(深圳)有限公司 应用启动方法及装置、计算机存储介质及设备
CN112035359A (zh) * 2020-08-31 2020-12-04 北京字节跳动网络技术有限公司 程序测试方法、装置、电子设备及存储介质

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0718764B1 (en) * 1994-12-20 2001-10-04 Sun Microsystems, Inc. Bytecode program interpreter apparatus and method with pre-verification of data type restrictions
CN109426546A (zh) * 2017-09-01 2019-03-05 腾讯科技(深圳)有限公司 应用启动方法及装置、计算机存储介质及设备
CN108037926A (zh) * 2017-12-26 2018-05-15 网易(杭州)网络有限公司 字节码的优化方法、装置、存储介质、处理器及终端
CN109214184A (zh) * 2018-07-20 2019-01-15 北京大学 一种Android加固应用程序通用自动化脱壳方法和装置
CN112035359A (zh) * 2020-08-31 2020-12-04 北京字节跳动网络技术有限公司 程序测试方法、装置、电子设备及存储介质

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于字节码例化的程序优化原理与分析;毛宏燕, 黄林鹏, 孙永强;高技术通讯(第05期);全文 *

Also Published As

Publication number Publication date
CN112988157A (zh) 2021-06-18

Similar Documents

Publication Publication Date Title
US11119949B2 (en) Apparatus and method for handling page protection faults in a computing system
US20150067662A1 (en) Computer system and a method for generating an optimized program code
US9336125B2 (en) Systems and methods for hardware-assisted type checking
CN107924326A (zh) 对经更新的类型的迁移方法进行覆盖
US9129137B2 (en) Method, computer program and device for providing security for intermediate programming code for its execution by a virtual machine
CN112905447B (zh) 一种区块链虚拟机的测试方法和系统
CN112395093A (zh) 多线程数据处理方法、装置、电子设备及可读存储介质
CN116860334A (zh) 用于计算两个区块操作数中的半字节的数量积的系统和方法
CN112988157B (zh) 字节码验证方法、装置及存储介质
US20110320784A1 (en) Verification of processor architectures allowing for self modifying code
CN110765008A (zh) 一种数据处理方法及装置
EP3268858A1 (en) A method for generating an embedded system derivable into a plurality of personalized embedded systems
US20210182175A1 (en) Compilation scheme for tagged global variables
US9916281B2 (en) Processing system with a secure set of executable instructions and/or addressing scheme
CN116700840B (zh) 文件执行方法、装置、电子设备及可读存储介质
CN111124899A (zh) 一种基于区块链双链结构的缺陷管理方法、设备及介质
CN111143790A (zh) 代码混淆方法、装置、设备及存储介质
Wright Using EventB to create a virtual machine instruction set architecture
US11537522B2 (en) Determining a tag value for use in a tag-guarded memory
Wright et al. Using Event-B to construct instruction set architectures
US9672042B2 (en) Processing system and method of instruction set encoding space utilization
CN113821829B (zh) 一种数据校验的方法、装置和存储介质
CN115186271A (zh) 一种mcu固件的信息写入方法及终端
CN114625403A (zh) 应用热修复方法、装置、设备和存储介质
CN117369867A (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
GR01 Patent grant
GR01 Patent grant