Нужна помощь в понимании инструкции вызова 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.