文件取证入门:EXIF、魔数与改后缀的把戏
一个文件「是什么」,从来不由文件名说了算。名字是所有元数据里最容易改的一种——右键重命名,一秒钟,.exe 就能变成 .jpg,文件管理器的图标、缩略图全部跟着换。操作系统里大量界面乐于相信名字,于是名字成了伪装的第一道门。真正难以伪造的是内容本身:主流格式都在规范里写死了自己的「开场白」,这一小段字节是文件验明正身的地方,也是文件取证的起点。
魔数:规范写死的开头字节
这一小段字节业内叫魔数(magic number):格式规范规定文件开头必须出现的一串固定值。最著名的是 PNG——任何一张 PNG 的前八个字节必定是 89 50 4E 47 0D 0A 1A 0A。首字节 0x89 的最高位是 1,用来暴露早期把字节流按 7 位文本截断的传输环节;紧跟着的 50 4E 47 就是 ASCII 的「PNG」,用十六进制编辑器打开一眼能认;末四位 0D 0A 1A 0A 则是 PNG 创始团队里的 Greg Roelofs 特意设计的签名:回车加换行的组合能暴露做过行尾转换的程序,0x1A 对应 DOS 时代的 Ctrl-Z 文件结束符——整个签名跨回车换行平台,经过怎样的「好心」转码都会留痕。
PDF 的开头是肉眼可读的 %PDF-,ZIP 是 ASCII 的「PK」(50 4B)加两个字节,即 PK\x03\x04。操作系统与浏览器判断类型都按内容来:浏览器收到来历不明的响应会做 MIME 嗅探,按内容开头几个字节猜类型,而不是全信响应头;杀毒引擎、沙箱、网盘的预览服务,第一步同样读开头字节。名字可以随便改,魔数改了文件就废了——取证的第一课就落在这个不对称上。
在浏览器里读文件头只要几行:
| |
File.slice(0, 8) 只把前八个字节读进内存——对几个 GB 的视频文件,这个判断的代价也接近于零。这就是为什么所有类型识别工具都不在乎文件有多大。
ZIP 家族:最有趣的伪装
改后缀的把戏里最有意思的一类,是 ZIP 家族的「容器伪装」。docx、xlsx、pptx、apk、epub——这些后缀天差地别的格式,本质全是同一个 ZIP 容器,开头都是 PK\x03\x04。它们的区别不在开头字节,而在容器内部的目录结构:docx 里有 word/ 目录装着 document.xml,xlsx 里是 xl/ 工作簿,pptx 里是 ppt/ 幻灯片,apk 必须有 AndroidManifest.xml,epub 则要求根目录有一个 mimetype 文件、用它的内容声明版本。
所以识别这类格式要两步:先看 PK 头确认「这是个 ZIP」,再扫中央目录里的条目名,按内部结构细分真身。这里有个容易忽略的细节:ZIP 的中央目录并不在文件开头,而在文件尾部,所有条目名都列在那里——这也是为什么负责任的识别工具对大文件要专门读取尾部:头部窗口负责确认 PK 魔数和其余固定签名,尾部窗口负责翻中央目录,两个窗口凑齐,docx 与 apk 才分得开。只做第一步,Word 文档、安装包、电子书混成一锅;只信后缀,改个名就骗过去了。两步合起来,伪装才无处可藏——这也是「压缩包」和「文档」在取证意义上是同一种东西的原因:它们共享同一个壳。
EXIF:挂在 JPEG 里的 TIFF
照片是另一片战场。JPEG 的数据按「段」组织,每段以 0xFF 加段类型开头,段与段依次排布。EXIF 就挂在其中一个 APP1 段里:段内先写「Exif」加空零的标识,随后是一整个 TIFF 结构——开头两个字节声明字节序,II 是小端,MM 是大端;接着用一串偏移量串起 IFD(图像文件目录)链,每个条目都是「标签号 + 类型 + 数量 + 值」的组合。
两条指针最值得记住:标签 0x8769 指向 Exif IFD,拍摄时间、相机型号、快门光圈这些曝光参数都在里面;标签 0x8825 指向 GPS IFD,经纬度存在那里。IFD 链条可以一路挂下去,挂在里面的条目就随像素一起走——像素去哪,元数据去哪。也就是说,手机随手拍的一张照片,什么时候拍的、用什么设备、在哪个坐标,全都写在文件里——主人不发一语,照片自己全交代了。
安全面由此分岔:发到朋友圈、微博这类平台,上传时会被重新压缩转码,EXIF 在这一步被剥离,坐标出不了门;但如果把原文件直接丢进网盘分享、当邮件附件发出,或在聊天工具里选「发送原图」,EXIF 原样随行——位置隐私就是这么泄的。对着一张原图点开属性,经纬度精确到小数点后好几位,往地图上一放,就是家门口。卖房照片拍出自家地址、二手交易图拍出常去场所、旅行原图交出去一整条行程轨迹,都是同一类事故。
治理:先看,再剥,后验
好在治理不必先啃二进制,一条流水线就够:发图前先看清楚照片里藏了什么,敏感的剥掉,最后验证一遍。这条流水线上的每一步都有对应的本地工具,文件不需要离开浏览器。
🔧 EXIF查看器 把一张照片的元数据逐项摊开:拍摄时间、设备型号、GPS 坐标、曝光参数一眼见底,发之前先看一遍,心里有数。看完决定不带隐私出行,🔧 EXIF清除器 把 GPS 定位、拍摄设备这些敏感字段清掉再导出——它通过浏览器 Canvas 将图片重新编码,输出不含任何元数据的新图片,画面内容保持原样,支持 PNG/JPEG/WebP 输出,处理全程纯本地。改后缀的「图片」在这些工具面前会现形:🔧 文件类型识别 只读取头部与尾部各 64KB,与 40 余种签名逐字节比对,命中 ZIP 后再扫中央目录细分 docx、apk、epub,.exe 改名成 .jpg 会以红色警示行直接标出——签名覆盖图片、音视频、压缩包、可执行文件、字体、文档等门类,支持多选批量检测,一批来历不明的文件拖进去一次见分晓;🔧 图片信息查看 则给尺寸、格式与 EXIF 数据的概览,做日常速查足够。
这几件文件取证与隐私工具,连同更多同类小件,都收在隐私防护套装专题里,按场景排布,随取随用。记住开头那句话:文件是什么,内容说了算——下次遇到来路不明的「图片」,先让它报魔数。