Я, может казаться, не выясняю что eax
содержит после этой части блока:
mov edi, [edi+4]
lea eax, [edi+88h]
С edi
указывая на класс
Эффективный адрес загрузки получает фактический адрес ссылки. По какой-то загадочной причине символическая сборка написана так, как если бы она ссылалась на содержимое edi + 88h, но на самом деле инструкция загружает значение регистра edi плюс константу 088h (эквивалентную ] mov eax, edi; добавить eax, 088h
). Сомневаюсь, что edi + 4 - это указатель на функцию: скорее, это указатель на vtbl или массив.
Долгая перспектива, так как я ничего не знаю о вашем классе, но все равно здесь.
Есть ли у вас множественное наследование? Возможно, edi + 4
- вторая виртуальная таблица, а [edi + 4] + 88h
- указатель функции, которую вы хотите вызвать? Или, в зависимости от вашего компилятора, виртуальная таблица может быть расположена по адресу +4
, в любом случае eax
содержит адрес виртуальной функции, которую нужно вызвать.
Основываясь на использовании edi
, он, вероятно, в конечном итоге указывает на ячейку памяти, но lea
не всегда используется так: http: // en .wikipedia.org / wiki / Addressing_mode # Useful_side_effect .
mov edi, [edi+4]
lea eax, [edi+88h]
edi points here after 'mov'
.
xxxx....................
| ^
xxxx.... eax points here after 'lea'
^
edi pointed here before 'mov'
char* edi;
void* eax;
edi = *(char**)(edi+4);
eax = edi+0x88;
Похоже, что к какой-то записи там просто получают доступ.