標籤:

乾貨 | 隱寫技巧:利用JPEG文件格式隱藏payload

01 前言

繼續對圖片隱寫技巧的學習,這次是對JPEG文件格式的學習和理解。同PNG文件的格式對比,JPEG文件相對簡單,讀取其中隱藏payload的方式大同小異,兩者區別在於文件格式不同,可供利用的細節存在差異。

本文相關工具:

16進位編輯器:Hex Editor

隱寫檢測:Stegdetect

下載地址: github.com/abeluck/steg

編輯Exit信息:MagicEXIF

下載地址: magicexif.com/

分析JPEG圖片格式:JPEGsnoop

下載地址: impulseadventure.com/ph

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

下載地址: github.com/alchemy-fr/e

編輯Exit信息的工具:MagicEXIF

下載地址: magicexif.com/

添加操作如圖

03 常見隱寫方法

DCT加密nLSB加密nDCT LSBnAverage DCTnHigh Capacity DCTnHigh Capacity DCT - Algorithmn

目前已經有很多開源的工具能夠實現以上高級的隱寫方法,常見隱寫工具:

JStegnJPHidenOutGuessnInvisible SecretsnF5nappendXnCamouflagen

當然,對應的隱寫檢測工具也出現了很久,比如:Stegdetect

下載地址: github.com/abeluck/steg

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格式參考自opennet.ru/docs/formats

嘗試將這64位元組替換,如圖

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

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

依次類推,可供修改的位置還有很多

05 檢測和識別

對於以上的隱藏方法,藉助jpeg圖片格式分析工具就能發現其中的痕迹,比如JPEGsnoop

下載地址: impulseadventure.com/ph

支持如下文件的格式分析:

.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:技术分析 |