乾貨 | 隱寫技巧:利用JPEG文件格式隱藏payload
01 前言
繼續對圖片隱寫技巧的學習,這次是對JPEG文件格式的學習和理解。同PNG文件的格式對比,JPEG文件相對簡單,讀取其中隱藏payload的方式大同小異,兩者區別在於文件格式不同,可供利用的細節存在差異。
本文相關工具:
16進位編輯器:Hex Editor
隱寫檢測:Stegdetect
下載地址: https://github.com/abeluck/stegdetect
編輯Exit信息:MagicEXIF
下載地址: http://www.magicexif.com/
分析JPEG圖片格式:JPEGsnoop
下載地址: http://www.impulseadventure.com/photo/jpeg-snoop.html
02 相關概念
JPEG文件
JPEG是Joint Photographic Experts Group(聯合圖像專家組)的縮寫,支持有隕壓縮,不支持透明,不支持動畫,非矢量
JEPG同JPG的區別
JPEG既可作為擴展名,又能代表文件格式nJPG是JPEG的簡寫,代表擴展名nJPEG和JPG基本上是沒有區別的,它們的格式也是通用的n
色彩模型
採用YCrCb色彩模型,更適合圖形壓縮,而不是RGB
Y表示亮度nCr表示紅色分量nCb表示藍色分量n
人眼對圖片上的亮度Y的變化遠比色度C的變化敏感. 如果每個點保存一個8bit的亮度值Y, 每2x2個點保存一個CrCb值, 圖象在肉眼中的感覺不會起太大的變化,而且節省一半的空間
RGB模型4個點需要4x3=12位元組 YCrCb模型4個點需要4+2=6位元組
[R G B] -> [Y Cb Cr] 轉換:
Y = 0.299*R + 0.587*G + 0.114*B nCb = - 0.1687*R - 0.3313*G + 0.5 *B + 128 nCr = 0.5 *R - 0.4187*G - 0.0813*B + 128n
[Y,Cb,Cr] -> [R,G,B] 轉換:
R = Y + 1.402 *(Cr-128) nG = Y - 0.34414*(Cb-128) - 0.71414*(Cr-128) nB = Y + 1.772 *(Cb-128)n
文件格式
JPEG文件大體上可以分成兩個部分:標記碼和壓縮數據
標記碼: 由兩個位元組構成,第一個位元組是固定值0xFF,後一個位元組則根據不同意義有不同數值
在每個標記碼之前可以添加數目不限的無意義的0xFF填充,連續的多個0xFF可以被理解為一個0xFF,並表示一個標記碼的開始
常見的標記碼:
SOI 0xD8 圖像開始nAPP0 0xE0 應用程序保留標記0nAPPn 0xE1 - 0xEF 應用程序保留標記n(n=1~15)nDQT 0xDB 量化表(Define Quantization Table)nSOF0 0xC0 幀開始(Start Of Frame)nDHT 0xC4 定義Huffman表(Define Huffman Table)nDRI 0XDD 定義差分編碼累計複位的間隔(Define Restart Interval)nSOS 0xDA 掃描開始(Start Of Scan)nEOI 0xD9 圖像結束n
壓縮數據:前兩個位元組保存整個段的長度,包括這兩個位元組
註: 這個長度的表示方法按照高位在前,低位在後,與PNG文件的長度表示方法不同,例如長度是0x12AB,存儲順序為0x12,0xAB。
Exif信息
Exif文件是JPEG文件的一種,遵從JPEG標準,只是在文件頭信息中增加了拍攝信息和索引圖。用相機拍出來的jpeg都會有這個信息,儲存在APP1(0xFFE1)數據區中,接下來兩位元組保存APP1數據區(即Exif數據區)的大小,接著為Exif Header,固定結構:0x457869660000,後面為Exif的數據
查看Exif信息的工具:exiftool
下載地址: https://github.com/alchemy-fr/exiftool
編輯Exit信息的工具:MagicEXIF
下載地址: http://www.magicexif.com/
添加操作如圖

03 常見隱寫方法
DCT加密nLSB加密nDCT LSBnAverage DCTnHigh Capacity DCTnHigh Capacity DCT - Algorithmn
目前已經有很多開源的工具能夠實現以上高級的隱寫方法,常見隱寫工具:
JStegnJPHidenOutGuessnInvisible SecretsnF5nappendXnCamouflagen
當然,對應的隱寫檢測工具也出現了很久,比如:Stegdetect
下載地址: https://github.com/abeluck/stegdetect
04 利用JPEG文件格式隱藏Payload
接下來介紹在學習文件格式後產生的一些隱藏思路:
1、直接在尾部添加數據

如圖,不會影響圖片的正常瀏覽
2、插入自定義COM注釋
COM注釋為0xff和0xfe 插入數據0x11111111 長度為0x04 總長度為0x06 完整的十六進位格式為0xffff000611111111
插入位置為DHT前面,如圖

插入後如圖,不影響圖片的正常查看

將ff改為fe,如圖,同樣不影響圖片的正常查看

3、插入可被忽略的標記碼
原理同上,標誌碼換成可被忽略的特殊值,例如:
00n01 *TEMnd0 *RST0ndc DNLnef APP15n
經測試以上標識碼均不影響圖片的正常查看
4、修改DQT
DQT: Define Quantization Table 標識碼為0xdb 接下來兩位元組表示長度 接下來一位元組表示QT設置信息 前4bit為QT號 後4bit為QT精度,0=8bit,否則為16bit 最後是QT信息,長度為64的整數倍
查看測試圖片的DQT信息,如圖

長度為0x43,十進位為67 00表示QT號為0,精度為8bit 接著64位元組為QT信息位元組
註: 此處DQT格式參考自http://www.opennet.ru/docs/formats/jpeg.txt
嘗試將這64位元組替換,如圖

前後對比如圖,能夠發現圖片的變化

如果僅僅是調整其中部分位元組,改為payload,那麼能有多大區別呢,對比如圖

依次類推,可供修改的位置還有很多
05 檢測和識別
對於以上的隱藏方法,藉助jpeg圖片格式分析工具就能發現其中的痕迹,比如JPEGsnoop
下載地址: http://www.impulseadventure.com/photo/jpeg-snoop.html
支持如下文件的格式分析:
.JPG - JPEG Still Photon.THM - Thumbnail for RAW Photo / Movie Filesn.AVI* - AVI Moviesn.DNG - Digital Negative RAW Photon.PSD - Adobe Photoshop filesn.CRW, .CR2, .NEF, .ORF, .PEF - RAW Photon.MOV* - QuickTime Movies, QTVR (Virtual Reality / 360 Panoramic)n.PDF - Adobe PDF Documentsn
實際測試:
如下圖,發現了圖片中添加的COM注釋

如下圖,通過查看DQT的數據識別添加的payload,0x11對應的十進位為17

同樣,JPEGsnoop能夠解析jpeg圖片的EXIF信息,如下圖

註: 為便於測試,截圖中的以下數值通過MagicEXIF軟體手動添加:

06 補充
相比於png文件,由於JPEG文件沒有對圖像數據的校驗位,所以在jpeg文件中添加payload簡單了很多,下載JPEG圖片解析並執行payload的方法不再介紹。
07 小結
本文對JPEG的格式進行介紹,著重分析如何根據JPEG的文件格式,利用特定標誌碼隱藏payload,這種方式雖然不會影響圖片的正常瀏覽,但是藉助于格式分析軟體仍能夠發現其中的細節。介紹JPEG格式的官方文檔裡面待學習的內容還有很多,認識越深,可供研究的技巧將會更多。
註:本文是嘶吼原創文章,未經許可禁止轉載
推薦閱讀:
TAG:技术分析 |
