BMP (англ. BitMap Picture) – аппаратно-независимое побитовое изображение Windows, используемое для хранения растровых изображений. Дамп памяти изображения размером 5х3 пикселя показан на рисунке ниже.
Рисунок – Дамп памяти изображения в формате BMP
Все байты изображения представлены в шестнадцатеричной системе счисления. Число 36h, записанное по адресу 000Ah, указывает, с какого адреса начинается запись картинки (это смещение от начала файла, длина заголовка). По адресу 0012h указана ширина рисунка в пикселях. В данном случае число пикселей равно 5. Высота рисунка указывается в ячейке по адресу 0016h (для рассматриваемого рисунка высота – 3 пикселя). В ячейке с адресом 001Ch указана глубина цвета. В данном случае число 18h означает, что для формирования цвета каждого пикселя используется 24 бита (по 8 бит на каждую цветовую составляющую – красную(R), зеленую(G), синюю(B)).
На рисунке ниже структура представлена более детально.
Рисунок – Заголовок BMP-файла
Особенность формата BMP заключается в том, что размер каждой пиксельной строки должен быть кратен 4-м байтам. Поэтому помимо самих пикселей в дампе изображения могут встречаться выравнивающие байты, заполняющие длину пиксельной строки до размера, кратного 4.
Известно, что в картинку было внедрено секретное сообщение так, что изображение не было изменено. Найдите скрытое сообщение.
Рассмотрим изображение и разберем заголовок формата BMP. В данном изображении ширина составляет 9 пикселей (байт со смещением 0012h), а длина – 7 пикселей (байт со смещением 0016h). На каждый пиксель выделяется 18h = 2410 бит = 3 байта (ячейка со смещением 001Ch). Соответственно каждая строка занимает 9*3 = 27 байт + выравнивающий 1 байт (для кратности 4). Общее число таких групп по 27+1 байт равно 7.
Байты изображения начинаются с ячейки 0036h (ячейка со смещением 00Ah), далее следует 9*3=27 байтов, описывающих пиксели первой строки изображения. Следовательно, первый выравнивающий байт расположен в ячейке с адресом 0051h. Его значение равно 65h. Второй байт находится через 28 байт от первого, его значение равно 78h. Аналогично необходимо найти расположение всех 7-ми выравнивающих байтов.