在 puzzles.SE 中解开一个涉及附加到 gif 的隐藏文件的谜题后,我对于附加的 .rar 文件产生了疑问。
经过这个问题我明白为什么我可以在任何已知图像格式的末尾添加 .rar 文件内容,只要这种格式以某种方式声明其数据长度,任何兼容的读取器都只会加载所需数量的字节,而不会读取直到文件末尾。
我可以生成这样的文件:
$ cat myimg.jpg myhidden.rar > myimg.jpg
它适用于任何提到的格式,并且可以在图像查看器中作为常规图像打开。
令我惊讶的是,我居然可以打开隐藏文件!这是:
$ sudo apt-get install unrar
$ unrar e myimg.jpg
并将提取 myhidden.rar 内容中的文件
我的问题是:这怎么可能?我对此的第一个想法是,当我尝试打开文件时,顶部找不到 .rar 标头(相反,rar...解析器不应该识别这种奇怪的格式),但不知何故,该实用程序设法找到了实际的 rar 文件并将其打开。我注意到这在 Ubuntu 和使用 WinRAR 的 Windows 中都有效。
我遗漏了什么?这也适用于其他格式吗?(具体来说:.zip、.7z、.tar.gz)。
答案1
这也适用于 .zip
基本上,“ZIP 文件”的开始是一个已知的标题(以“PK”开头)。
知道如何处理 ZIP 文件的程序可以在任何文件中搜索已知标头,然后将该标头和所有后续字节视为 ZIP 文件。
例如,Info-Zip 包含名为“unzipsfx.exe”的可执行文件。该文件有多种版本(例如,DOS 的 5.12 版、OS/2 的 5.12 版、Win32 的 5.12 版)。您可以创建一个“自解压 zip 文件”,即能够自行解压的可执行文件,方法是创建一个以此“unzipsfx.exe”的某个版本开头的新文件,然后在其末尾添加一个 ZIP 文件。因此,如果我添加了 OS/2 变体(带有“ copy/b unzipsfx.exe+myfile.zip myfile.exe
”),那么我可以轻松地使用 OS/2 提取它。虽然我无法从运行 MS-DOS 的计算机运行该文件(以有效地提取压缩数据)(因为 MS-DOS 不运行 OS/2 软件),但我仍然可以使用 PKUNZIP 进行 MS-DOS 提取。
这种自解压文件很常见,任何流行的解压软件都应该能够处理这种文件变体。它们只需查找已知的标头即可。我清楚地记得有些软件(我忘了是哪个软件)会显示警告消息,警告文件开头有多余的字节。但是,它仍然可以正常工作。
编辑,在示例场景中添加对 unrar 行为的说明:unrar 不会处理 JPG 并忽略 JPG,因为它完全了解 JPG 文件的结构。它只是忽略不感兴趣的字节(碰巧是 JPG 文件),直到找到它想要的内容:开始看起来像“RAR”存档的字节。大多数 .rar 文件从第一个字节开始都有一个 RAR 存档,但这并不是 RAR 存档的绝对要求。由于官方 RAR 软件支持创建自解压文件(适用于各种操作系统),我相信 RAR 也支持与处理 ZIP 文件类似的功能。