一种针对磁盘分区被破坏时恢复FLV文件的方法与流程

文档序号:31656558发布日期:2022-09-27 22:22阅读:76来源:国知局
一种针对磁盘分区被破坏时恢复FLV文件的方法与流程
一种针对磁盘分区被破坏时恢复flv文件的方法
技术领域
1.本发明属于电子取证及数据恢复领域,涉及一种恢复flv文件的方法,尤其涉及一种针对磁盘分区被破坏时恢复flv文件的方法。


背景技术:

2.flv文件是flash video的简称,flv流媒体格式是随着flash mx的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入flash后,使导出的swf文件体积庞大,不能在网络上很好的使用等问题。
3.flv文件是被众多新一代视频分享网站所采用,是增长最快、最为广泛的视频传播格式。是在sorenson公司的压缩算法的基础上开发出来的。flv格式不仅可以轻松的导入flash中,速度极快,并且能起到保护版权的作用,并且可以不通过本地的微软或者real播放器播放视频。
4.flv文件是一个二进制文件,由flv文件头(flvheader)和很多标签tag组成。tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)。
5.flv文件=flv文件头+tag1+tag2+tag3+...+tagn。
6.各个标签tag的组成相同,即,标签tag=上一标签的字节长度(previous tag size)+标签头(tag header)+标签数据(tag data)。
7.各个标签头(tag header)的组成相同,即,标签头(tag header)=标签类型(type)+标签数据的字节长度(data size)+时间戳(timestamp)、扩展时间戳(timestamp_ex)+流信息id(stream id)。
8.然而,flv文件作为一种电子数据,一般存储在磁盘、u盘等存储空间中,它也具有电子数据易损坏的特性。例如当磁盘分区被破坏后,因为分区不能被windows操作系统正常识别,更无法读取数据,也无法确定簇与簇之间的顺序关系,即使存储了正常完整的flv文件,我们依然无法将其正常播放使用。因此,针对现有技术中无法恢复flv文件、尤其当磁盘分区被破坏时无法恢复flv文件的技术问题,迫切需要一种针对磁盘分区被破坏时恢复flv文件的方法,已解决flv文件的电子取证及数据恢复的难题。


技术实现要素:

9.针对现有技术的问题,本发明提供了一种针对磁盘分区被破坏时恢复flv文件的方法。结合windows操作系统的文件系统格式、磁盘分区大小、簇大小以及flv文件自身结构特征,对比下一簇所包含的上一标签的字节长度(previous tag size)与当前簇的末个标签的字节长度,确定当前簇与其下一簇的顺序关系,从而顺序拼接前、后两个相邻簇的数据并恢复flv文件。
10.本发明所提供的方法包括以下步骤:
11.s100:确定windows操作系统的文件系统格式、磁盘分区大小及簇大小,其中,所述文件系统格式包括fat16、fat32及ntfs;
12.s200:判断当前磁盘分区是否包含flv文件:在当前磁盘分区中以簇为单位查找flv文件特征标识符,如果查找到,执行步骤s300,否则,执行步骤sa00;
13.s300:以簇为单位,顺序遍历当前磁盘分区各个簇,判断当前簇是否为非flv文件,如果是,执行步骤s400,否则,执行步骤s500,其中,非flv文件包括磁盘管理数据信息及类型文件数据;
14.s400:寻址下一簇,执行步骤s300;
15.s500:判断当前簇的末个标签是否完整,如果是,执行步骤s600,否则,执行步骤s700;
16.s600:执行第一类恢复:当前簇的末个标签完整的情况下,对比下一簇所包含的上一标签的字节长度与当前簇的末个标签的字节长度,确定当前簇与其下一簇的顺序关系并进行顺序拼接,用以恢复flv文件,执行步骤s900;
17.s700:执行第二类恢复,包括恢复下述情况中的flv文件:
18.情况1:当前簇的末个标签所包含的上一标签的字节长度不完整;
19.情况2:当前簇的末个标签包含完整的上一标签的字节长度;
20.情况3:当前簇的末个标签所包含的标签头不完整;
21.情况4:当前簇的末个标签包含完整的上一标签的字节长度及完整的标签头;
22.情况5:当前簇的末个标签所包含的标签数据不完整,其中,标签数据包括音频流和/或视频流和/或脚本流;
23.s800:将当前簇与下一簇按顺序关系进行顺序拼接,用以恢复flv文件;
24.s900:判断是否完成当前磁盘分区中flv文件的恢复,如果是,执行步骤sa00,否则,执行步骤s400;
25.sa00:判断是否存在下一磁盘分区,如果是,执行步骤s200,否则,结束流程。
26.优选地,flv文件特征标识符为3字节的ascii码0x464c56。
27.优选地,flv文件由flv文件头及flv文件体组成,flv文件头由flv文件特征标识符、版本、类型标记、数据偏移量组成,flv文件体由多个标签组成,标签由上一标签的字节长度、标签头及标签数据组成,标签头包括标签类型、标签数据的字节长度、时间戳、扩展时间戳及流信息id。
28.优选地,步骤s300中,判断当前簇是否为非flv文件包括以下步骤:
29.s301:判断flv文件头中类型标记是否包含音频流和/或视频流,如果是,执行步骤s500,否则,执行步骤s302;
30.s302:判断当前标签头所包含的标签数据的字节长度+标签头的字节长度之和是否等于下一标签所包含的上一标签的字节长度,如果是,执行步骤s500,否则,执行步骤s303;
31.s303:判断当前标签头是否符合标签头的储存结构,如果是,执行步骤s500,否则,执行步骤s304;
32.s304:相邻标签之间是否满足:第n标签中所包含的标签数据的字节长度+11=第n+1标签所包含的上一标签的字节长度,如果是,执行步骤s500,否则,表示当前簇为非flv文
件,执行步骤s400。
33.优选地,步骤s301的等效步骤为:判断当前标签头的标签类型是否包含音频流和/或视频流和/或脚本流,如果是,执行步骤s500,否则,执行步骤s302。
34.优选地,步骤s600包括以下步骤:
35.当前簇的末个标签完整的情况下,下一簇所包含的上一标签的字节长度等于当前簇的末个标签的字节长度,且下一簇的储存结构符合标签头的储存结构,则确定当前簇与下一簇之间为同一flv文件的连续簇,并按顺序关系进行顺序拼接,用以恢复flv文件,执行步骤s900。
36.优选地,步骤s700包括以下步骤:
37.s701:判断当前簇的末个标签所包含的上一标签的字节长度是否完整,如果是,执行步骤s703,否则,执行步骤s702;
38.s702:执行情况1的flv文件的恢复:当前簇所包含上一标签的字节长度的字节内容,与下一簇所包含的上一标签的字节长度的字节内容拼接,读取所拼接的字节内容并判断是否等于当前簇的末个标签的字节长度,如果是,则确定当前簇与下一簇之间为同一flv文件的连续簇,执行步骤s800,否则,执行步骤s704;
39.s703:执行情况2的flv文件的恢复:判断下一簇的储存结构是否符合标签头的储存结构,如果是,则确定当前簇与下一簇之间为同一flv文件的连续簇,执行步骤s800,否则,执行步骤s704;
40.s704:判断当前簇的末个标签所包含的标签头是否完整,如果是,执行步骤s706,否则,执行步骤s705;
41.s705:执行情况3的flv文件的恢复:将当前簇的末个标签所包含的标签头与下一簇所包含的标签头拼接,读取所拼接的字节内容并判断是否符合标签头的储存结构,如果是,则确定当前簇与下一簇之间为同一flv文件的连续簇,执行步骤s800,否则,执行步骤s707;
42.s706:执行情况4的flv文件的恢复:
43.采用当前簇的末个标签所包含的标签头中标签数据的字节长度,计算标签数据的字节长度+11的和,作为当前簇的末个标签的字节长度;
44.寻址下一簇所包含的首个标签数据后的上一标签的字节长度并读取字节内容;
45.判断所读取的上一标签的字节长度是否等于标签数据的字节长度+11,如果是,则确定当前簇与下一簇之间为同一flv文件的连续簇,执行步骤s800,否则,执行步骤s707;
46.s707:执行情况5的flv文件的恢复,包括以下步骤:
47.s7071:读取当前簇的末个标签所包含的标签头中标签数据的字节长度;
48.s7072:获取当前簇的末个标签数据的实际字节长度;
49.s7073:标签头中的标签数据的字节长度-当前簇的末个标签数据的实际字节长度,获得差值;
50.s7074:以下一簇的起始地址为首地址,以差值为偏移量,寻址并读取连续4字节的字节内容;
51.s7075:判断所读取的连续4字节的字节内容是否等于当前簇的末个标签数据的实际字节长度+当前簇的末个标签头的字节长度的和,如果是,则确定当前簇与下一簇之间为
同一flv文件的连续簇,执行步骤s800,否则,执行步骤s900;
52.本发明具有以下有益效果:
53.1、结合磁盘分区数据块的大小,提高扫描磁盘分区的速度。
54.2、针对flv文件存储结构,分析判断flv文件数据的正确性和完整性,提高对flv文件的判断检测速度。
55.3、提高flv文件的恢复率。
56.4、当磁盘分区被破坏后、分区不能被windows操作系统正常识别、也无法读取数据、同时也无法确定簇与簇之间的顺序关系的情况下,提供了一种恢复flv文件的方法。
附图说明
57.图1为本发明所提供的方法的总流程图;
58.图2为本发明所提供的一个实施例中标签头的数据结构图;
59.图3为本发明所提供的方法中判断当前簇是否为非flv文件的具体流程图;
60.图4为本发明所提供的方法中针对当前簇的末个标签不完整时恢复flv文件的具体流程图。
具体实施方式
61.图1示出了本发明所提供的方法的总流程图。如图1所示,本发明的方法包括以下步骤:
62.s100:确定windows操作系统的文件系统格式、磁盘分区大小及簇大小,其中,文件系统格式包括fat16、fat32及ntfs。各种不同的文件系统格式下的分区中簇大小与磁盘分区大小相关。
63.例如,如果磁盘分区为512mb至1023mb,在fat16格式下,其簇大小为16kb;在fat32格式下,其簇大小为4kb;而在ntfs格式下,其簇大小为1kb。
64.再如,如果磁盘分区为2048mb至8gb,在fat32格式及ntfs格式下,其簇大小均为4kb。
65.在window操作系统中,我们目前最常使用到的文件系统为ntfs,且磁盘分区大小一般大于2gb,所以下述说明中均以windows操作系统中磁盘文件系统格式为ntfs、且磁盘分区大于2gb为例。因此,本文描述的簇的大小为4kb=0x1000字节。
66.图2示出了本发明所提供的一个实施例中标签头的数据结构图。如图2所示,flv文件特征标识符为3字节的ascii码0x464c56。
67.s200:判断当前磁盘分区是否包含flv文件:在当前磁盘分区中以簇为单位查找flv文件特征标识符0x464c56,如果查找到,执行步骤s300,否则,执行步骤sa00;
68.另外,flv文件由flv文件头及flv文件体组成,flv文件头由flv文件特征标识符、版本、类型标记、数据偏移量组成,flv文件体由多个标签组成,标签由上一标签的字节长度、标签头及标签数据组成,标签头包括标签类型、标签数据的字节长度、时间戳、扩展时间戳及流信息id。
69.具体地,flv文件是一个二进制文件,由flv文件头(flvheader)和很多标签tag组成。tag又可以包括三类:audio,video,script,分别代表音频流、视频流、脚本流(关键字或
者文件信息之类)。
70.flv文件=flv文件头+tag1+tag2+tag3+...+tagn。
71.各个标签tag的组成相同,即,标签tag=上一标签的字节长度(previous tag size)+标签头(tag header)+标签数据(tag data)。
72.标签的字节长度=标签头的字节长度(tag header)+标签数据(tag data)的字节长度。
73.各个标签头(tag header)的组成相同,即,标签头(tag header)=标签类型(type)+标签数据的字节长度(data size)+时间戳(timestamp)、扩展时间戳(timestamp_ex)+流信息id(stream id)。
74.s300:以簇为单位,顺序遍历当前磁盘分区各个簇,判断当前簇是否为非flv文件,如果是,执行步骤s400,否则,执行步骤s500,其中,非flv文件包括磁盘管理数据信息及类型文件数据;
75.图3示出了本发明所提供的方法中判断当前簇是否为非flv文件的具体流程图。如图3所示,步骤s300包括以下步骤:
76.s301:判断flv文件头中类型标记(type flags)是否包含音频流(audio)和/或视频流(video),如果是,执行步骤s500,否则,执行步骤s302;
77.s301的等效步骤为:判断当前标签头(tag header)的标签类型(type)是否包含音频流(audio)和/或视频流(video)和/或脚本流(script),如果是,执行步骤s500,否则,执行步骤s302。
78.s302:判断当前标签头(tag header)所包含的标签数据的字节长度(data size)+标签头(tag header)的字节长度之和是否等于下一标签所包含的上一标签的字节长度(previous tag size),如果是,执行步骤s500,否则,执行步骤s303;
79.s303:判断当前标签头(tag header)是否符合标签头(tag header)的储存结构,如果是,执行步骤s500,否则,执行步骤s304;
80.标签头(tag header)的储存结构为:标签类型(type)+标签数据的字节长度(data size)+时间戳(timestamp)、扩展时间戳(timestamp_ex)+流信息id(stream id)。
81.在flv文件中,上一标签的字节长度(previous tag size)记录了前一个标签tag的字节长度,因此,可以以此为判断相邻标签tag之间的关联关系为:第n个标签中的标签数据的字节长度(data size)+第n个标签头(tag header)所占用的11字节=第n+1个标签中的previous tag size。
82.s304:相邻标签之间是否满足:第n标签中所包含的标签数据的字节长度(data size)+11=第n+1标签所包含的上一标签的字节长度(previous tag size),如果是,执行步骤s500,否则,表示当前簇为非flv文件,执行步骤s400。其中,11表示标签头(tag header)固定的字节长度,即,11字节。
83.s400:寻址下一簇,执行步骤s300;
84.s500:判断当前簇的末个标签是否完整,如果是,执行步骤s600,否则,执行步骤s700;
85.s600:执行第一类恢复:即,指当前簇所包含的末个标签是完整无分割的情况下,对比下一簇所包含的上一标签的字节长度(previous tag size)与当前簇的末个标签的字
节长度,确定当前簇与其下一簇的顺序关系,并进行顺序拼接,用以恢复flv文件,执行步骤s900。其中,标签的字节长度=标签头的字节长度(tag header)+标签数据(tag data)的字节长度。步骤s600包括以下步骤:
86.假设当前簇的末个标签为tag n、且tag n完整无分割的情况下,下一簇所包含的上一标签的字节长度(previous tag size)等于当前簇的tag n的字节长度、且下一簇的储存结构符合标签头(tag header)的储存结构,则确定当前簇与下一簇之间为同一flv文件的连续簇,并按顺序关系进行顺序拼接,用以恢复flv文件,执行步骤s900。标签头(tag header)的储存结构如上所述,此处不再赘述。
87.s700:执行第二类恢复,包括恢复下述情况中的flv文件:
88.情况1:当前簇的末个标签所包含的上一标签的字节长度(previous tag size)不完整;
89.情况2:当前簇的末个标签包含完整的上一标签的字节长度(previous tag size);
90.情况3:当前簇的末个标签所包含的标签头(tag header)不完整;
91.情况4:当前簇的末个标签包含完整的上一标签的字节长度(previous tag size)及完整的标签头(tag header);
92.情况5:当前簇的末个标签所包含的标签数据(tag data)不完整,其中,标签数据(tag data)包括音频流(audio)和/或视频流(video)和/或脚本流(script);
93.图4示出了本发明所提供的方法中针对当前簇的末个标签不完整时恢复flv文件的具体流程图。如图4所示,步骤s700包括以下步骤:
94.s701:判断当前簇的末个标签所包含的上一标签的字节长度(previous tag size)是否完整,如果是,执行步骤s703,否则,执行步骤s702;
95.应理解,上一标签的字节长度(previous tag size)是否完整,即,上一标签的字节长度(previous tag size)是否分割在前后两个相邻簇中储存。
96.s702:执行情况1的flv文件的恢复:被分割在当前簇所储存的上一标签的字节长度(previous tag size)的字节内容,与被分割在下一簇所储存的上一标签的字节长度(previous tag size)的剩余字节内容进行拼接,读取所拼接的字节内容并判断是否等于当前簇的末个标签的字节长度,如果是,则确定当前簇与下一簇之间为同一flv文件的连续簇,执行步骤s800,否则,执行步骤s704;
97.s703:执行情况2的flv文件的恢复:判断下一簇的储存结构是否符合标签头(tag header)的储存结构,如果是,则确定当前簇与下一簇之间为同一flv文件的连续簇,执行步骤s800,否则,执行步骤s704;标签头(tag header)的储存结构如上所述,此处不再赘述。
98.s704:判断当前簇的末个标签所包含的标签头(tag header)是否完整,如果是,执行步骤s706,否则,执行步骤s705;
99.应理解,标签头(tag header)是否完整,即,标签头(tag header)是否分割在前后两个相邻簇中储存。
100.s705:执行情况3的flv文件的恢复:将当前簇的末个标签所包含的标签头(tag header)与下一簇所包含的标签头(tag header)拼接,读取所拼接的字节内容并判断是否符合标签头(tag header)的储存结构,如果是,则确定当前簇与下一簇之间为同一flv文件
的连续簇,执行步骤s800,否则,执行步骤s707;标签头(tag header)的储存结构如上所述,此处不再赘述。
101.应理解,当前簇的末个标签所包含的标签头(tag header)是否不完整,即,标签头(tag header)是否分割在前后两个相邻簇中储存。
102.s706:执行情况4的flv文件的恢复:
103.采用当前簇的末个标签所包含的标签头(tag header)中标签数据的字节长度(data size),计算标签数据的字节长度(data size)+11的和,作为当前簇的末个标签的字节长度;
104.寻址下一簇所包含的首个标签数据(data size)后的上一标签的字节长度(previous tag size)并读取字节内容;
105.判断所读取的上一标签的字节长度(previous tag size)是否等于标签数据的字节长度(data size)+11,如果是,则确定当前簇与下一簇之间为同一flv文件的连续簇,执行步骤s800,否则,执行步骤s707;
106.应理解,当前簇的末个标签所包含的标签数据(tag data)是否不完整,即,标签数据(tag data)是否分割在前后两个相邻簇中储存。
107.s707:执行情况5的flv文件的恢复,包括以下步骤:
108.s7071:假设当前簇的末个标签为tag n,当前簇包含了tag n的标签头(tag header)及部分标签数据(tag data),而下一簇包含了tag n的标签数据(tag data)的其余部分。该种情况下,我们读取当前簇的末个标签tag n所包含的标签头(tag header)中标签数据的字节长度(data size);
109.s7072:获取当前簇的末个标签数据标签数据(tag data)的实际字节长度;换言之,获取tag n的标签数据(tag data)在当前簇所占的字节长度。
110.s7073:标签头中的标签数据的字节长度(data size)-当前簇的末个标签数据的实际字节长度,获得差值;换言之,该差值即为tag n的标签数据(tag data)在下一簇所占的字节长度。
111.s7074:以下一簇的起始地址为首地址,以该差值为偏移量,寻址并读取连续4字节的字节内容;换言之,寻址tag n的标签数据(tag data)在下一簇所占的字节长度末尾的地址,其实就是下一簇的首个上一标签的字节长度(previous tag size)的地址,读取该地址为起始地址的连续4字节的字节内容,其实就是下一簇的首个上一标签的字节长度(previous tag size)。
112.s7075:判断所读取的连续4字节的字节内容是否等于当前簇tag n的标签数据(tag data)在当前簇所占的字节长度+当前簇tag n的标签头(tag header)的字节长度的和,如果是,则确定当前簇与下一簇之间为同一flv文件的连续簇,执行步骤s800,否则,执行步骤s900。如前所述,标签头(tag header)的字节长度为固定的11字节。
113.s800:将当前簇与下一簇按顺序关系进行顺序拼接,用以恢复flv文件。
114.s900:判断是否完成当前磁盘分区中flv文件的恢复,如果是,执行步骤sa00,否则,执行步骤s400;
115.sa00:判断是否存在下一磁盘分区,如果是,执行步骤s200,否则,结束流程。
116.通过本发明所提供的上述方法,能够恢复windows操作系统格式中的flv文件,解
决了现有技术中尚无一种针对磁盘分区被破坏时恢复flv文件的方法的技术问题。
117.应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1