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