IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

[x64] Prologue/Épilogue - informations et/ou source code


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Par défaut [x64] Prologue/Épilogue - informations et/ou source code
    Bonjour,

    Je cherche des informations précises (avec quelques exemples) sur le moyen d'écrire un PROLOGUE/EPILOGUE pour Jwasm ou ml64.
    Les explications de Windows, même en français, manquent de précision.

    Merci pour la réponse.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu as déjà regardé ce lien: https://msdn.microsoft.com/en-us/library/tawsa7cb.aspx ?

    Si oui qu'est-ce que tu n'as pas compris ? Enfin je pense que ce n’est pas ça le problème ^^

    Tu cherches à faire des macros pour automatiser ce processus ? et faire ta propre ABI en chemin ^^

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Par défaut
    Pour être plus précis:
    J'utilise un petit proc utilisant rsp comme pointeur de frame,en repérant les adresses (rsp+X)
    générées par le compilateur cela me donne une idée des progrès a faire (nombreux).
    OPTION PROLOGUErologue64 ;
    OPTION EPILOGUE:Epilogue64 ;Epilogue64 ;rbpFrameEpilogue ;StdEpilogue
    .LISTALL
    aTestProc PROC uses rax hwnd:HWND,uMsg:UINT,wParam: WPARAM,lParam:LPARAM,pilearg:QWORD
    LOCAL retour:QWORD ,child:HWND,Hfen:HWND,rien :QWORD
    int 3
    ;push rax ;rsp +8
    ;pop rax ;rsp -8
    mov r10,prologrsp
    sub r10,rsp ;48h
    mov r11,gardesrp
    mov r10,rsp
    sub r11,r10
    mov rax,pilearg ;------------------- 68h
    mov rax,wParam ;rsp +58h ;+38h ori-- -------- 58h
    mov rax,hwnd ;rsp+48h ;+28h ori-- -------- 48h
    mov rax,rien ;------------------- 38h
    mov retour,90h ;--------- ---------20h

    ret
    aTestProc endp
    .NOLIST
    OPTION PROLOGUErologueDef
    OPTION EPILOGUE:EpilogueDef
    Içi la macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Prologue64 MACRO procname, flags, parambytes, localbytes, reglist, userparms:VARARG
     
    	local Pointprologue
    	;position depart rsp pointe adresse de retour 
    	;dans l'ordre croissant des adresses on trouve
    	;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    	;********** return adress ;rsp point here at the start of the prologue,rsp = rsp -8 after push ******  
    	;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@	
    	;		R9  save place if needed
    	;		R8  save place if needed		;size 20h
    	;		rdx save place if needed
    	;		rcx save place if needed
    	;
    	;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    	;		Stack parameter Area if Number of arguments > 4 ;number of bytes ?
    	;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@	
     
    	ECHO aPROLOGUE
    	mov rax,rsp
    	mov prologrsp,rax;qword ptr [rsp]
    	;----------------------- option ---------------------------
    	;save rcx,rdx,r8,r9 and made them accessible by there name
    	mov [rsp+8],rcx
    	mov [rsp+10h],rdx
    	mov [rsp+18h],r8
    	mov [rsp+20],r9	
    	distanceRsp=0	;reserve one qword after call
     
    	VISU AUSER,userparms
     
    	;--------------------------------------------------------------
    	;--------- space for push if needed -------------------------
    	PushCount=0
    	FOR reg,reglist
    		PushCount=PushCount +1
    	ENDM
    	IF PushCount GT 0
    		FOR reg,reglist
    			VISU NombrePush,reg
    			distanceRsp=distanceRsp+8
    			;.savereg reg,distanceRsp
    		ENDM
    	ENDIF	
    	;--------- space for locales ---------
    	distanceRsp=distanceRsp+localbytes
    	;------- space for next function ???????? 20h ------------------
    	distanceRsp=distanceRsp+18h
    	;------------ locales -------------------------------------------
    	VISU distance,%distanceRsp	
    	sub rsp,distanceRsp
     
     
    	IF PushCount GT 0
    		FOR reg,reglist
    			push reg
    			distanceRsp=distanceRsp-8			
    			VISU rien,reg
    			;.savereg reg,distanceRsp
    		ENDM	
    	ENDIF	
    		;.ENDPROLOG
    	EXITM <20h>
    ENDM
    Voila première surprise la macro tient compte de la valeur de EXITM pour positionner les locals.

    C'est pour cela que des informations un peu plus précises me serait utiles.
    Les pages de Microsoft restent dans le discours et n'hésite pas a tromper,exemples:
    https://msdn.microsoft.com/fr-fr/lib...v=vs.120).aspx
    En se servant d'un debugger,il n'y a qu'a inverser le tableau,le bas en haut, et tout est juste.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Petit conseil en tant que créateur aussi de prologue/épilogue x64.

    Ne te base surtout pas sur des ABI existant (enfin c'est plus compliqué que ça ), fait appel à ton imagination, c'est vrais quand la forme-t-il n'y a pas 36 solutions, mais dans le fond oui, énormément, j'entends par là, sa structure, ses optimisations, sa cohérence, sa faciliter de compréhension, son unicité xD

    Bref j'en oublie surement, par exemple je vois que tu as pris le modèle de celui de Windows x64, perso j'ai pris le modèle Windows x86, mais à ma façon

    Après si ton but est d'être compatible avec le format x64 de Win, ok tu n'as pas le choix ^^

    Après bon je ne me souviens plus trop des extras que j'ai rajoutés à mon prologue, ça fait genre 1/2 mois que je programme plus

    Donc de mémoire .... je crois que cela serrait bien si tu essayer de te passer du combo add/sub rsp, en faisant un décalage à "chaud", comme tu le fais à un moment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        mov     [rsp + 0x08], rcx
        mov     [rsp + 0x10], rdx
        mov     [rsp + 0x18], r8
        mov     [rsp + 0x20], r9
    C'est très sympa comme opti, mais encore faut-il pouvoir l'exploiter à fond ^^

    Après désolé, je ne peux vraiment pas t'aider à le construire, vu que je ne code que sous nasm :/

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Par défaut
    Après désolé, je ne peux vraiment pas t'aider à le construire, vu que je ne code que sous nasm :/
    Pour résoudre le problème j'accepte tout assembleur.
    En ce moment je regarde fasm qui a l'air de fournir des macros montrant la creation du frame.
    nasm est moins sohistiqué que masm,mais il me convient.
    Un autre assembleur YASM,GAS..TASM... ------aucun problème si c'est du 64 bits.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ok, c'est parti alors ^^

    http://forum.nasm.us/index.php?topic...sg9411#msg9411 à partir du 3e code frame.

    Mince pas vu que je n'ai pas précisé la définition des E...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                ; For the padding when moving data with avx2/avx/sse/x64/x86/16-bit/byte
                    %define     E512                (512/8)         ; avx-512
                    %define     E256                (256/8)         ; avx
                    %define     E128                (128/8)         ; sse
                    %define     E64                  (64/8)         ; x64
                    %define     E32                  (32/8)         ; x86
                    %define     E16                  (16/8)         ; 16-bit
                    %define     E8                    (8/8)         ;  8-bit
    Pour les explications, je préfère attendre que tu demandes les précisions plutôt (lazy power) ^^
    Dernière modification par Invité ; 13/09/2015 à 18h41.

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Par défaut
    Vu de loin on dirait une macro invoke ? ecrit en nasm ?!
    I know invoke macro but I prefer to build my own macro for understanding and customize

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ouep, mais je préfère faire du cas par cas perso (innovation et toujours ^^)

    Et je ne me rappelle plus le pourquoi j'ai été pousser à le faire à un moment, mais de mémoire, c'était une raison valable dans la forme.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Par défaut
    J'ai finalement trouvé une page clair sur le problème du prologue 64 bits
    http://blogs.msdn.com/b/ntdebugging/...-x64-code.aspx
    C'est beaucoup plus clair,maintenant.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Donc ton but, c'est d'être compatible avec l'ABI de Windows ?

  11. #11
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je crois que depuis le début vous discutez des conventions d'appel

  12. #12
    Invité
    Invité(e)
    Par défaut
    Peu importe le nom donné, tant que l'on traite du même sujet ^^

    Et sinon tu as déjà essayé de faire ta propre convention d'appel perso ?

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Par défaut
    oui ,le but est de connaitrepar l'apprentissage sur le tas,tous les problèmes posés par les appels 64 bits

    une première ébauche avec jwasm (mais doit supporter d'autres ).

    Je le livre tel que,mais attention il fonctionne pour l'instant lorsqu'on utilise pas de fonctions dans le proc.
    C'est une version béta,utilisant uses ,paramètres d'appels et locales.
    C'est pas entièrement faux,mais il manque un petit quelque chose

    ici le proc test qui doit marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    OPTION PROLOGUE:Prologue64 ;
    OPTION EPILOGUE:Epilogue64 ;
    	TestProc PROC FRAME uses rax r11 hwnd:HWND,uMsg:UINT,wParam: WPARAM,lParam:LPARAM ,pilearg:QWORD
    		LOCAL retour:QWORD ,child:HWND,Hfen:HWND,rien :QWORD
    		invoke DebugBreak
    		mov rax,pilearg		   ;------------------- 68h		
    		mov rax,wParam          ;rsp +58h   ;+38h ori-- -------- 58h		
    		mov rax,hwnd              ;rsp+48h     ;+28h ori-- -------- 48h  
    		mov rax,rien		   ;------------------- 38h		
    		mov retour,90h		   ;---------  ---------20h
    		ret
    	TestProc endp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    VISU MACRO chaine,valeur
    	%ECHO chaine valeur	
    ENDM
     
    Prologue64 MACRO procname, flags, parambytes, localbytes, reglist, userparms:VARARG
    	Local rien
    	;position depart rsp pointe adresse de retour 
    	;dans l'ordre croissant des adresses on trouve
    	;------------LOCALS-------------------------------------------retour		;0h
    	;------------LOCALS-------------------------------------------			;8h
    	;------------LOCALS-------------------------------------------			;10h
    	;------------LOCALS-------------------------------------------rien		;18h
    	;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@	
    	;********** return adress ;rsp point here at the start of the prologue,rsp = rsp -8 after push ****** ;20h  
    	;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@	
    	;		Rcx  save place if needed							;28h
    	;		Rdx  save place if needed		;size 20h				;30h
    	;		r8 save place if needed							;38h
    	;		r9 save place if needed							;40h
    	;
    	;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    	;		Stack parameter Area if Number of arguments > 4 ;number of bytes ? ;48h
    	;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    	;******* no other choice with JWASM preserve register here ----------	
    	;------------- rax ----------------------------------------------------------  50h  80d
     
    	ECHO aPROLOGUE
    	;----------------------- option ---------------------------
    	;save rcx,rdx,r8,r9 and made them accessible by there name
    	distanceRsp = 8
    	mov [rsp+distanceRsp],rcx
    	distanceRsp=distanceRsp+8
    	mov [rsp+distanceRsp],rdx
    	distanceRsp=distanceRsp+8	
    	mov [rsp+distanceRsp],r8
    	distanceRsp=distanceRsp+8	
    	mov [rsp+distanceRsp],r9	
     
    	;distanceRsp=20h	;reserve one qword after call
    	;---- What is the number of arguments > 4 ,pass them to push register
    	PushCount=parambytes/8
    	IF PushCount GT 4
    		PushCount=PushCount-4
    	ELSE
    		PushCount=0
    	ENDIF
    	IF PushCount GT 0
    		WHILE PushCount
    			distanceRsp=distanceRsp+8	;pass the parameters in stack	
    			PushCount=PushCount-1
    		ENDM		
    	ENDIF	
    	;--------- space for push if needed -------------------------
    	PushCount=0
    	FOR reg,reglist
    		PushCount=PushCount +1
    	ENDM
    	IF PushCount GT 0
    		FOR reg,reglist
    			distanceRsp=distanceRsp+8
    			PushCount = distanceRsp + localbytes+32 ;
    			VISU Sauve,%PushCount
    			mov [rsp+distanceRsp],reg	
    		ENDM
    	ENDIF	
    	VISU Taillelocales,%localbytes
    	sub rsp,localbytes +20h;locals + shadow space 
     
    	.ENDPROLOG
    	EXITM <32h>		;32 h jwasm bug,must be the stack space reserved for the next call
    ENDM
     
    Epilogue64 MACRO procname, flags, parambytes, localbytes, reglist, userparms
    	distanceRsp=0
    	ECHO aEPILOGUE
    	;ECHO ------------------------------------------------
    	distanceRsp=localbytes +8+parambytes +20h
    	;pass parameter if any
    	;----- goto saved register ----------------------------
    	;---- What is the number of arguments > 4 and put on the stack
    	;VISU FirstSaved,%distanceRsp
    	;--------- space for push if needed -------------------------
    	PushCount=0
    	FOR reg,reglist
    		PushCount=PushCount +1
    	ENDM
    	;++++++ locales ----------------
     
    	IF PushCount GT 0
    		;aller derniere savereg
    		IF PushCount GT 1
    			PushCount=PushCount-1
    			WHILE PushCount
    				distanceRsp=distanceRsp+8
    				PushCount=PushCount-1
    			ENDM			
    		ENDIF
     
    		;va chercher le dernier ;oder inverse prologue
    		FOR reg,reglist
    			;VISU Restore,%distanceRsp
    			mov reg,[rsp+distanceRsp]
    			distanceRsp=distanceRsp-8
    		ENDM		
     
    	ENDIF	
    	add rsp,localbytes +20h ; locales + space next call	
    	ret
    ENDM

  14. #14
    Invité
    Invité(e)
    Par défaut
    Euh .... non j'ai beau lire et relire, je ne pige rien (enfin si, quelques codes, mais sinon je suis perdu globalement), on dirait du C mélanger avec de l'asm avec des mots-clés supplémentaires (sans vouloir critiquer)

    Désolé faudra attendre un autre masm programmeur pour te répondre :/

    Mais sinon pour la présentation de ton code, chapeau, rare sont les codes asm présenter comme ça.

    Et sinon mon code nasm t’a aidé en quoi que ce soit ? ^^
    Dernière modification par Invité ; 14/09/2015 à 23h17.

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Par défaut
    on dirait du C mélanger avec de l'asm avec des mots-clés supplémentaires
    Bien vu,c'est du masm,macro langage assembleur finissant par ressembler étrangement à du c sans en avoir
    tous les avantages.Passer du 32 bits au 64 simplement en clicquant dans une fenête,n'est pas a la porter de masm,
    quelque soit le compilateur utilisé,ml ou jwasm.
    La macro Prologue64 n'a rien de compliquer,elle reçoit des infos de la part du compilateur sur la construction du proc.
    Prologue64 MACRO procname, flags, parambytes, localbytes, reglist, userparms:VARARG
    Principaux arguments:
    procname=nom du proc
    parambytes= Nombre de bytes total des paramêtres d'appel
    localbytes= Nombre de bytes total des locales
    reglist= liste des registres poussé en pile
    FOR reg,reglist
    ;sort reg =rsi puis rdi puis rbx si uses rsi rdi rbx pour le prolog
    ;sort reg =rbx puis rdi puis rsi si uses rsi rdi rbx dans l'épilogue
    ENDM
    sinon je me sert d'une constante pour calculer le décalage de rsp.

    Pour ton code,c'est toujours interressant d'avoir le code d'un invoke

Discussions similaires

  1. Sécurisation sources/code d'accès appli VBA Excel
    Par Pat_TOTO dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/09/2006, 17h39
  2. [c++]Source code de Paint
    Par cjacquel dans le forum C++/CLI
    Réponses: 2
    Dernier message: 08/08/2006, 22h14
  3. Check this out : Aerith source code has been released
    Par bbclone dans le forum AWT/Swing
    Réponses: 17
    Dernier message: 06/07/2006, 18h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo