j'ai commencé la programmation en asm 32/64 d'une librairie perso.
Pour l'instant ça marche.
Ma question est sur le ShadowSpace de 32 bit, j'ai lu plusieurs articles et j'ai saisi.
Pourquoi utilises-tu en particulier SUB RSP, 8 avant l'appel de GadgetID en particulier (mais pas que) puis SUB RSP, 32 ?
Cela revient à SUB RSP, 40, c'est cette valeur que j'utilise avec mon générateur de squelette asm à défaut de savoir pourquoi.
Tes fonctions utilisent-elles 8 octets prédéclarés en plus du ShadowSpace ?
Je ne crois pas car on peut réserver de la place sur la pile dans le codage de la fonction.
C'est une sécurité pour éviter l'overwrite ?
on retrouve ce 40 par exemple à l'initialisation des variables globales
Code : Tout sélectionner
SUB rsp,40
MOV r8,I_BSSEnd-I_BSSStart
XOR rdx,rdx
MOV rcx,I_BSSStart
CALL memset
CALL GetModuleHandleA
CALL HeapCreate
etc.
et Gadgetid dans le cadre d'un sendmessage
Code : Tout sélectionner
; SendMessage_(GadgetID(#ListIcon), #LVM_SETITEMSTATE, 3, @var)
MOV rax,qword v_var
PUSH rax
PUSH qword 3
PUSH qword 4139
SUB rsp,8
MOV rcx,qword 0
SUB rsp,32
CALL PB_GadgetID
ADD rsp,40
MOV rcx,rax
POP rdx
POP r8
POP r9
CALL SendMessageA