Entete exécutable Win32 (Entête PE)
Publié : jeu. 19/févr./2009 15:00
Salut à tous,
dans le cadre d'un projet perso, je me forme actuellement aux exécutables Windows et à leur structure. En faisant une recherche sur le forum (FR uniquement), je n'ai rien trouvé à ce sujet. Je poste donc un petit code convertit d'un code C++ trouvé sur le net permettant d'afficher l'entête PE d'un EXE.
Ce code est incomplet, il démontre seulement le principe de fonctionnement
dans le cadre d'un projet perso, je me forme actuellement aux exécutables Windows et à leur structure. En faisant une recherche sur le forum (FR uniquement), je n'ai rien trouvé à ce sujet. Je poste donc un petit code convertit d'un code C++ trouvé sur le net permettant d'afficher l'entête PE d'un EXE.
Ce code est incomplet, il démontre seulement le principe de fonctionnement

Code : Tout sélectionner
; --------------------------------------------------------------------------------------
; Auteur C++ : syncppfrance sur cppfrance.com
; Auteur PB : Cls
; Version : Février 2009
; --------------------------------------------------------------------------------------
; Source d'origine: http://www.cppfrance.com/codes/ANALYSE-FORMAT-ENTETE-PE_25561.aspx
; --------------------------------------------------------------------------------------
; Desc : analyse de l'entête d'un fichier executable sous Windows (win32)
;
;- Structures
Structure Misc
PhysicalAddress.l
VirtualSize.l
EndStructure
Structure IMAGE_SECTION_HEADER
Name.l
Misc.Misc
VirtualAddress.l
SizeOfRawData.l
PointerToRawData.l
PointerToRelocations.l
PointerToLinenumbers.l
NumberOfRelocations.w
NumberOfLinenumbers.w
Characteristics.l
EndStructure
;
;- Tableaux
Dim DirectoryLabel.s(15)
DirectoryLabel(0) = "IMAGE_DIRECTORY_ENTRY_EXPORT (0)"
DirectoryLabel(1) = "IMAGE_DIRECTORY_ENTRY_IMPORT (1)"
DirectoryLabel(2) = "IMAGE_DIRECTORY_ENTRY_RESOURCE (2)"
DirectoryLabel(3) = "IMAGE_DIRECTORY_ENTRY_EXCEPTION (3)"
DirectoryLabel(4) = "IMAGE_DIRECTORY_ENTRY_SECURITY (4)"
DirectoryLabel(5) = "IMAGE_DIRECTORY_ENTRY_BASERELOC (5)"
DirectoryLabel(6) = "IMAGE_DIRECTORY_ENTRY_DEBUG (6)"
DirectoryLabel(7) = "IMAGE_DIRECTORY_ENTRY_COPYRIGHT (7)"
DirectoryLabel(8) = "IMAGE_DIRECTORY_ENTRY_GLOBALPTR (8)"
DirectoryLabel(9) = "IMAGE_DIRECTORY_ENTRY_TLS (9)"
DirectoryLabel(10) = "IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG (10)"
DirectoryLabel(11) = "IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (11)"
DirectoryLabel(12) = "IMAGE_DIRECTORY_ENTRY_IAT (12)"
DirectoryLabel(13) = "IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT (13)"
DirectoryLabel(14) = "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR (14)"
DirectoryLabel(15) = "??????? (15)"
;
;- Constantes
#IMAGE_SCN_CNT_CODE = $00000020
#IMAGE_SCN_CNT_INITIALIZED_DATA = $00000040
#IMAGE_SCN_CNT_UNINITIALIZED_DATA = $00000080
#IMAGE_SCN_MEM_SHARED = $10000000
#IMAGE_SCN_MEM_EXECUTE = $20000000
#IMAGE_SCN_MEM_READ = $40000000
#IMAGE_SCN_MEM_WRITE = $80000000
;
;- Début du programme
file.s = OpenFileRequester("Sélectionner un fichier", "", "Executable (*.exe)|*.exe|Tous les fichiers (*.*)|*.*", 0)
If file
If ReadFile(0, file)
Debug "Fichier sélectionné : " + file
DOSHeader.IMAGE_DOS_HEADER
ReadData(0, DOSHeader, SizeOf(IMAGE_DOS_HEADER))
If DOSHeader\e_magic = $5A4D ; "MZ"
; Se rend à l'entête PE
FileSeek(0, DOSHeader\e_lfanew)
PEHeader.IMAGE_NT_HEADERS
ReadData(0, PEHeader, SizeOf(IMAGE_NT_HEADERS))
If PEHeader\Signature = $00004550 ; 00PE
; -----------------------------------------------------------------------------
Debug ""
Debug "[*] PE Header"
Debug "Nombre de sections : " + Str(PEHeader\FileHeader\NumberOfSections)
Debug "Taille du code: " + Str(PEHeader\OptionalHeader\SizeOfCode)
Debug "Taille des donnees initialisees: " + Str(PEHeader\OptionalHeader\SizeOfInitializedData)
Debug "Taille des donnees non initialisees: " + Str(PEHeader\OptionalHeader\SizeOfUninitializedData)
Debug "Adresse du point d'entree dans le fichier: 0x" + Hex(PEHeader\OptionalHeader\AddressOfEntryPoint) + " Memoire: 0x" + Hex(PEHeader\OptionalHeader\AddressOfEntryPoint + PEHeader\OptionalHeader\ImageBase)
Debug "Image base (position en memoire): 0x" + Hex(PEHeader\OptionalHeader\ImageBase)
Debug "Alignement de " + Str(PEHeader\OptionalHeader\SectionAlignment) + " octets pour les sections"
Debug "Alignement de " + Str(PEHeader\OptionalHeader\FileAlignment) + " octets pour le fichier"
Debug "Taille du fichier en memoire: " + Str(PEHeader\OptionalHeader\SizeOfImage)
Debug "Position de la 1ere section ds le fichier: 0x" + Hex(PEHeader\OptionalHeader\SizeOfHeaders)
; -----------------------------------------------------------------------------
Debug ""
Debug "[*] Directory"
For x = 0 To 15
If PEHeader\OptionalHeader\DataDirectory[x]\VirtualAddress <> 0 And PEHeader\OptionalHeader\DataDirectory[x]\Size > 0
Debug "Nom : " + DirectoryLabel(x)
Debug "Adresse virtuelle : " + Hex(PEHeader\OptionalHeader\DataDirectory[x]\VirtualAddress) + " Taille : " + Str(PEHeader\OptionalHeader\DataDirectory[x]\Size)
EndIf
Next
; -----------------------------------------------------------------------------
Debug ""
Debug "[*] Section"
SectionHeader.IMAGE_SECTION_HEADER
For x = 0 To PEHeader\FileHeader\NumberOfSections - 1
sectionName.s
ReadData(0, SectionHeader, SizeOf(IMAGE_SECTION_HEADER))
sectionName.s = PeekS(@SectionHeader\Name)
Debug ""
Debug "Nom de la section : " + sectionName
Debug "Adresse physique: 0x" + Hex(SectionHeader\Misc\PhysicalAddress)
Debug "Taille virtuelle: " + Str(SectionHeader\Misc\VirtualSize) + " (0x" + Hex(SectionHeader\Misc\VirtualSize) + ")"
Debug "Adresse en memoire: 0x" + Hex(SectionHeader\VirtualAddress) + " Reel: 0x" + Hex(PEHeader\OptionalHeader\ImageBase + SectionHeader\VirtualAddress)
Debug "Taille dans le fichier: " + Hex(SectionHeader\SizeOfRawData)
Debug "Adresse dans le fichier: 0x" + Hex(SectionHeader\PointerToRawData)
If SectionHeader\Characteristics & #IMAGE_SCN_CNT_CODE
Debug "Section de code"
EndIf
If SectionHeader\Characteristics & #IMAGE_SCN_CNT_INITIALIZED_DATA
Debug "Section de données"
EndIf
If SectionHeader\Characteristics & #IMAGE_SCN_CNT_UNINITIALIZED_DATA
Debug "Section de données non initialisées"
EndIf
If SectionHeader\Characteristics & #IMAGE_SCN_MEM_SHARED
Debug "Section partagée en mémoire"
EndIf
If SectionHeader\Characteristics & #IMAGE_SCN_MEM_EXECUTE
Debug "Section exécutable"
EndIf
If SectionHeader\Characteristics & #IMAGE_SCN_MEM_READ
Debug "Section en lecture"
EndIf
If SectionHeader\Characteristics & #IMAGE_SCN_MEM_WRITE
Debug "Section en écriture"
EndIf
Next
Else
Debug "Ce fichier n'est pas un éxecutable PE (win32 valide)"
EndIf
Else
Debug "Ce fichier n'est pas au format DOS"
Goto CloseFileAndQuit
EndIf
Goto CloseFileAndQuit
Else
Debug "Fichier introuvable"
EndIf
EndIf
; Fin
End
CloseFileAndQuit:
CloseFile(0)
End