Traitement d'images
Introduction
PIL (Python Imaging Library) est un paquet qui contient plusieurs fonctions pour manipuler des images dans un script Python.
Mais quel est le rapport entre le traitement d’images et le Hacking ou le Forensic ?
Une partie du Hacking, mais qui fait partie intégrante aussi du Forensic, est la stéganographie.
La stéganographie (du grec steganos, couvert et graphein, écriture) est l’art de cacher un message au sein d’un autre message de caractère anodin, de sorte que l’existence même du secret en soit dissimulée. Alors qu’avec la cryptographie habituelle, la sécurité repose sur le fait que le message ne sera sans doute pas compris, avec la stéganographie, la sécurité repose sur le fait que le message ne sera pas sans doute pas détecté.
Nous aurons donc besoin dans certains cas d’étudier les images dans un ordinateur lors d’une perquisition afin d’essayer de détecter des messages ou d’autres choses cachées dans celles-ci.
L’analyse de captcha avec PIL, associée avec d’autres outils, va nous permettre de contourner cette protection lors d’accès à des sites web. En exercice nous analyserons un cas de captcha.
Le captcha est un moyen très utilisé (presque partout) qui permet (théoriquement) d’éviter des actions de robots...
Utilisation
1. La classe Image
PIL est inclus dans les distributions Linux dans le paquet imaging (python-imaging).
La plus importante classe dans PIL est la classe Image, définie dans le module portant le même nom. Nous pouvons créer une instance de cette classe de différentes manières : en chargeant l’image à partir d’un fichier, en traitant d’autres images ou en créant une image à partir de zéro.
Pour charger une image à partir d’un fichier, nous utiliserons la fonction open.
L’image ci-dessous se trouve dans le dossier où je lance le script Python :
>>> import Image
>>> im = Image.open("eni.jpg")
Si cela s’est bien déroulé, cette fonction retourne un objet image. Nous pouvons maintenant utiliser cette instruction pour examiner son contenu.
>>> print im.format, im.size, im.mode
JPEG (140, 140) RGB
Si l’image n’a pas pu être chargée, l’attribut aura la valeur None. L’attribut size est un tuple contenant width et height (en pixels). L’attribut mode définit le nombre et les noms des classifications de l’image, et aussi le type de pixels et la profondeur. Les modes les plus communs sont "L" (luminance) pour les images en niveau de gris, "RGB" pour les images en couleurs réelles, et "CMYK" pour les impressions d’images.
Si le fichier n’a pas pu être ouvert, une exception de type IOError est générée.
Nous avons maintenant une instance de la classe Image, nous pouvons utiliser les méthodes définies par cette classe pour manipuler et traiter l’image.
Nous allons afficher ce que nous avons chargé :
>>> im.show()
L’image apparaît dans une fenêtre séparée.
chap6_script1.py
import sys
from PIL import Image
PIL_Version = Image.VERSION
img_filename = "eni.jpeg"
im = Image.open(img_filename)
im.show()
2. Lire et écrire
PIL supporte une grande variété de types d’images. Pour lire un fichier du disque, nous utiliserons la fonction open du module Image. Nous n’avons pas besoin de connaître le format du fichier pour l’ouvrir. La librairie détermine automatiquement...
Exemples d’utilisation
1. Création d’un captcha
Le but du captcha est de créer une image lisible par l’homme mais non lisible ou très difficilement par un "robot". C’est un moyen d’être (presque) sûr que c’est un humain qui se connecte sur un site par exemple.
Les explications de chaque partie du script sont en commentaires dans ce dernier.
chap6_script5.py
#!/usr/bin/env python
import Image,ImageDraw,ImageFont
# creation du fond de l'image
image = Image.new('RGB', (300, 80), (220,210,190))
draw = ImageDraw.Draw(image)
# creation du texte
textImg = Image.new('RGB',(150,40),(0,0,0))
tmpDraw = ImageDraw.Draw(textImg)
textFont = ImageFont.truetype('/var/lib/defoma/x-ttcidfont-
conf.d/dirs/TrueType/Arial_Black.ttf',30)
tmpDraw.text((0, 0), 'ENI Ed.', font = textFont, fill =
(10,200,200))
textImg = textImg.rotate(-10)
# creation du masque (meme taille que l'image du texte)
mask = Image.new('L',(150, 40),0)
mask.paste(textImg,(0,0))
# collez-le sur l'image avec le texte
image.paste(textImg,(100,0),mask)
image.save('ENI.jpg')
2. Capture d’image et transformation
Nous allons dans ce script utiliser une autre bibliothèque appelée python-opencv qui va nous permettre de prendre une photo avec la webcam et ensuite de traiter cette image....