Размотка стека x64 и проверка, находится ли RIP в эпилоге

Я хочу развернуть стек вызовов x64, поэтому я пытаюсь следовать "процедуре UNWIND", которую я нашел здесь:
http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx

Я понимаю, что если RIP находится в эпилоге, нам нужно вычислить смещение RSP, учитывая, какие операции еще необходимо выполнить, но мне неясно, как узнать, находится ли RIP в эпилоге или нет (в разделе 3.a)?
Может кто-нибудь объяснить это мне? (ссылка или пример кода также будут высоко оценены)

1 ответ

Из процедуры размотки

Чтобы определить, находится ли RIP в эпилоге, проверяется поток кода от RIP. Если этот кодовый поток может быть согласован с задней частью законного эпилога, как описано в разделе CNDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAA4AAABfAFIAZQBmADQAOQA2ADAAOQAyADQAMgA1AAAA REF _Ref496092425 \ г \ ч 0, то в эпилоге, а оставшаяся часть эпилога моделируются с контекстом записью обновляется при обработке каждой инструкции

и от Пролога и Эпилога (я рекомендую всю статью для лучшего понимания)

Это единственные правовые формы эпилога. Он должен состоять из добавления RSP, константы или RSP из константы, константы [FPReg], сопровождаемой серией нулевых или более 8-байтовых всплывающих регистров и возврата или jmp. (В эпилоге допустимо только подмножество операторов jmp. [...]). Никакой другой код не может появиться. В частности, нельзя ничего запланировать в эпилоге, включая загрузку возвращаемого значения.

Обратите внимание, что когда указатель кадра не используется, эпилог должен использовать константу add RSP, чтобы освободить фиксированную часть стека. Вместо этого он не может использовать RSP для констант, константу [RSP]. Это ограничение существует, поэтому код раскручивания имеет меньше шаблонов для распознавания при поиске эпилогов.

Кажется, что если код оказывается в такой ситуации, он просто проверяет текущий исполняемый код на наличие этих специфических инструкций и, если сопоставляется, считает себя находящимся в эпилоге.

Другие вопросы по тегам