为什么 rar 可以转 jpg?原理是什么?

补充 @冯东。

这种「同时是多种格式」的文件叫做 polyglot,本来指同时能被多种编程语言编译的源代码。本质上它是利用文件格式设计而 hack,最重要的一个原理就是:RAR 的文件格式规定文件头不必从 0 地址开始。RAR 程序解压文件时,会寻找

0x52 0x61 0x72 0x21 0x1a 0x07 0x00

这样一串字节,具体意义请见[1],前四个字节转为 ASCII 码恰好是「Rar!」。正常的 RAR 文件会把这串字节放在文件头部,但 RAR 文件格式并没有规定这是必须的(实际上,RAR 文件并不是开放的格式,怎么才算「正确」的 RAR 文件并无公共可见的文档),所以如果文件头并没有出现它,RAR 解压程序就会持续搜寻这个字串,找到之后把后面的部分当作 RAR 来处里,前面的部分就无视掉了。

反过来,JPG 格式规定文件起始两个字节必须是 0xFF 0xD8,如果找不到这两个字节,那么就不认为它是 JPG 文件。

RAR 并不是唯一一种不规定文件格式必须起始于文件头的格式。比如下面这个文件同时是:
  • Windows 应用程序
  • Adobe PDF
  • Java JAR
  • HTML 网页
而加上一个字节,还可以让它成为 Python 脚本:

code.google.com/p/corka

作者说:It serves no purpose, except proving that files format not starting at offset 0 are a bad idea.

[1] forensicswiki.org/wiki/
原发布于 https://www.zhihu.com/question/20469727/answer/15216164