cs_Adeon
Messages postés293Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention10 avril 2015
-
31 janv. 2009 à 20:07
cs_Adeon
Messages postés293Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention10 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 !
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 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).