2 votes

X86 asm: Aide avec le code désassemblé

Est-ce que quelqu'un pourrait m'expliquer le code asm suivant s'il vous plaît? Qu'est-ce qu'il fait? J'ai déjà commenté un peu..
EDIT: C++, compilé avec MS Visual C++ 2008 Express Edition -> réassemblé

.text:39552AF5    pop     ecx
.text:39552AF6    push    eax             ; void *
.text:39552AF7    lea     eax, [ebp+procedureVariable_C] ; obtenir une variable de proc de la pile dans eax?
.text:39552AFA    call    sub_39501565 ; appeler la procédure avec les arguments: eax(void) et le résultat de lea?
.text:39552AFF    mov     ecx, dword_395D0A44 ; le caractère dword_395D0A44("officiel") est déplacé dans ecx
.text:39552B05    mov     eax, ebx ; ?
.text:39552B07    call    sub_39572981 ; ? pas d'arguments?

.text:39501565 ; int __stdcall sub_39501565(void *) .text:39501565 sub_39501565 proc near ; CODE XREF: sub_39501423+1Cp .text:39501565 ; sub_39501803+1Cp ... .text:39501565 .text:39501565 arg_0 = dword ptr 4 .text:39501565 .text:39501565 cmp [esp+arg_0], 0 .text:3950156A push edi .text:3950156B mov edi, eax .text:3950156D jnz short loc_39501573 .text:3950156F xor eax, eax .text:39501571 jmp short loc_39501583 .text:39501573 ; --------------------------------------------------------------------------- .text:39501573 .text:39501573 loc_39501573: ; CODE XREF: sub_39501565+8j .text:39501573 mov eax, [esp+4+arg_0] .text:39501577 lea edx, [eax+1] .text:3950157A .text:3950157A loc_3950157A: ; CODE XREF: sub_39501565+1Aj .text:3950157A mov cl, [eax] .text:3950157C inc eax .text:3950157D test cl, cl .text:3950157F jnz short loc_3950157A .text:39501581 sub eax, edx .text:39501583 .text:39501583 loc_39501583: ; CODE XREF: sub_39501565+Cj .text:39501583 push eax ; int .text:39501584 push [esp+8+arg_0] ; void * .text:39501588 call sub_39501524 .text:3950158D mov eax, edi .text:3950158F pop edi .text:39501590 retn 4 .text:39501590 sub_39501565 endp

1voto

Bo Persson Points 42821

Cette partie

.text:39501573
.text:39501573 loc_39501573: ; CODE XREF: sub_39501565+8j
.text:39501573 mov eax, [esp+4+arg_0]
.text:39501577 lea edx, [eax+1]
.text:3950157A
.text:3950157A loc_3950157A: ; CODE XREF: sub_39501565+1Aj
.text:3950157A mov cl, [eax]
.text:3950157C inc eax
.text:3950157D test cl, cl
.text:3950157F jnz short loc_3950157A
.text:39501581 sub eax, edx

semble scanner un octet nul et calculer fin - début + 1, où début + 1 provient de edx.

C'est ce que ferait strlen !

Y a-t-il de la magie ici ?!

0voto

CodesInChaos Points 60274

« lea » ne fait pas de la dereférence. Il fait simplement des opérations arithmétiques avec les registres de son deuxième paramètre et stocke le résultat dans le premier paramètre.

lea     eax, [ebp+procedureVariable_C];

En supposant que procedureVariable_C est un décalage constant, il ajoute ce décalage pour calculer le pointeur vers la variable correspondante.

0voto

Martin James Points 15655

Que voulez-vous savoir de SO que vous ne savez pas déjà? Il s'agit de quelques appels de fonction. Le premier passe un paramètre local par référence dans EAX, le second reçoit EAX en tant que paramètre, peut-être un résultat du premier appel, ou peut-être simplement ce qui a été passé dans ce bloc en EBX.

Nous ne savons pas quelles conventions d'appel sont utilisées, que cet assembleur est une sortie de compilateur désassemblée ou un codage 'humain', pas de contexte, aucun indice sur ce que font ou retournent les fonctions. Nous ne sommes pas exactement dans une bonne position pour aider.

Il n'y a rien d'inhabituel dans ce code. Quel est le problème?

Cordialement, Martin

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X