Compréhension des fichiers PE.

Résolu
cs_Adeon Messages postés 293 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 10 avril 2015 - 31 janv. 2009 à 20:07
cs_Adeon Messages postés 293 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 10 avril 2015 - 3 févr. 2009 à 10:59
Bonjour à tous !

Je suis en train de me mettre à la décompilation. Je commence à comprendre les fichiers PE, le langage ASM ( que je ne connaissais pas avant ) ainsi que sa conversion en langage machine.

J'ai maintenant un petit détail qui me turlupine !

En effet,
- avec Visual studio, je crée une simple console qui ne fait rien.
- J'étudie ( avec un simple prog d'ouverture d'un fichier en Hexa ) le .exe créé ( au format PE, bien sure )
- je me rend compte, en étudiant le Header de section, que j'ai 1 section qui a son paramètre Raw Offset à 0x00004000
- J'en conclu ( corrigez-moi bien si je me trompe ! ) que le programme commence à l'adresse 0x00004000.

voila le début ( à partir de l'adresse 0x00004000 ) de mon .exe :
CC
CC
CC
CC
E9 C6 0A 00 00
E9 61 0B 00 00
...

- Sous Visual, j'active le debugger de mon programme pour mieu voir ce qui ce passe, voila ce que je lis :

009D1001 CC               int         3     ( Je présume que
009D1001 correspond a une adresse dans la RAM )

009D1002 CC               int         3   
009D1003 CC               int         3   
009D1004 CC               int         3   
009D1005 E9 C6 0A 00 00   jmp         _setdefaultprecision (9D1AD0h)  ( on remarque bien les instructions hexa de mon .EXE ! )

009D100A E9 61 0B 00 00   jmp         _setargv (9D1B70h)
009D100F E9 46 22 00 00   jmp         DebugBreak (9D325Ah)
009D1014 E9 47 09 00 00   jmp         _RTC_GetErrDesc (9D1960h)
..... beacoup ( 87 ) de JMP faisant appelle a des fonctions de windows ( je pense ) .....
009D11AE E9 7F 0F 00 00   jmp         _initterm_e (9D2132h)
009D11B3 E9 58 08 00 00   jmp         _RTC_GetErrorFunc (9D1A10h)
009D11B8 CC               int         3   
009D11B9 CC               int         3    
..... beaucoup de CC .....
009D136D CC               int         3   
009D136E CC               int         3   
009D136F CC               int         3   
--- c:\users\richard\desktop\consol_asup\consol_asup\main.cpp ------------------
-----ET ENFIN ON ARRIVE A MON PROGRAMME QUE J'AI ECRIS
     1:
     2: int main()
     3: {
009D1370 55               push        ebp 
009D1371 8B EC            mov         ebp,esp
009D1373 81 EC C0 00 00 00 sub         esp,0C0h
009D1379 53               push        ebx 
009D137A 56               push        esi 
009D137B 57               push        edi 
009D137C 8D BD 40 FF FF FF lea         edi,[ebp-0C0h]
009D1382 B9 30 00 00 00   mov         ecx,30h
009D1387 B8 CC CC CC CC   mov         eax,0CCCCCCCCh
009D138C F3 AB            rep stos    dword ptr es:[edi]
    17:     return 0;
009D138E 33 C0            xor         eax,eax
    18: }
009D1390 5F               pop         edi 
009D1391 5E               pop         esi 
009D1392 5B               pop         ebx 
009D1393 8B E5            mov         esp,ebp
009D1395 5D               pop         ebp 
009D1396 C3               ret             
--- No source file -------------------------------------------------------------
009D1397 CC               int         3   
009D1398 CC               int         3   
... beacoup de CC ....
....et apres des fonctions de windows qui sont appelées par l'instruction RET ( si je me trompe pas )...

Bon et bien voila un peu comment je procéde ! J'aimerai donc savoir :
- si il n'y a pas d'erreurs dans tout mon résonement
- pourquoi, lorsque je lance le debugger, il me met la première étape sur le 009D1370   55               push        ebp  ?? alors que mon programme devrait commencer à
009D1005 E9 C6 0A 00 00   jmp         _setdefaultprecision (9D1AD0h)  !! Qui correspond à l'adresse 0x00004000

Je vous remercie.
__________________
Adeon, programmeur de jeux sur directX 9 (http://theolith.com) à votre service !

2 réponses

ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
2 févr. 2009 à 23:00
Le linker rajoute des instructions avant le programme utilisateur.
Ce code rajouté a pour effet de décaler l'adresse de départ et pour rôle de finir l'intallation de l'executable.Apres pour tout comprendre,il faut étudier le loader (chargeur).
3
cs_Adeon Messages postés 293 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 10 avril 2015 2
3 févr. 2009 à 10:59
ok impécable, je pense avoir trouvé des articles intéressants sur le Loader, je te remercie, tu m'as bien donné le mot clef que je recherchais :D

++

______________________
Adeon, programmeur de jeux sur directX 9 (http://theolith.com) à votre service !
0
Rejoignez-nous