一、bmp圖片
① 單色位圖:每個像素最多可以表示2種顏色,只需要使用長度為1的二進制位來表示,因此每個像素占1/8byte
② 16色位圖:每個像素最多可以表示16種顏色,只需要長度為4(2^4=16)的二進制表示,每個像素占1/2byte
③ 256色位圖:每個像素最多表示256種顏色,需要長度為8(2^8=256)的二進制表示,每個像素占1byte
④ 24位位圖:即RGB三原色位圖,每個像素占24位,3個byte
ps:一字節(1byte)=8位(8bit)
圖形的大小 = 圖片的總像素*每個像素的大小, 圖片的總像素 = 圖片長*高
bmp圖片格式:
① 位圖文件頭bmfh(占14個字節):
數據結構如下:
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //類型名,字符串“BM”,占2個字節,
DWORD bfSize; //文件大小,占4個字節
WORD bfReserved1; //保留字,占2個字節
WORD bfReserved2; //保留字,占2個字節
DWORD bfOffBits; //實際位圖數據的偏移字節數,即前三個部分長度之和,占4個字節
} BITMAPFILEHEADER;
② 位圖信息頭bmih(占40個字節)
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //指定此結構體的長度,0x28
LONG biWidth; //位圖寬
LONG biHeight; //位圖高.為正,表示從下往上存儲,左下角是起點。為負,表示從上往下儲存,左上角是起點
WORD biPlanes; //平面數,為1
WORD biBitCount //采用顏色位數,可以是1,2,4,8,16,24,32
DWORD biCompression; //壓縮方式,可以是0,1,2,其中0表示不壓縮
DWORD biSizeImage; //實際位圖數據占用的字節數
LONG biXPelsPerMeter; //X方向分辨率
LONG biYPelsPerMeter; //Y方向分辨率
DWORD biClrUsed; //使用的顏色數,如果為0,則表示默認值(2^顏色位數)
DWORD biClrImportant; //重要顏色數,如果為0,則表示所有顏色都是重要的
} BITMAPINFOHEADER;
③ 彩色表aColors
單色位圖彩色表占8字節
16色位圖彩色表占64字節
256色位圖彩色表占1024字節
二、png圖片
png圖片格式:由8個字節的PNG文件署名和數據塊組成
png文件署名域:89 50 4e 47 0d 0a 1a 0a (固定)
IHDR數據塊:
00 00 00 0d(說明IHDR頭塊長度為13)
49 48 44 52(IHDR的hex值)
00 00 00 64(圖像的寬,這里為100像素)
00 00 00 4f(圖像的高,這里為79像素)
08 表示色深 02 表示顏色類型 00 預留 00 預留 00 非隔行掃描
92 eb f7 f6(CRC校驗)
※ 這里需要注意的是圖像的寬、高數據,ctf題目經常將修改寬高后的圖片作為題目來隱藏信息
最后得有個IEND數據塊,通常值為 00 00 00 00 49 45 4E 44 AE 42 60 82
在IEND塊后面添加任何的字符都對文件的打開造成不了影響,那我們就可以在這里藏一些數據了
參考資料:1.利用文件頭標識判斷文件類型:https://blog.mythsman.com/post/5d301940976abc05b345469f/
2.PNG文件格式詳解:https://blog.mythsman.com/post/5d2d62b4a2005d74040ef7eb/
3.PNG文件結構分析與加密解密原理:https://www.cnblogs.com/amws/archive/2013/09/24/3336536.html
4.https://blog.csdn.net/u012611878/article/details/52215985