Делать стековый фрейм со смещением push / lea / sub вместо push / mov / sub?

visual-c++ assembly x86 reverse-engineering

258 просмотра

1 ответ

Я анализирую функцию c ++, скомпилированную с vc ++ (вероятно, vs10), и никогда раньше не видел этот образец пролога.

Вроде бы стандартный вызов, но пролог немного другой:

stdcall обычно запускает функцию со следующим шаблоном пролога:

push   ebp
mov    ebp, esp
sub    esp, const

Однако пролог этой функции, которую я анализирую, следующий:

push   ebp
lea    ebp, [esp - 0x4C]
sub    esp, 0x80

Анализируя другие функции в том же PE, который использует тот же пролог / эпилог, кажется, что RETN всегда идет после инструкции LEAVE , просто еще одна вещь, которую я никогда не видел в обычной функции cdecl .

Мне интересно, почему компилятор сделал это. Похоже, что он открывает пространство в ESP (by sub esp, const), так почему он открывает другой блок стека lea ebp, [esp - const]?

Кто-нибудь знает, почему компилятор делает это? Это другое соглашение о вызовах от stdcall ?

Я провел некоторое исследование в сети, а также изучил этот конкретный ассемблерный код, чтобы выяснить, но не обнаружил необходимости в этом.

Заранее спасибо!

РЕДАКТИРОВАТЬ с экранами пролога / эпилога:

пролог введите описание изображения здесь

эпилог введите описание изображения здесь

Вызов функции введите описание изображения здесь

Автор: dedecos Источник Размещён: 08.11.2019 11:31

Ответы (1)


1 плюс

Решение

Поскольку никто в комментариях не написал ответ здесь мы идем ...

Причиной такого различия в прологе / эпилоге между «обычным» stdcall и тем, о котором я говорю в теме, является оптимизация компилятором для плотности кода.

Смещение EBPв прологе компилятор может сократить инструкции в функции, которая обращается к некоторым переменным стека. Теперь он может получить доступ к большему куску стековой памяти (в зависимости от длины смещения пролога EBP) с помощью одного байтового смещения - используя EBP + Nи EBP - Mдля доступа к локальным переменным (где Nи Mявляются константами между -128 и + 127). Конечно, инструкции, которые обращаются к переменным за пределами этого смещения EBP, будут использовать смещение на 4 байта, но общий код этой функции будет короче, используя этот прием оптимизации.

Автор: dedecos Размещён: 21.08.2016 10:56
Вопросы из категории :
32x32