PE File Format

Le PE Header


PE File Format

Avant propos

De plus en plus il arrive que des protections renforcées "s'amusent" avec le PE Header, les tables d'Import, etc...

Loin de vouloir faire un tour exhaustif de la question, le texte qui suit se veut juste une introduction à la comprehension de l'architecture du PE HEADER.


Le PE HEADER répond à une architecture de ce type:

Dos-Stub
 
 
 
File-Header
 
 
 
Optional Header
 
 
 
Data Directories
 
 

RVA's to directories in sections

Sections headers
 
 

RVA's to section borders

Section 1
 
 
 
...
 
 
 
Section n
 

L'exemple de Notepad.exe (version Win 95)

Le PE HEADER commence en 0x00 par la compatibilité MS-DOS: le MZ Header:

00000000 4D5A 9000 0300 0000 0400 0000 FFFF 0000 MZ..............
00000010 B800 0000 0000 0000 4000 0000 0000 0000 ........@.......
00000020 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030 0000 0000 0000 0000 0000 0000 8000 0000 ................
00000040 0E1F BA0E 00B4 09CD 21B8 014C CD21 5468 ........!..L.!Th
00000050 6973 2070 726F 6772 616D 2063 616E 6E6F is program canno
00000060 7420 6265 2072 756E 2069 6E20 444F 5320 t be run in DOS
00000070 6D6F 6465 2E0D 0D0A 2400 0000 0000 0000 mode....$.......

MZ Header

WORD e_magic;      > Nombre Magique ( 4D5A ) 
WORD e_cblp;       > Bytes on last page of file 
WORD e_cp;         > Pages in file 
WORD e_crlc;       > Relocations 
WORD e_cparhdr;    > Size of header in paragraphs 
WORD e_minalloc;   > Minimum extra paragraphs needed 
WORD e_maxalloc;   > Maximum extra paragraphs needed 
WORD e_ss;         > Initial (relative) SS value 
WORD e_sp;         > Initial SP value 
WORD e_csum;       > Checksum 
WORD e_ip;         > Initial IP value 
WORD e_cs;         > Initial (relative) CS value 
WORD e_lfarlc;     > File address of relocation table 
WORD e_ovno;       > Overlay number 
WORD e_res[4];     > Reserved words 
WORD e_oemid;      > OEM identifier (for e_oeminfo) 
WORD e_oeminfo;    > OEM information; e_oemid specific 
WORD e_res2[10];   > Reserved words 
DWORD e_lfanew;    > File address of new exe header 
Address     Values     Meaning

00000000     5A4D    Signature: MZ
00000002     0090    Extra Bytes
00000004     0003    Pages
00000006     0000    Reloc Items
00000008     0004    Header Size
0000000A     0000    Min Alloc
0000000C     FFFF    Max Alloc
0000000E     0000    Initial SS
00000010     00B8    Initial SP
00000012     0000    Check Sum
00000014     0000    Initial IP
00000016     0000    Initial CS
00000018     0040    Reloc Table
0000001A     0000    Overlay


Le premier champ, e_magic est aussi appelé magic number.Ce champ est utilisé pour identifier un type de fichier compatible MS-Dos. Tous les exécutables compatibles MS-Dos placent cette valeur à 0x54AD, qui représente le caractère ASCII "MZ". Le champ le plus important pour Windows est le dernier: e_lfanew, indiquant à quel offset le PE Header est situé.

PE File Header:

00000080 5045 0000 4C01 0600 8D54 F32F 0000 0000 PE..L....T./....
00000090 0000 0000 E000 0E01                     ........

WORD   Machine Type                        ( 014C ) i386
WORD   Nombre de Sections                  ( 0006 ) 
DWORD  Time/Date                           ( 2FF3548D ) 
DWORD  Pointeur vers la table des Symboles ( 00000000 ) 
DWORD  Nombre de Symboles                  ( 00000000 ) 
WORD   Taille de l'Optional Header         ( 00E0 ) 
WORD   Caracteristiques                    ( 010E )
Address      Values        Meaning
00000080    00004550     Signature: PE
00000084        014C     Machine: 014C=I386
00000086        0005     Number of Sections
00000088    2FF3548D     Time/Date Stamp
0000008C    00000000     Pointer to Symbol Table
00000090    00000000     Number of Symbols
00000094        00E0     Optional Header Size
00000096        010E     Characteristics

PE Optional Header:

Informations données par un éditeur hexadécimal
00000090                     0B01 0232 003A 0000         ...2.:..
000000A0 004E 0000 0006 0000 0010 0000 0010 0000 .N..............
000000B0 0050 0000 0000 4000                     .P....@.
Informations données par ProcDump
Header lnfos
Entry Point :   00001000
Size of image : 0000D000
Image Base :    00400000

WORD    Magic                   ( 010B ) 
BYTE    MajorLinkerVersion      ( 02 ) 
BYTE    MinorLinkerVersion      ( 32 ) 
DWORD   SizeOfCode              ( 00003A00 ) 
DWORD   SizeOfInitializedData   ( 00004E00 ) 
DWORD   SizeOfUninitializedData ( 00000600 ) 
DWORD   AddressOfEntryPoint     ( 00001000 ) 
DWORD   BaseOfCode              ( 00001000 ) 
DWORD   BaseOfData              ( 00005000 )
DWORD   ImageBase               ( 00004000 )
000000B0                     0010 0000 0002 0000         ........
000000C0 0100 0000 0000 0000 0400 0000 0000 0000 ................
000000D0 00D0 0000 0004 0000 197B 0100 0200 0000 .........{......
000000E0 0000 1000 0010 0000 0000 1000 0010 0000 ................
000000F0 0000 0000 1000 0000                     ........
SectionAlignment            00 10 00 00 ; 16-bytes-alignment
FileAlignment               00 20 00 00 ; 32-bytes-alignment
MajorOperatingSystemVersion 01 00       ; 
MinorOperatingSystemVersion 00 00       ;
MajorImageVersion           00 00       ; version 0.0
MinorImageVersion           00 00       ;
MajorSubsystemVersion       04 00       ; Win32 4.0
MinorSubsystemVersion       00 00       ;
Win32VersionValue           00 00 00 00 ; 
SizeOfImage                 00 D0 00 00 ; checksum
SizeOfHeaders               00 04 00 00 ; offset de la première section
CheckSum                    19 7B 01 00 ; non utilisé pour les non-drivers
Subsystem                   02 00       ; Win32 console
DllCharacteristics          00 00       ; inutilisé (pas une DLL)
SizeOfStackReserve          00 00 10 00 ; 1 MB stack
SizeOfStackCommit           00 10 00 00 ; 4 KB pour démarrer
SizeOfHeapReserve           00 00 10 00 ; 1 MB heap
SizeOfHeapCommit            00 10 00 00 ; 4 KB to start with
LoaderFlags                 00 00 00 00 ; 
NumberOfRvaAndSizes         10 00 00 00 ; constant

A noter que l'alignement des sections n'est pas identique en RAM et sur le DD

Informations données par un éditeur hexadécimal

000000F0 0000 0000 1000 0000 0000 0000 0000 0000 ................
00000100 0070 0000 9A0C 0000 0080 0000 C830 0000 .p...........0..
00000110 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000120 00C0 0000 F407 0000 0000 0000 0000 0000 ................
00000130 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000140 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000150 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000160 0000 0000 0000 0000 0000 0000 0000 0000 ................

Informations données par procdump:

PE directory informations (HEX)

Export Table
Import Table
Resource
Exception
Security
Relocations
Debug Datas
Description
GIobal PTR
TLS table
Load Config
Bound Import
Import Address Table

RVA
00000000
00007000
00008000
00000000
00000000
0000C000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

Size
00000000
00000C9A
000030C8
00000000
00000000
000007F4
00000000
00000000
00000000
00000000
00000000
00000000
00000000

Section Header

00000170 0000 0000 0000 0000 2E74 6578 7400 0000 .........text...
00000180 5339 0000 0010 0000 003A 0000 0004 0000 S9.......:......
00000190 0000 0000 0000 0000 0000 0000 2000 0060 ............ ..`
000001A0 2E62 7373 0000 0000 3A04 0000 0050 0000 .bss....:....P..
000001B0 0001 0000 0000 0000 0000 0000 0000 0000 ................
000001C0 0000 0000 8000 00C0 2E64 6174 6100 0000 .........data...
000001D0 1202 0000 0060 0000 0004 0000 003E 0000 .....`.......>..
000001E0 0000 0000 0000 0000 0000 0000 4000 00C0 ............@...
000001F0 2E69 6461 7461 0000 9A0C 0000 0070 0000 .idata.......p..
00000200 000E 0000 0042 0000 0000 0000 0000 0000 .....B..........
00000210 0000 0000 4000 0040 2E72 7372 6300 0000 ....@..@.rsrc...
00000220 0040 0000 0080 0000 0032 0000 0050 0000 .@.......2...P..
00000230 0000 0000 0000 0000 0000 0000 4000 0040 ............@..@
00000240 2E72 656C 6F63 0000 1E09 0000 00C0 0000 .reloc..........
00000250 000A 0000 0082 0000 0000 0000 0000 0000 ................
00000260 0000 0000 4000 0042 0000 0000 0000 0000 ....@..B........
BYTE    Name[IMAGE_SIZEOF_SHORT_NAME]  ( 2E74 6578 7400 )
DWORD   PhysicalAddress 
DWORD   VirtualSize                    ( 5339 0000 )
DWORD   VirtualAddress                 ( 0010 0000 )
DWORD   SizeOfRawData                  ( 003A 0000 ) 
DWORD   PointerToRawData               ( 0004 0000 ) 
DWORD   PointerToRelocations
DWORD   PointerToLinenumbers 
WORD    NumberOfRelocations 
WORD    NumberOfLinenumbers 
DWORD   Caracteristiques               ( 2000 0060 ) -> 60000020
Informations données par Procdump:
Sections lnformations :

 Name  Virtual Size  Virtual Off   Raw Size    Raw Offset Characterics
.text    00003953     00001000     00003A00     00000400    60000020
.bss     0000043A     00005000     00000100     00000000    C0000080
.data    00000212     00006000     00000400     00003E00    C0000040
.idata   00000C9A     00007000     00000E00     00004200    40000040
.rsrc    00004000     00008000     00003200     00005000    40000040
.reloc   0000091E     0000C000     00000A00     00008200    42000040

Les caractéristiques:

  Valeur              Definition

  0x00000020          Code section
  0x00000040          Initialized data section
  0x00000080          Uninitialized data section
  0x04000000          Section cannot be cached
  0x08000000          Section is not pageable
  0x10000000          Section is shared
  0x20000000          Executable section
  0x40000000          Readable section
  0x80000000          Writable section
(pour plus de détails voir  "caractéristiques du PE Header")

Notez qu'il y a une Section Header par section; "Thus". Pour le PE Header de Notepad.exe, il y aura 06 Sections Headers. Chaque section contient son nom en ASCII (ex: ".text") et un pointeur vers son emplacement; les headers ont une taille de 40 octets et il n'y a pas de "padding" entre eux. Les sections qui sont habituellement présentes dans un exécutable sont (sans être obligaoire):

Executable Code Section:   .text 
Data Sections:             .data, .rdata, ou .bss 
Resources Section:         .rsrc 
Export Data Section:       .edata 
Import Data Section:       .idata 
Debug Information Section: .debug

Exécutable code section: .text
Cette section contient le code du programme

Data sections: .bss, .rdata, .data
Il y a trois types de sections data:
.bss, qui contient des "uninitialized data" (incluant toutes les variables déclarées et fixes), .rdata, qui contient les "read-only datas" (comme les strings, et les constantes), et .data, qui contient les variables globales ou le programme. Ces sections n'ont pas de réelle structure.

Ressources section: .rsrc
La section .rsrc contient toutes les ressources de l'application. Les 16 premiers octets de la section .rsrc contiennent les Ressources du "Directory Header":

 Resource Directory 
 DWORD    Caracteristiques 
 DWORD    TimeDateStamp 
 WORD     MajorVersion 
 WORD     MinorVersion 
 WORD     NumberOfNamedEntries 
 WORD     NumberOfIdEntries  

Qui est immédiatement suivie par le nombre d'entrées spécifiées dans NumberOfNamedEntries + NumberOfIdEntries:

 Resource Directory Entry 
 DWORD    Name; 
 DWORD    OffsetToData;  

Le Nom d'une entrée du Directory détermine le type de la ressource, pendant que l'Offset pointe vers une autre "Ressource Directory Entry" (la structure habituelle est une Ressource Directory contenant la Ressource type pointée par une Ressource Directory (ou subdirectory) contenant la Resource ID # et pointant vers l'entrée des Ressources Datas), ou vers l'entrée d'une Ressource Data:

 Resource Data Entry 
 DWORD   OffsetToData; 
 DWORD   Size; 
 DWORD   CodePage; 
 DWORD   Reserved;  

L'entrée de "Resource Data" contient la taille de l'actuelle Ressource data, qui sera à terme une "unicode string" pour la String Table, et l'image binaire pour une bitmap, ou une liste de valeurs et de strings pour une boite de dialogue. L'information sur le format du contenu de la ressource binaire peut être trouvée dans "Micro$oft's Win32 Binary Resource Formats.".

La section Export data: .edata
La section .edata contient les "exported data" et les fonctions pour une application ou une librairie (.DLL). La section commence avec le "Export Directory":

 Export Directory 
 DWORD   Characteristics; 
 DWORD   TimeDateStamp; 
 WORD    MajorVersion; 
 WORD    MinorVersion; 
 DWORD   Name; 
 DWORD   Base; 
 DWORD   NumberOfFunctions; 
 DWORD   NumberOfNames; 
 DWORD   *AddressOfFunctions; 
 DWORD   *AddressOfNames; 
 WORD    *AddressOfNameOrdinals;  

Les trois derniers champs contiennent les pointeurs vers la liste des points d'entré (Entry points) des fonctions exportées, la liste des noms des fonctions "null-seperated", et la liste des valeurs ordinales des fonctions. Ces pointeurs sont opérationnels quand le programme est chargé en mémoire.

Import data section: .idata
Cette section contient la liste des fonctions importées dans le programme. Elle commence avec l'Import Directory:

Import Directory 
 DWORD    dwRVAFunctionNameList; 
 DWORD    dwUseless1; 
 DWORD    dwUseless2; 
 DWORD    dwRVAModuleName; 
 DWORD    dwRVAFunctionAddressList;  

Les deux derniers champs sont répétés pour chaque application ou librairie que le programme importe. Dans un éditeur hexadécimal vous pourrez voir en premier le nom de la section d'un module donné, le nom du module, puis toutes les fonctions importées par ce module.
La liste des imports est répétée jusqu'à une entrée nulle.

A lire: Import Data-Import Table Tutorial by el.CaRaCoL


Relative Virtual Addresses

La RVA (Relative Virtual Address) est utilisée pour décrire une adresse mémoire si vous ne connaissez pas l'adresse base. C'est la valeur qui additionnée à l'adresse base va vous donner l'adresse réelle telle que vous pourrez la lire dans un débuggeur ou un désassembleur.

Exemple: supposez qu'un fichier exécutable soit chargé à l'adresse 0x400000 et que son exécution démarre à RVA 0x1560. L'adresse de l'Entry Point de l'exécutable sera en 0x401560. Si l'exécutable était chargé en 0x100000, l'Entry Point se situerait en 0x101560.

Les choses commencent à se compliquer un peu si les sections ne sont pas alignées. Les sections d'un fichier sont souvent alignées sur 512 octets, mais l'image chargée peut être alignées sur 4096 octets...

Aussi, pour trouver une adresse RVA précise dans un fichier PE, vous devrez calculer l'offset d'où le programme sera chargé.

La section Debug information: .debug
Cette section contient les informations de débuggage du programme, si le compilateur utilisé le permettait. Elle commence par un "Debug Directory":

Debug Directory
DWORD   Characteristics 
DWORD   TimeDateStamp 
WORD    MajorVersion 
WORD    MinorVersion 
DWORD   Type 
DWORD   SizeOfData 
DWORD   AddressOfRawData 
DWORD   PointerToRawData 

Modification du PE Header:
Puisque le PE Header donne l'adresse de départ et la taille de chacune de ses différentes sections (et c'est le cas de la section .rsrc, la taille des datas), il est facile de modifier le contenu du PE Header en ajustant l'offset du champ de chaque section suivant ce qui doit être modifié. Pour ajouter du code supplémentaire vous pouvez agrandir la section .text mais vous aurez à corriger chacune des sections suivantes; pour ajouter ou changer des ressources, il faudra modifier chaque subdirectory de la section .rsrc et corriger toutes les sections qui viennent après (c'est ainsi que Borland Resources Windows et les éditeurs de ressources travaillent). Du coup il semble plus facile, plutôt que de modifier chacune des sections, de ne s'occuper que de la dernière d'entre elles en l'agrandissant (ce qui au passage modifiera la taille de l'application). Pourtant c'est la meilleurs et la plus rapide des méthodes.

A lire: Agrandir une section par Nody
           Agrandir une section par TeeJi


Caractéristiques des sections


Voici quelques explications rapides et très succinctes sur les attributs des sections:
================
0x20...... : signifie eXecutable
0x40...... : signifie Readable
0x80...... : signifie Writeable

exemple 0x60.. -> eXecutable + Readable
0x60... -> R-X-.
0xC0... -> R-.-W
0xE0... -> R-X-W
=================
0x......20 : signifie contains Code
0x......40 : signifie Initialized data
0x......80 : signifie Unitialized data

0x......40 : la plupart des sections peuvent avoir cette valeur excepté les sections CODE et .BSS
=================
Pour en savoir plus il existe un bon article récupéré sur Microsoft.com appelé "
PEERING INSIDE the PE" écrit en mars 94 par Matt Pietrek (qui travaille ou a travaillé chez.. chez... devinez: NU-MEGA TECHNOLOGIES INC.)

(contribution de Neutral AtomX)

Et pour ceux qui souhaitent plus de détails (extrait de Advanced Registry Tracer de Psyché)

// Section characteristics.

#define IMAGE_SCN_TYPE_NO_PAD                0x00000008 // Reserved.
#define IMAGE_SCN_CNT_CODE                   0x00000020 // Section contains code.
#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040 // Section contains initialized data.
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080 // Section contains uninitialized data.
#define IMAGE_SCN_LNK_OTHER                  0x00000100 // Reserved.
#define IMAGE_SCN_LNK_INFO                   0x00000200 // Contains comments or some other  info
#define IMAGE_SCN_LNK_REMOVE                 0x00000800 // Contents will not become part of image.
#define IMAGE_SCN_LNK_COMDAT                 0x00001000 // Section contents comdat.
#define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000 // Reset speculative exceptions handling
#define IMAGE_SCN_GPREL                      0x00008000 // Section content can be accessed  to GP
#define IMAGE_SCN_MEM_FARDATA                0x00008000
#define IMAGE_SCN_MEM_PURGEABLE              0x00020000
#define IMAGE_SCN_MEM_16BIT                  0x00020000
#define IMAGE_SCN_MEM_LOCKED                 0x00040000
#define IMAGE_SCN_MEM_PRELOAD                0x00080000
#define IMAGE_SCN_ALIGN_1BYTES               0x00100000 
#define IMAGE_SCN_ALIGN_2BYTES               0x00200000 
#define IMAGE_SCN_ALIGN_4BYTES               0x00300000 
#define IMAGE_SCN_ALIGN_8BYTES               0x00400000 
#define IMAGE_SCN_ALIGN_16BYTES              0x00500000 // Default alignment if no others specified.
#define IMAGE_SCN_ALIGN_32BYTES              0x00600000 
#define IMAGE_SCN_ALIGN_64BYTES              0x00700000 
#define IMAGE_SCN_ALIGN_128BYTES             0x00800000 
#define IMAGE_SCN_ALIGN_256BYTES             0x00900000 
#define IMAGE_SCN_ALIGN_512BYTES             0x00A00000 
#define IMAGE_SCN_ALIGN_1024BYTES            0x00B00000 
#define IMAGE_SCN_ALIGN_2048BYTES            0x00C00000 
#define IMAGE_SCN_ALIGN_4096BYTES            0x00D00000 
#define IMAGE_SCN_ALIGN_8192BYTES            0x00E00000 
#define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000 // Section contains extended relocations.
#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000 // Section can be discarded.
#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000 // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000 // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED                 0x10000000 // Section is shareable.
#define IMAGE_SCN_MEM_EXECUTE                0x20000000 // Section is executable.
#define IMAGE_SCN_MEM_READ                   0x40000000 // Section is readable.
#define IMAGE_SCN_MEM_WRITE                  0x80000000 // Section is writeable.

"Nous allons avoir besoin de ProcDump ici pour nous donner l'Entry Point en virtual offset de ART.
Lancer Pdump => PE Editor => charger ART.EXE => Entry Point : 499B9 (ceci est le virtual offset, bref c'est l'offset en mémoire et si vous voulez connaître l'adresse, vous ajoutez l'Image Base = 400000, ce qui nous donne 4499B9 comme Entry Point en mémoire).
Pourquoi fait-on ça ? Pour savoir dans quelle section se trouve l'Entry Point.
Allez maintenant dans SECTION et regardez la colonne " virtual offset ".
499B9 se trouve dans .CODE car 499B9 est > 1000 (le début de la section .CODE) et est < 86000 (le début de la section .DATA).
Voilà une bonne chose … maintenant regardons les attributs de la section .CODE
Cliquez avec le bouton de droite de la souris sur CODE (colonne NAME toujours dans ProcDump of course ) et choisissez EDIT.
En bas, à droite se trouvent les " Section Characteristics " (= les attributs) qui valent : C00000040 qui, si on se réfèrent à notre tableau ci-dessus veut dire : readable (40000000 => accès en lecture) + writable (80000000 => accès en écriture => c'est typique des exe compressés, les programmes habituels protègent leur code en ne permettant pas l'écriture DANS le code, contrairement à la section DATA où on peut lire et écrire) + Init Data (00000040) = C0000040.
Si vous regardez de plus près la liste, vous découvrirez deux choses intéressantes : 20000000 (exécutable) et 00000020 (contient du code).
Maintenant, si on disait que notre section doit être 20000000 + 40000000+ 80000000 + 00000020 = E00000020 ?
Changeons C0000040 en E0000020 et quittons ProcDump.
Essayez maintenant de désassembler ART.EXE avec Wdasm … vi vi ça marche !
Cliquons sur l'icône PEP et on arrive à l'Entry Point (4499B9), allez sur cette ligne et vous verrez tout en-bas @48DB9 (vous savez bien, le truc que vous regardez pour savoir où patcher …) et bien c'est le " raw Offset ".


La même chose vue sous l'angle de TeeJi

Chaque caractéristique à une valeur. Si vous voulez avoir deux caractéristiques, vous faites : caract1 OR caract2 ...
Donc, pour que Softice break à l'entrypoint, il faut que la section qui contient la première instruction ait les caractéristiques suivantes :

   0x00000020 IMAGE_SCN_CNT_CODE 
   0x20000000 IMAGE_SCN_MEM_EXECUTE 
   0x40000000 IMAGE_SCN_MEM_READ 
OR 0x80000000 IMAGE_SCN_MEM_WRITE 
----------------------------------- 
   0xE0000020 
Et généralement, pour empêcher le break et le désassemblage de la section, on met les caractéristiques suivantes : 
       0x00000040 IMAGE_SCN_CNT_INITIALIZED_DATA 
   0x40000000 IMAGE_SCN_MEM_READ 
OR 0x80000000 IMAGE_SCN_MEM_WRITE 
-------------------------------------------- 
   0xC0000040 

Maintenant que l'on connait les caractéristiques à changer, il nous faut savoir quelle section contient l'entrypoint. Pour cela :
· Lancer ProcDump ( ou n'importe quel Editeur de PE )
· Clicker sur [PE Editor]
· Choisir le fichier compressé ( ou celui dont on veux modifier les caractéristiques )
· Regarder la valeur de l'entry point
· Cliquer sur [Section]
· Regarder la colonne des Virtual Offset
· Et la section qui contient l'Entry Point est celle qui commence avant l'entrypoint et qui est le plus proche de celui-ci.
· Vous cliquez sur la section avec le bouton droit et vous sélectionné Edit Section
· et dans les caractéristiques vous mettez E0000020
· OK / OK / FIN

D’autres explications (extrait de Awave 5.0 de CyberBobJr)

" Arrivé à ce niveau, il est nécessaire de savoir comment fonctionne (vaguement ;) le format PE ...
Il faut savoir qu’un programme est divisé en sections, et chaque section possède une entrée dans le PE Header, ca veut dire que le code de décryptage possède une section dans le PE Header, ProcDump nous permet d’avoir les détails de cette section : "

 

Virtual size

Virtual Offset

Raw size

Raw Offset

.data

00002000

000DF000

00001400

00050A00

" La taille virtuelle de notre code est 2000, ce qui veut dire qu'en RAM, la mémoire allouée pour notre code est de taille 0x2000 octets, ce qui toujours un multiple de la page (en particulier içi 0x1000), en effet, la mémoire allouée doit toujours être multiple de l'offset virtuel de la section CODE.
L'offset virtuel de notre code est de 000DF000, additionné à l'image de base (00400000), ca nous donne une adresse virtuelle de 004DF000 (et comme par hasard, cette adresse nous mène droit vers l'EIP du programme ? en l'occurence Awave 5.0).
La taille sur disque (Raw Size) est de 0x1400, ce qui veut dire que le code n'utilise que 0x1400 octets dans le fichier .exe.
L'offset sur disque (Raw Offset) est de 00050A00, autrement dit le code s'étale sur le disque de l'offset 0050A00 jusqu'a (0050A00+1400)=0051E00 ".


Et celles de Brénuche dans Adanced Zip Password revovery

Name    VirtualSize  VirtualOffset Raw Size Raw Offset Characteristics
.text     000AF000     00001000    0004AA00  00000600   C0000040
.data     0004B000     000B0000    00003E00  0004B000   C0000040
.tls      00001000     000FB000    00000200  0004EE00   C0000040
.rdata    00001000     000FC000    00000200  0004F000   C0000040
.idata    00003000     000FD000    00001200  0004F200   C0000040
.edata    00016000     00100000    00015800  00050400   C0000040
.rsrc     00044000     00116000    00020A00  00065C00   C0000040
.reloc    0000D000     0015A000    00000000  00086600   C0000040
.adata    0000F000     00167000    0000E200  00086600   C0000040
.udata    00001000     00176000    00000000  00094800   C0000040

" ProcDump32 affiche les sections du fichier dans l'ordre (cad par rapport à leur offset). La taille virtuelle (virtual) des sections correspond au code réel, celui qui sera en mémoire. Tandis que la taille brute (raw) correspond à l'espace pris par cette section sur le disque dur (c'est ces données qui nous intéressent). Notez au passage que la taille virtuelle est beaucoup plus grande que la taille brute, (compte tenu que le code décompressé doit être écris dans la même section que celle qui contient le code compressé, cette section doit être grande en mémoire mais petite sur disque ) Ca, c'est le propre des exe compressés. "

Christal.