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

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 ^^
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).
Içi la macro: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
Voila première surprise la macro tient compte de la valeur de EXITM pour positionner les locals.
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
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.

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
C'est très sympa comme opti, mais encore faut-il pouvoir l'exploiter à fond ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5mov [rsp + 0x08], rcx mov [rsp + 0x10], rdx mov [rsp + 0x18], r8 mov [rsp + 0x20], r9
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.Après désolé, je ne peux vraiment pas t'aider à le construire, vu que je ne code que sous nasm :/
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.

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...
Pour les explications, je préfère attendre que tu demandes les précisions plutôt (lazy power) ^^
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
Dernière modification par Invité ; 13/09/2015 à 18h41.
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

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

Donc ton but, c'est d'être compatible avec l'ABI de Windows ?
salut,
je crois que depuis le début vous discutez des conventions d'appel

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

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.
Bien vu,c'est du masm,macro langage assembleur finissant par ressembler étrangement à du c sans en avoiron dirait du C mélanger avec de l'asm avec des mots-clés supplémentaires
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
Partager