goto_top

Analyse de fichier au format Windows Bitmap (BMP)

STRUCTURE D'UN FICHIER BMP:

Champ Taille (bytes) Description
HEADER DE FICHIER
magic number 2 caractères 'BM' (0x42 0x4d): marqueur de fichier BMP
taille du fichier 4
app id 4 Infos d'identification propre à l'application qui a généré le fichier.
offset image 4 Offset de début des données de l'image
HEADER D'IMAGE
taille du header 4 Taille du header. Normalement 0x28
largeur image (px) 4  
hauteur image (px) 4  
nombre de plans 2 Normalement, toujours 1
profondeur de couleur 2 nombre de bits de couleur par pixel
compression 4 0= pas de compression. 1, 2 ou 3 selon la compression
taille image 4 Taille en octets de l'image, incluant l'éventuel padding de fin de ligne.
résolution horizontale 4 en px/m. Couramment 2835 (0xb13)
résolution verticale 4 en px/m. Couramment 2835 (0xb13)
couleurs palette 4 nombre de couleurs de la palette. 0 si pas de palette.
couleurs importantes palette 4  
PALETTE [OPTION] [16|256]*4 définit 16 ou 256 couleurs sur 24bits
DATA IMAGE    

Particularités:
- les données sont au format little-endian.
- la description de l'image se fait en partant du bas, de gauche à droite.
- en absence de palette le codage est fonction de la profondeur de couleurs. En deux couleurs, un octet code 8 pixels, en 24bits de couleur il faut trois octets par pixel (Bleu Vert Rouge).
- le nombre d'octets par ligne doit toujours être un multiple de 4. On ajoute au besoin 1 à 3 octets de padding à la fin de chaque ligne pour respecter cette règle.

Remarque: la palette est souvent très mal gérée par les logiciels graphiques qui enregistrent les images avec une palette par défaut correspondant à une répartition homogène sur l'ensemble des couleurs de la gamme, ce qui n'est pas forcément adapté à l'image et génère souvent des effets d'escalier de couleurs qui pourraient être évités avec une palette optimisée ne dégradant pas les couleurs, pour autant que le nombre de couleurs uniques de l'image ne dépasse pas 256.

CIBLES POSSIBLES POUR CACHER DES DONNÉES:

Le format BMP inclut dans le header d'image à la fois la taille du header (palette incluse le cas échéant) mais aussi l'offset du début des données de l'image. Ceci le rend vulnérable à l'insertion de données supplémentaires entre la fin du header et le début des données de l'image. Ces données ne sont généralement pas détectées par les logiciels graphiques qui se basent sur l'information de début d'image fournie.
De la même manière, on peut sans problème particulier ajouter des données après la fin de l'image.
Dans ces deux cas, la présence de données supplémentaires est facilement repérable par l'augmentation de taille du fichier final.

La présence d'une palette de couleurs ouvre d'autres voies plus subtiles d'insertion de données. Dans ce cas les couleurs sont définies sur 24bits, mais 4 octets sont utilisées pour chaque entrée de la palette. Le format BMP ne gérant pas la transparence, seul 3 octets sont réellement utilisés. Nous avons donc selon le cas 16 ou 256 octets non utilisées dans la palette, disponibles pour cacher des données.
De plus, la palette peut aussi et au même titre que l'image faire l'objet d'autres procédés stéganographiques.

Pour être exhaustif, mentionnons aussi les 4 octets du champ d'identification de l'application qui peuvent être utilisés librement.

Enfin (last but not least), la présence éventuelle d'octets de padding en fin de ligne offre une possibilité supplémentaire de cacher des données sans influer sur la taille du fichier ni modifier les données de l'image.

ANALYSE D'UN FICHIER BMP: Bmpalyser

Bmpalyser est un petit programme en C conçu à partir des observations précédentes. La page de Bmpalyser.