Нужна помощь в понимании инструкции вызова E8 asm x86

Мне нужна помощь, чтобы понять следующую инструкцию по сборке. Мне кажется, что я звоню по адресу someUnknownValue += 20994A?

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

2 ответов


все, что вы используете для получения разборки, пытается быть полезным, давая цель вызова как смещение от некоторого символа, о котором он знает, но, учитывая, что смещение настолько велико, оно, вероятно, запутано.

фактическая цель вызова может быть рассчитана следующим образом:

  • E8 это call с относительным смещением.
  • в 32-разрядном сегменте кода, смещение задается как 32-разрядное значение.
  • это значение находится в порядке байтов little-endian.
  • смещение измеряется от адреса следующей инструкции.

например

<some address>       E8 32 F6 FF FF         call <somewhere>
<some address>+5     (next instruction)
  • смещение 0xFFFFF632.
  • интерпретируется как 32-разрядное значение, это -0x9CE.
  • на call обучение в <some address> и имеет длину 5 байт; следующая инструкция находится в <some address> + 5.
  • таким образом, целевой адрес вызова <some address> + 5 - 0x9CE.

Если вы анализируете PE-файл с помощью дизассемблера, возможно, дизассемблер дал вам неправильный код. Большинство вредоносных программ использует вставку E8 в качестве метода анти-разборки. Вы можете проверить, являются ли коды выше E8 инструкциями по прыжку, где место прыжка после E8.