- Portable Executable File Format
-
Portable Executable Extension .cpl, .exe, .dll, .ocx, .sys, .scr, .drv Type de format Binaire, Exécutable, Code Objet, DLL Extension du MZ-DOS Executable
COFFmodifier Le format PE (Portable Executable), est un format de fichier natif spécifique à Windows, qui structure les fichiers exécutable du système d'exploitation. Développé par Microsoft, et dérivé de Unix COFF (Common Object File Format, voir (en) COFF), ce format structure les binaires à extension *.exe (Logiciel), *.ocx (Object Linking and Embbeding), *.dll (Dynamic Link Library) et *.cpl (Panneau de Configuration) sur toutes les plateformes Win32 et supérieur.
D'un point de vue sécuritaire, la connaissance de ce format est en soit une base qu'il est nécessaire de posséder lorsque l'on souhaite se lancer dans le Reverse Engineering. Divers outils, présentés plus bas, se basent sur le fonctionnement de la structure PE pour travailler sur les exécutables.Sommaire
Historique
Microsoft migra vers le format PE avec l'introduction de Windows NT 3.1 OS. Toutes les versions suivantes de Windows, incluant Windows 95/98/ME, supportent ce format. Auparavant ils étaient au format NE — New Executable File Format, « New » faisant référence à CP/M, et aux fichiers .com —.
La création du format PE a été induite par le fait que Microsoft souhaitait créer une structure de fichier portable, de sorte qu'elle puisse s'adapter aux différents systèmes de Windows NT, car il faut savoir que Windows NT était au départ capable de supporter d'autres architectures que le x86 d'Intel, Power PC et Motorola 68000 en faisaient partie. L'idée fût donc de créer une structure commune à ces architectures.
Structure du Format PE
PE étant une structure de fichier, cela signifie qu'il est formaté d'une certaine façon. Voici son organisation interne :
Tous les fichiers PE doivent absolument respecter cette structuration. Si on essaye, par exemple, d'ouvrir un fichier *.exe avec le Bloc-Note, on s'aperçoit que les deux premiers octet sont MZ, qui correspond bien à la suite décrit dans cet article.
Entête MZ-DOS
L'entête MZ-DOS, pas vraiment d'une grande utilité, permet au système d'exploitation de reconnaître le fichier comme étant un exécutable valide dans le cas où celui-ci serait lancé depuis MS-DOS, afin de pouvoir exécuter son segment DOS.
Cet entête est également soumis à structuration, nommé IMAGE_DOS_HEADER, cette structure permet de formater l'entête MZ-DOS. Ci-dessous, son prototype en langage C.
typedef struct _IMAGE_DOS_HEADER { WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_crlc; WORD e_cparhdr; WORD e_minalloc; WORD e_maxalloc; WORD e_ss; WORD e_sp; WORD e_csum; WORD e_ip; WORD e_cs; WORD e_lfarlc; WORD e_ovno; WORD e_res[4]; WORD e_oemid; WORD e_oeminfo; WORD e_res2[10]; LONG e_lfanew; } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
Cette structure contient beaucoup d'informations, mais les 2 principaux champs sont :
- e_magic : Ce champ contient la signature que tout fichier PE doit contenir, et vaut 0x5A4D ("MZ").
- e_lfanew : Ce champ pointe vers l'entête PE.
Segment DOS
Le segment DOS est exécuté au cas où Windows ne reconnaîtrait pas le fichier comme étant au format PE. Ce segment étant un exécutable valide, il affiche en général un message comme This program must be run under Win32, autrement dit "Impossible d'exécuter ce programme sous le mode MS-DOS".
Il s'agit d'un message implémenté par le compilateur, lors de la compilation du code logiciel, ou dans le plupart des cas une exécution de int 21h, une interruption du BIOS (Basic Input Ouput System) qui permet d'afficher un texte à l'écran.
Entête PE
L'entête PE est un ensemble de structures, regroupées dans une même et unique nommé IMAGE_NT_HEADER, voici son prototype en langage C.
typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER OptionalHeader; }IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
- Signature : Signature permettant d'identifier le fichier, cette variable doit être égale à 0x00004550, soit "PE\0\0" (\0 étant un octet nul).
Le second champ, FileHeader, est une structure nommé IMAGE_FILE_HEADER, qui contient les informations concernant la structuration du fichier, et prototypé comme suit :
typedef struct _IMAGE_FILE_HEADER { WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; }IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
- Machine : Ce champ spécifie le type d'architecture utilisé pour faire fonctionner le binaire, sur un i386, sa valeur est à 0x014c (0x8664 sur AMD64).
- NumberOfSections : Nombre de Sections existante dans le programme.
- TimeDateStamp : Cette variable correspond à la date de modification du fichier. Elle contient une valeur en seconde de la date, équivalente au temps écoulé depuis le 1er Janvier 1970.
Table des Sections
La Table des Sections survient juste après le PE Header. Il s'agit d'un tableau contenant plusieurs structures.
Ces structures contiennent les informations concernant les sections du binaire, ainsi s'il y a 4 sections, la Table des Sections contiendra 4 structures.
Table d'Import - IAT
IAT = Import Address Table
Table d'Export - EAT
EAT = Export Address Table
Section des Fichiers PE
(À venir)
Le PE Loader
Intro : Il s'occupe de mapper le code en mémoire.
Reverse Engineering du Format PE
Définition
Le Reverse Engineering, parfois concis en "Reversing", est un technique d'analyse logiciel qui de par son aspect, permet de trouver des bugs, failles, de concevoir des exploits, et de corriger des problèmes dans un logiciel. Plus globalement, il s'agit donc d'essayer de comprendre le fonctionnement d'un code binaire, sans en avoir le code source.
Une autre utilisation du Reversing, consiste en l'analyse de Malware dans le but de comprendre son comportement, sa structure, afin de créer un "vaccin" contre ce dernier. Ces dits "vaccins" peuvent ensuite être intégrés dans un anti-virus pour protéger le système. À noter que la plupart des virus/anti-virus se concentrent sur Windows, qui est de loin l'OS le plus utilisé/vendu dans le domaine grand public.
Cette pratique consiste en une analyse poussé du code binaire d'un programme (quel qu'en soit le format), pour en révéler son fonctionnement, son comportement. Elle fait ressortir des connaissances poussées du système d'exploitation (FreeBSD, Windows, Linux, Mac), de programmation (ASM, C/C++), et architecturaux (x86, SPARC) de la part de celui qui s'y exécute.
Cet article traitant principalement du Format PE (Portable Executabl) de Windows, nous allons donc étudier le Reverse Engineering sur des binaires structurés via ce format de fichier.
Notez qu'il est bien entendu possible d'effectuer toutes les démarches suivantes dans des formats tel que ELF (Extended & Linking Format) ou encore Mach-O (Mach Object File Format). En revanche, en changeant de format, les outils vont bien entendu changer à leurs tours, non pas le principe mais les programmes eux-mêmes; des nuances sur les protections anti-reversing se feront sentir également.
Analyse Statique
Une Analyse Statique d'un programme/logiciel consiste en une lecture du code binaire de ce dernier tel qu'il existe sur le Disque Dur, c'est-à-dire sans être en exécution.
Une lecture du code binaire d'un programme n'est ni plus ni moins qu'une transformation des suites d'octet présentent dans le programme, en langage ASM, langage mnémotechnique permettant une compréhension humaine de ce que doit entreprendre le programme.
Des outils ont été spécifiquement développés dans ce but, tel que Win32Dasm, ou Pydasm (Module Python)
Analyse Dynamique
Une Analyse Dynamique comprend deux phases : lecture du code - exécution du code.
Pour entreprendre une telle démarche, il est nécessaire de posséder un outil logiciel que l'on nomme Débogueur, tel qu'OllyDbg ou GDB (GNU Debugger).
Le principe étant de désassembler le programme, tout en l'exécutant, de manière à pouvoir modifier son code si besoin en temps réel (donc son exécution) dans le but d'interagir avec, afin de comprendre beaucoup plus en détail son fonctionnement.
Protection Anti-Reversing
Le Reversing étant vu comme une technique intrusive à l'égard des logiciels closed-source (Code source propriétaire et non divulgué), les programmeurs ont donc eu l'idée d'inclure des routines spécifiques dans leurs programmes, qui n'auront qu'un unique but : empêcher au maximum la prise d'information sur le comportement du logiciel.
Pour ce faire, il existe pléthore de méthodes, dont l'utilisation de Packer (Cryptage/Compression de Code), de code détecteur de débogueur, d'analyse de Checksum (Somme de Contrôle)...seule l'imagination et la créativité peuvent faire freins au développement d'applications "protégées" contre le Reverse-Engineering.
Les Packer
Un Packer est un outil logiciel dont le but est de compresser un programme afin de réduire sa taille initiale, tout en conservant son aspect exécutable (sans changer son code interne).
Néanmoins, avec le temps, des nouveaux packer sont apparues et ces derniers possèdent également la capacité de crypter le code du programme cible, ce qui aura pour effet de réduire son poid certe, mais qui de plus, va modifier son code d'exécution. Un algorithme des plus connu, et un des plus simple à contourner, est sans nul doute XOR (OU-Exclusif).
Bien entendu, la partie "décryptage" effectué lors du lancement du programme packé/crypté sera établie de manière transparente pour l'utilisateur. Mais un Reverser verra cela autrement, en visualisant un code ASM (très) différent de la normale.
Un des Packer sans nul doute le plus connu est UPX, qui s'occupe de réduire la taille d'un exécutable de manière très efficace (près de 50%).
Détection de Breakpoint
(À venir)
False Breakpoint
(À venir)
False Disassembly
(À venir)
Polymorphisme
(À venir)
Protection par Cheksum
(À venir)
Détection de Débogueur
(À venir)
Anti Dumping
(À venir)
Les Outils
- Module pefile.py
- Module Pydasm.py
- Immunity Debugger
- PeiD - Analyse des Packers/Crypteur
- LordPE - Éditeur de Fichier PE
- W32Dasm - Désassembleur
- OllyDbg - Le Fameux Débogueur Windows
- ImpRec - Outil de Reconstruction d'IAT
- ResHacker - Éditeur de Ressource
- WinHex - Éditeur Hexadécimale
Voir aussi
Liens externes
Catégories :- Administration Windows
- Format de données numériques
- Programmation informatique
-
Wikimedia Foundation. 2010.