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

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

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

1

Решение

От Процедура размотки

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

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

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]