Я хочу размотать стек вызовов x64, поэтому я пытаюсь следовать «процедуре UNWIND», которую я нашел здесь:
http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx
Я понимаю, что если RIP находится в эпилоге, нам нужно вычислить смещение RSP, учитывая, какие операции еще необходимо выполнить, но мне неясно, как узнать, находится ли RIP в эпилоге или нет (в разделе 3.a)?
Может кто-нибудь объяснить это мне? (ссылка или пример кода также будут высоко оценены)
Чтобы определить, находится ли RIP в эпилоге, поток кода из RIP
на рассматривается. Если этот поток кода может быть сопоставлен с конечным
часть законного эпилога, как описано в разделе
CNDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAA4AAABfAFIAZQBmADQAOQA2ADAAOQAyADQAMgA1AAAA
REF _Ref496092425 \ r \ h 0, то есть в эпилоге, а остальные
смоделирована часть эпилога с контекстной записью, обновленной как
каждая инструкция обрабатывается
, и из Пролог и Эпилог (Я рекомендую всю статью для лучшего понимания)
Это единственные правовые формы эпилога. Он должен состоять из
либо добавить RSP, постоянный или LEA RSP, постоянный [FPReg], а затем
последовательность из нуля или более 8-байтовых регистров и возврата или jmp.
(В эпилоге допустимо только подмножество операторов jmp. […]).
Никакой другой код не может появиться. В частности ничего не может быть
запланировано в эпилоге, включая загрузку возвращаемого значения.Обратите внимание, что когда указатель кадра не используется, эпилог должен использовать add
RSP, константа для освобождения фиксированной части стека. Может не использовать
вместо RSP, константа [RSP]. Это ограничение существует, поэтому раскрутить
в коде меньше шаблонов, которые можно распознать при поиске эпилогов
Похоже, что если код оказывается в такой ситуации, он просто проверяет текущий исполняемый код на наличие этих конкретных инструкций и, если он совпадает, считает себя в эпилоге.
Других решений пока нет …