Вы нашли оба варианта.Поведение полностью определяется этим вопросом:
Сохраняете ли вы обратный адрес?
Если вы ответили «да», у вас есть поведение, например, вызов, и что-то выдвигаетсяв стек (хотя бы адрес возврата).
Если ответ отрицательный, вы не возвращаетесь к вызывающей функции, поэтому остальная часть пропускается (например, jmp
).
Закон исключенного посредника гласит, что других вариантов нет.
Возможный способ обойти это - сохранить обратный адрес (возвращаясь к батуту) прямо поверхисходный адрес возврата (сохраняя его где-то еще, возможно, локальное хранилище).Таким образом вы поддерживаете макет стека, необходимый для функции, которую вы пересылаете.Часть вашего пост-хука должна затем вернуть исходный обратный адрес.