經(jīng)常看到分享“福利”的時候,都是放一張圖片,改了后綴,變成rar,就可以找到資料。RAR變JPG,JPG變RAR壓縮包與圖片合成工具,就是把兩個文件強行合并,圖片放在上面!一般 在 百度貼吧 想給別人發(fā) 壓縮包 但是又不能上傳 就可以用這本工具 將RAR與JPG合并成JPG圖片 發(fā)到貼吧 別人把圖片下載回來 改成RAR 就能解壓。在帖子里 還能看圖。。。
這種「同時是多種格式」的文件叫做 polyglot,本來指同時能被多種編程語言編譯的源代碼。
程序原理分析:
本質(zhì)上它是利用文件格式設(shè)計而 hack,最重要的一個原理就是:RAR 的文件格式規(guī)定文件頭不必從 0 地址開始。RAR 程序解壓文件時,會尋找
0x52 0x61 0x72 0x21 0x1a 0x07 0x00
這樣一串字節(jié),具體意義請見[1],前四個字節(jié)轉(zhuǎn)為 ASCII 碼恰好是「Rar!」。正常的 RAR 文件會把這串字節(jié)放在文件頭部,但 RAR 文件格式并沒有規(guī)定這是必須的(實際上,RAR 文件并不是開放的格式,怎么才算「正確」的 RAR 文件并無公共可見的文檔),所以如果文件頭并沒有出現(xiàn)它,RAR 解壓程序就會持續(xù)搜尋這個字串,找到之后把后面的部分當(dāng)作 RAR 來處里,前面的部分就無視掉了。
反過來,JPG 格式規(guī)定文件起始兩個字節(jié)必須是 0xFF 0xD8,如果找不到這兩個字節(jié),那么就不認(rèn)為它是 JPG 文件。
RAR 并不是唯一一種不規(guī)定文件格式必須起始于文件頭的格式。比如下面這個文件同時是:
Windows 應(yīng)用程序
Adobe PDF
Java JAR
HTML 網(wǎng)頁
為了提高可用性,jpg還rar這樣的軟件都會試圖在解碼時排除那些錯誤的字節(jié),一般情況下,除非文件頭位置,其他位置的錯誤最多造成馬賽克而已。最簡單的是copy a.jpg+b.rar c.jpg 基本上不會影響兩個文件的打開。最早還有txt的玩法。推薦winhex深入研究。
16進制分析:
用16進制編輯器打開這樣的文件,很明顯看到兩個文件的文件頭大寫JPEG和!RAR。
可以實現(xiàn)的主要原因有兩個,一是jpeg的頭格式里面保存了jpeg圖像的圖像的寬度和高度,而window圖片閱讀器正好是按照jpeg的格式處理的,活該它就這樣,讀取到j(luò)peg文件結(jié)尾,rar的開頭后就停止了。
二是rar要支持用rar程序打開自解壓形式的壓縮文件。因為自解壓是一種可執(zhí)行文件的形式,rar的實現(xiàn)方法就是把rar文件附到自解壓程序的尾部。于是在我們按照'用winrar打開'這種方式給它發(fā)命令時,它只是把jpeg當(dāng)作一個自解壓程序了!不信你去桌面右鍵->'用winrar'一下jpg。