17 votes

Besoin d'aide pour comprendre l'instruction E8 asm call x86

J'ai besoin d'un coup de main pour comprendre l'instruction de montage suivante. Il me semble que j'appelle une adresse à someUnknownValue += 20994A ?

E8 32F6FFFF - call std::_Init_locks::operator=+20994A

61voto

Matthew Slattery Points 21628

Ce que vous utilisez pour obtenir le désassemblage essaie d'être utile, en donnant la cible de l'appel comme un décalage d'un symbole qu'il connaît -- mais étant donné que le décalage est si grand, il est probablement confus.

La cible réelle de l'appel peut être calculée comme suit :

  • E8 est un call avec un décalage relatif.
  • Dans un segment de code 32 bits, le décalage est spécifié comme une valeur 32 bits signée.
  • Cette valeur est dans l'ordre des octets little-endian.
  • Le décalage est mesuré à partir de l'adresse de l'instruction suivante.

par exemple

<some address>       E8 32 F6 FF FF         call <somewhere>
<some address>+5     (next instruction)
  • Le décalage est 0xFFFFF632 .
  • Interprété comme une valeur signée de 32 bits, c'est -0x9CE .
  • El call L'instruction est à <some address> et a une longueur de 5 octets ; l'instruction suivante est à <some address> + 5 .
  • L'adresse cible de l'appel est donc <some address> + 5 - 0x9CE .

-2voto

Rands Points 1

Si vous analysez le fichier PE à l'aide d'un désassembleur, ce dernier peut vous avoir donné un code erroné. La plupart des auteurs de logiciels malveillants utilisent l'insertion de E8 comme technique anti-désassemblage. Vous pouvez vérifier si les codes au-dessus de E8 sont des instructions de saut où l'emplacement du saut est après E8.

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