根据元数据确定MP4文件时间的方法
2020-03-17石穗东刘宁朱桂生
石穗东 刘宁 朱桂生
(1.中山市公安局刑科所,广东中山 528403;2.广东省公安厅物证鉴定中心,广东广州 510000)
MP4 是一种常见的多媒体封装格式,对应的标准为ISO/IEC 14496-12:ISO Base Media File Format 及ISO/IEC 14496-14:MP4 File Format。MP4格式几乎可以用来描述所有的媒体结构,可以在其中嵌入任何形式的数据,以及各种编码的音视频,常用于网上流、光盘、语音发送(视频电话),以及电视广播。MP4目前被广泛用于封装h.264 视频和AAC 音频,是高清视频的代表。
1 MP4文件简介
1.1 基本概念
MP4 文件由一系列box 组成(QuickTime 中为atom)。Box由header和body组成,其中header 指明box 的size(32 位)和type;size 指明了整个box所占用的大小,包括header部分,这样就可以在文件中定位各个box;如果size 为1,表示该box 的大小为large size,真正的size 值要在large size 域上得到(实际上只有“mdat”类型的box 才有可能用到large size);如果size 为0,则表示该box 为文件的最后一个box,文件结尾即为该box结尾(同样只存在于“mdat”类型的box中)。size后面是32位的box type,一般是4 个字符,如“ftyp”“moov”“trak”等等,这些box type都是已经预定义好的,分别表示固定的意义[2]。Box 中可以包含一系列子box,这种box 被称为container box。在子box 中,header box 作为首个子box 紧随container box 出现。Fullbox 是box 的扩展,box 结构的基础上在header 中增加8 位version 和24 位flags。sample:video sample即为一帧视频,或一组连续视频帧,audio sample 即为一段连续的压缩音频,它们统称sample。MP4 文件数据存储使用大端字节序。MP4 格式的官方文件后缀名是“.MP4”,还有其他以MP4 为基础的格式,包括:m4v、m4a、m4p、m4b 等等。限于篇幅,本文只讲解常见的MP4文件结构。
1.2 几个重要box
File Type Box(ftyp)。在MP4文件头部,首先会有且只有一个“ftyp”类型的box,作为MP4 格式的标志并包含关于文件的一些信息,主要描述文件的版本、兼容协议等内容。
Movie Box(moov)。“moov”类型box 有且只有1 个,一般情况下会紧随ftyp box 出现,但也有放在文件末尾的。该box 包含本文件中所有媒体数据的宏观描述信息,但不包含具体的媒体数据。该box 是一个container box,包含的一系列子box中存储着媒体播放所需的metadata(元数据)。Moov box 中包含1 个“mvhd”和若干个“trak”等box。
Media Data Box(mdat)。MP4 文件中的媒体数据和媒体信息是分开存放的,媒体数据保存在“mdat”类型的box中,由文件的元数据进行描述。媒体数据的组织很自由,不一定要按照时间顺序排列,甚至媒体数据可以直接引用其他文件。因此,mdat box 可以有多个,也可以没有(当媒体数据全部引用其他文件时)。
1.3 包含时间戳的box
Movie Header Box(mvhd)。“Mvhd”是movie box 的首个子box,存放MP4 文件总体声明,对整个文件所包含的媒体数据作全面的全局的描述,包括创建时间、修改时间、时间刻度、默认音量、时长等信息。mvhd 是一个fullbox,其结构如图1所示。
图1 mvhd box结构
Track Box(trak)。描述单个track(轨道)或流信息的容器。MP4 文件中必须有一个或多个track,这些track之间彼此独立,有自己的时间和空间信息。每个trak box都包含与之对应的media box。该box 是一个container box,必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box(略)。Trak box的子box包含了该track的媒体数据引用和描述[3]。
Track Header Box(tkhd)。“Tkhd”是track box的首个子box,存放该track的特性和总体信息,如时长、宽高等。该box是一个fullbox,其结构中关于修改时间、创建时间的定义与mvhd相同。
Media Box(mdia)。“Mdia”类型box 定义了所属track 中的媒体数据信息。该box 是一个container box,一般情况下包含一个“mdhd”、一个“hdlr”和一个“minf”。
Media Header Box(mdhd)。“Mdhd”是media box 的首个子box,描述media box 的总体信息。该box 也是fullbox,其结构中关于修改时间、创建时间的定义与mvhd相同。
1.4 示例分析
以手机中拍摄的“VID_20190828_133158.MP4”为例进行分析,在手机中查看该文件的详情,修改时间为2019 年8 月28 日13 时31 分57秒。根据mvhd box、tkhd box、mdhd box分别是moov box、trak box、mdia box的首个子box的特点,在该文件中搜索“moov????mvhd”
(“?”用作通配符)、“trak????tkhd”和“mdia????mdhd”,搜索结果分别为1 个、2 个、2 个。如图2 所示,mvhd box、tkhd box、mdhd box 的version 均为0,因此创建时间、修改时间均为4个字节。搜索结果(高亮部分)往后第5至8 个字节是创建时间,第9 至12 个字节是修改时间,均是“D98BC24D”,共10个(红色框部分)。Winhex数据解释器的“HFS+Date+Time(32bit)”选项用于对1904 年1 月1 日0 时、长度为4 个字节的时间戳进行解析。将光标定位在时间戳的第1个字节“D9”,可知mvhd box中的创建时间为2019年8月28日13时31分57秒。
图2 元数据中的时间戳
在文件属性中,可以方便地对MP4 文件创建日期进行修改。创建副本文件“VID_20190828_133158-副本.MP4”,将该文件属性中的“创建媒体日期”修改为2020 年1 月1日,见图3。
图3 修改时间属性
图4 修改时间属性后的比较
比 较“VID_20190828_133158.MP4”和“VID_20190828_133158-副本.MP4”不同之处,由图4可知,只有偏移量2C至2E的3个字节被修改了,由原来的“D98BC2”改变为“DA31DF”。“VID_20190828_133158-副本.MP4”被修改的3 个字节(红色框),如图5 所示,mvhd box中的创建时间改变为2020年1月1日13时31分57秒。
图5 时间戳的变化
由上述操作可知,在文件属性中修改“创建媒体日期”,改变的只是mvhd box中的创建时间,而该box 中的修改时间,以及tkhd box、mdhd box 中的创建时间、修改时间都没有被改变。因此,不能只根据文件属性中的“创建媒体日期”作出判断,还要对mvhd box 中的修改时间,以及tkhd box、mdhd box 中的创建时间、修改时间进行分析。由于数据存储过程中延时等原因,创建时间与修改时间不一定相同;另外,每个trak box有自己的时间信息,创建时间之间、修改时间之间也可能不完全相同,但应该都在合理范围内。如果某些时间戳与其它时间戳相比不正常,则有可能是被蓄意修改所致。
2 案例分析
某猥亵儿童案,在嫌疑人电脑硬盘中,通过恢复软件文件签名方法得到的MP4 文件没有创建时间、修改时间,需要确定文件的创建时间。
由于恢复出来的涉案MP4 文件很多,编写脚本遍历当前目录所有MP4 文件获取创建时间、修改时间。思路如下:根据前面的分析,搜索所有mvhd box、tkhd box、mdhd box中的时间戳后进行转换。Python 中没有相对1904 年1月1日0时进行转换的函数,可以将时间戳先转换为十进制,减去2082844800(1904 年1 月1日0 时至1970 年1 月1 日0 点的总秒数)得到Unix 时间戳,再使用Unix 时间转换函数得到创建时间、修改时间。
研究发现:一些MP4文件的时间戳可能全是0,也可能是Unix时间戳(相对1970年1月1日0时)。因此要对获取到的时间戳进行判断再进行转换。判断条件:(1)如果时间戳大于2082844800,说明相对1904 年而不是1970 年。因为如果相对1970年,那么时间应该大于1970年+2082844800秒(约等于66年)>2036年,但当前日期还未到达2036年。因此需要将时间戳减去2082844800再进行Unix时间转换;(2)如果时间戳为0,则不用计算,说明文件中并没有记录时间;(3)如果上述条件都不符合(时间戳≤2082844800),说明时间戳不是相对1904 年的,而是Unix时间戳,相对1970年进行转换即可。
为精确搜索,构建正则表达式:container_box+b′[x00-xFF]{4}′+Timestamp_box,其中“container_box”为容器box(如moov、trak、mdia),“[x00-xFF]{4}”为任意4 个字节(即Timestamp_box的大小),“Timestamp_box”为包含时间戳的子box(如mvhd、tkhd、mdhd box)。限于篇幅,只展示了获取创建时间的函数(见图6),脚本运行结果如图7所示。
图6 获取创建时间的函数
图7 脚本运行结果
3 结束语
本文介绍了MP4 文件格式,以及根据文件元数据中的时间戳确定文件创建时间、修改时间的方法。由于MP4文件起源于QuickTime,本文的方法亦适用于MOV 文件。需要指出的是:1)时间戳依据拍摄设备产生,如果设备时间本身就错误,那么文件中的时间戳也是错误的。2)时区问题。如果分析软件中的时区设置与拍摄设备中的不一致,则分析结果因此会产生误差。3)通过微信以视频方式(非文件方式)发送的MP4 文件,在接收时文件名被改变,文件被压缩,其包含的所有时间戳也相应被修改接收文件时的时间,或修改为0。因此,针对时间的调查取证,往往要形成一条完整的证据链才能证明事件的发生或者发展,必要时还需辅以文件内容或其他证据。