经常看到分享“福利”的时候,都是放一张图片,改了后缀,变成rar,就可以找到资料。RAR变JPG,JPG变RAR压缩包与图片合成工具,就是把两个文件强行合并,图片放在上面!一般 在 百度贴吧 想给别人发 压缩包 但是又不能上传 就可以用这本工具 将RAR与JPG合并成JPG图片 发到贴吧 别人把图片下载回来 改成RAR 就能解压。在帖子里 还能看图。。。
这种「同时是多种格式」的文件叫做 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 网页
为了提高可用性,jpg还rar这样的软件都会试图在解码时排除那些错误的字节,一般情况下,除非文件头位置,其他位置的错误最多造成马赛克而已。最简单的是copy a.jpg+b.rar c.jpg 基本上不会影响两个文件的打开。最早还有txt的玩法。推荐winhex深入研究。
用16进制编辑器打开这样的文件,很明显看到两个文件的文件头大写JPEG和!RAR。
可以实现的主要原因有两个,一是jpeg的头格式里面保存了jpeg图像的图像的宽度和高度,而window图片阅读器正好是按照jpeg的格式处理的,活该它就这样,读取到jpeg文件结尾,rar的开头后就停止了。
二是rar要支持用rar程序打开自解压形式的压缩文件。因为自解压是一种可执行文件的形式,rar的实现方法就是把rar文件附到自解压程序的尾部。于是在我们按照'用winrar打开'这种方式给它发命令时,它只是把jpeg当作一个自解压程序了!不信你去桌面右键->'用winrar'一下jpg。