Portable Executable File Format

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
COFF

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 :

PE File Format-FR.PNG

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%).

UPX Ratio.PNG

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

Voir aussi

Liens externes


Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Portable Executable File Format de Wikipédia en français (auteurs)

Игры ⚽ Нужно решить контрольную?

Regardez d'autres dictionnaires:

  • Portable Executable — File Format Le format de fichier PE (Portable Executable File Format) est un format de fichier binaire informatique utilisé pour l enregistrement de code compilé (exécutable, bibliothèques). Il a été développé par Microsoft pour les fichiers… …   Wikipédia en Français

  • Portable Executable — Not to be confused with Portable application. Portable Executable Filename extension .cpl, .exe, .dll, .ocx, .sys, .scr, .drv Developed by Microsoft Type of format Binary, executable, object, shared libraries …   Wikipedia

  • Portable Executable — Переносимый исполняемый файл Расширение .exe, .dll, .ocx, .sys, .scr, .drv, .cpl Сигнатура MZ (опционально), PE Разработан Microsoft Тип формата двоичный, исполняемый, объектный …   Википедия

  • File format — A file format is a particular way that information is encoded for storage in a computer file. Since a disk drive, or indeed any computer storage, can store only bits, the computer must have some way of converting information to 0s and 1s and vice …   Wikipedia

  • Portable Executable — beschreibt ein Binärformat ausführbarer Programme. Es ist das Dateiformat, das bei Win32 und Win64 Systemen für ausführbare Dateien verwendet wird. Es basiert auf dem COFF Binärformat [1]. Mögliche Dateiendungen sind zum Beispiel: .exe –… …   Deutsch Wikipedia

  • Exécutable Windows — Portable Executable File Format Le format de fichier PE (Portable Executable File Format) est un format de fichier binaire informatique utilisé pour l enregistrement de code compilé (exécutable, bibliothèques). Il a été développé par Microsoft… …   Wikipédia en Français

  • Format PE — Portable Executable File Format Le format de fichier PE (Portable Executable File Format) est un format de fichier binaire informatique utilisé pour l enregistrement de code compilé (exécutable, bibliothèques). Il a été développé par Microsoft… …   Wikipédia en Français

  • Comparison of executable file formats — This is a comparison of executable file formats. Explicit processor declarations Arbitrary sections Metadata[vague] Digital signature String table Symbol table 64 bit Fat binaries Can contain icon a.out …   Wikipedia

  • ICO (file format) — ICO Filename extension .ico Internet media type image/vnd.microsoft.icon Uniform Type Identifier com.microsoft.ico Developed by Microsoft Type of format …   Wikipedia

  • Executable and Linkable Format — Infobox file format name = ELF extension = none, .o, .so, .elf mime = owner = Unix System Laboratories genre = Binary, executable, object, shared libraries, core dump container for = contained by = extended from = extended to = In computing, the… …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”