一种恢复Java序列化文件数据的方法与流程

文档序号:17502612发布日期:2019-04-23 23:49阅读:490来源:国知局

本发明涉及信息安全技术领域,特别涉及一种恢复Java序列化文件数据的方法。



背景技术:

在数据解析恢复领域经常会遇到序列化文件的解析。Java序列化是Java 自身提供的一种数据序列化方式,它允许开发人员将一个或一系列以类为基础的结构化的数据以流的形式存放在存储装置中。这种机制极大方便了开发人员对复杂数据结构的流式传输需求。

原有的Java序列化恢复方法有如下明显缺陷和不便:

1、序列化数据原数据结构丢失的情况下,无法通过Java原有的反序列化机制将序列化的数据恢复成为原有的结构。

2、在无法获知原数据结构的情况下,通常可以通过人工手动进行解析,但当数据较复杂时,人工解析就较为困难且耗时。

3、对结构相同的数据可以通过编写对指定结构的脚本来解析,但该方法无法保证解析脚本的通用性。无法应对众多未知结构的序列化数据。

4、人工解析和脚本解析无法将任意序列化文件中的数据恢复成为结构化的内存对象供系统直接调用。



技术实现要素:

本发明针对现有技术的缺陷,提供了一种恢复Java序列化文件数据的方法,能有效的解决上述现有技术存在的问题。

一种恢复Java序列化文件数据的方法,包括以下步骤:

S1:分析并记录Java序列化文件数据中关于数据类型及结构的标识符;

S2:定义中间结构用于存放解析过程中生成的各节点的数据类型名称、域名称及值;

S3:根据规则遍历解析序列化文件中的节点,获得一个最上层的中间结果, 解析过程中维护一个类定义ID列表;

S4:展开中间结果,将中间结果利用android自带的json工具转换为json 字符串。

S5:提取类的结构并生成类模版用于内存数据恢复;

S6:恢复完整的序列化数据至内存中。

作为优选,所述S1中数据类型标识符用于标识其所修饰的数据类型,共有十个,分别对应着java中的8个基本数据类型、java类以及数组;

具体含义为:0x42表示byte;0x43表示char;0x44表示double;0x46表示float;0x49表示int;0x50表示long;Ox4c表示对象;0x53表示short;0x5a 表示boolean;0x5b表示数组。

作为优选,所述S1中结构控制标识主要有以下几种:

0x71,用于标识类已经被描述过,参考描述列表的记录;

0x72,用于标识类属性描述的开始;

0x73,用于标识对象描述的开始;

0x74,用于标识该结构为String;

0x75,用于标识数组描述的开始;

0x77,用于标识接下来的数据为块数据;

0x78,用于标识类结构描述的结束;

0x70,用于标识类有无超类。

作为优选,所述S2的详细步骤如下:

S201:分析数据存放方式,获取数据结构,用于设计解析算法;

分析类结构存储方式:类结构的描述通过S1中数据类型标识符、结构控制标识符、数据长度以及数据四部分来完成,该描述是一串byte流,结构为: 0x72,类名长度,类名,指纹与标识符,域数量,域列表,0x78,引用标志;

数据含义与数据存储结构分析:数据与紧跟着类结构描述的结束符,是一系列数据描述首尾相接的byte串,结构为:数据类型描述符,数据;

S202:定义中间结构;

所述中间结构需要存放类描述编号,类型名称,类型名,类型数据。

作为优选,所述S3的详细步骤如下:

S301:以递归方式遍历解析整个文件,分级构建中间结果,最终获得一个总的中间结果;

S302:对于首次完成描述的类结构,将该类转换得到的中间结构存放在列表中,从0开始编号,当遇到已描述标志0x71时,根据该表之后的数字ID检索类描述并加载;

作为优选,所述S5的详细步骤如下:

S501:深度遍历中间结果生成的节点并解析;若最外层节点为类描述则执行S502;

S503:创建临时.java源文件;

S504:以类描述中类名为原文件中类名;

S505:读取已获取到的中间结果的节点名称获取节点名称;

S506:读取已获取到的中间结果中节点存放的数据类型,动态建立变量;

S507:统计节点数量;

S508:根据数据类型与名称向临时.Java文件写入域的信息;

S509:源文件中写入get和set方法;

S5010:存储源文件为其本身类名;

S5011:动态编译生成源文件为.class文件。

作为优选,所述S6的详细步骤如下:

S601:针对已生成类模版的数据,取最外层节点;

S602:当需要直接恢复全部序列化数据时执行S603,当仅需要恢复序列化数据中的部分数据,执行S604-S606;

S603:利用java自带的序列化类数据读取接口直接生成类对象并使用java 对对象的访问方式对类对象进行访问,结束;

S604:利用反射生成类对象;

S605:遍历生成的中间对象中的数据域部分;

S606:解析每个数据域的项,反射调用参数的set方法为类参数赋值或调用get方法获取参数值,结束。

与现有技术相比本发明的优点在于:

自主分析了二进制形式存放的Java序列化文件的数据存储结构与数据存储方式,并定义了名叫“中间数据结构”的结构,用于存储分析过程中所必需记录的数据类型名称、域名称等信息。

在对数据存储结构和方式的分析结果的基础上,设计中间数据结构及算法对序列化数据进行转换,忽略数据类型,直接将数据转换为以中间数据结构为单位的JSON格式。

设计算法将生成的JSON中体现出的数据结构转换成Java类,并对其进行动态编译。

实现对动态编译的类的对象的生成及访问接口,并设计算法将JSON中的数据填充至动态生成的内存对象中,也可结合Java原有的反序列化方法,将 Java序列化数据直接转换为内存对象。

能够在无法获知原数据结构的情况下,将任意标准Java序列化文件解析成为JSON或XML格式的跨平台通用数据。

对于Java平台本身,在将序列化文件解析成JSON或XML的基础上,为目标平台生成原有的实体类,并将解析的数据以对象的形式供目标平台调用。

Java平台解析时恢复的实体类可以动态编译为.class文件,供目标平台在后续对数据的处理中使用。

具体实施方式

为使本发明的目的、技术方案及优点更加清楚明白,以下举实施例,对本发明做进一步详细说明。

一种恢复Java序列化文件数据的方法,包括以下步骤:

S1:分析并记录Java序列化文件数据中关于数据类型及结构的标识符;

S2:定义中间结构用于存放解析过程中生成的各节点的数据类型名称、域名称及值;

S3:根据规则遍历解析序列化文件中的节点,获得一个最上层的中间结果, 解析过程中维护一个类定义ID列表;

S4:展开中间结果,转换为json格式;(至此数据已被恢复出,可以使用)

S5:提取类的结构并生成类模版用于内存数据恢复;(此后的步骤是为实现android或java系统中对恢复数据的动态调用)。

S6:恢复完整的序列化数据至内存中。

针对以上描述的关键步骤进行详细描述:

S1:分析并记录Java序列化文件数据中关于数据类型及结构控制的标识符;

所述数据类型标识符用于标识其所修饰的数据类型,共有十个,分别对应着 java中的8个基本数据类型、java类以及数组。

具体含义为:0x42表示byte;0x43表示char;0x44表示double;0x46表示float;0x49表示int;0x50表示long;Ox4c表示对象;0x53表示short;0x5a 表示boolean;0x5b表示数组。

所述结构控制标识主要有以下几种:

0x71,用于标识类已经被描述过,参考描述列表的记录;

0x72,用于标识类属性描述的开始;

0x73,用于标识对象描述的开始;

0x74,用于标识该结构为String;

0x75,用于标识数组描述的开始;

0x77,用于标识接下来的数据为块数据;

0x78,用于标识类结构描述的结束;

0x70,用于标识类有无超类。

S2:定义中间结构用于存放解析过程中生成的各节点的数据类型名称、域名称及值;

S201:分析数据存放方式,获取数据结构,用于设计解析算法;

分析类结构存储方式:

类结构的描述通过S1中数据类型标识符、结构控制标识符、数据长度以及数据四部分来完成,该描述是一串byte流。结构如下:

0x72,类名长度,类名,指纹与标识符,域数量,域列表(其结构为:数据类型标识,域名长度,域名),0x78,引用标志(0x70/0x76)。

其中0x70表示无超类无引用,0x76则表示接下来要描述其父类。

数据含义与数据存储结构分析:

数据与紧跟着类结构描述的结束符,是一系列数据描述首尾相接的byte 串。结构如下:

数据类型描述符,数据;

当数据类型描述符为0x71时,根据其后两个字节存储的数据,从已记录的类型描述列表中直接获取类型描述。

S202:定义中间结构;

所述中间结构需要存放类描述编号,类型名称,类型名,类型数据;

Java序列化文件中无论类还是类的域或是数据对象,都需要用该结构存储。

S3根据递归深度遍历的规则遍历解析序列化文件中的节点,获得一个最上层的中间结果,解析过程中维护一个类定义ID列表;

S301:以递归方式遍历解析整个文件,分级构建中间结果,最终获得一个总的中间结果。

S302:对于首次完成描述的类结构,将该类转换得到的中间结构存放在列表中,从0开始编号。当遇到已描述标志0x71时,根据该表之后的数字ID检索类描述并加载。

S4:展开中间结果,将中间结果利用android自带的json工具转换为json 字符串。

S5:提取类的结构并生成类模版用于内存数据恢复(该步骤针对最外层节点为自定义类的,系统内置类或基本类型跳过);

S501:深度遍历中间结果生成的节点并解析;若最外层节点为类描述则执行S502;

S503:创建临时.java源文件;

S504:以类描述中类名为原文件中类名;

S505:读取已获取到的中间结果的节点名称获取节点名称;

S506:读取已获取到的中间结果中节点存放的数据类型,动态建立变量;

S507:统计节点数量;

S508:根据数据类型与名称向临时.Java文件写入域的信息;

S509:源文件中写入get和set方法;

S5010:存储源文件为其本身类名;

S5011:动态编译生成源文件为.class文件。

S6:恢复完整的序列化数据至内存中;

S601:针对已生成类模版的数据,取最外层节点;

S602:当需要直接恢复全部序列化数据时执行S603,当仅需要恢复序列化数据中的部分数据,执行S604-S606;

S603:利用java自带的序列化类数据读取接口直接生成类对象并使用java 对对象的访问方式对类对象进行访问,结束;

S604:利用反射生成类对象;

S605:遍历生成的中间对象中的数据域部分;

S606:解析每个数据域的项,反射调用参数的set方法为类参数赋值或调用get方法获取参数值,结束。

本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的实施方法,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。本领域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1