Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
eXeL@B —› Программирование —› Call Stack |
Посл.ответ | Сообщение |
|
Создано: 17 апреля 2006 07:09 · Поправил: Nimnul · Личное сообщение · #1 Как отладчики раскручивают стек? Вот допустим происходит серия Call'ов, мы в отладчике можем видеть Call Stack. У меня бы не возник этот вопрос, еслиб не следующее обстоятельство: Call push x push x Call push x Call А здесь мы спокойно видим всю серию вызовов. Интересно как отладчики раскручивают стек, ведь на стеке, между адресами возврата, лежат данные проги. ----- have a nice day |
|
Создано: 17 апреля 2006 07:40 · Личное сообщение · #2 |
|
Создано: 17 апреля 2006 07:51 · Поправил: Nimnul · Личное сообщение · #3 |
|
Создано: 17 апреля 2006 09:32 · Поправил: S_T_A_S_ · Личное сообщение · #4 |
|
Создано: 19 декабря 2006 03:31 · Личное сообщение · #5 Если есть отладочная информация, то можно загрузить символы и использовать StackWalk с DbgHelp.dll. Если нет, то можно самому написать. На системе x86 для розкрутки стека надо сначала прочитать значение регистра EBP. Тогда адрес возврата с текущей функции будет находится в памяти по адресу EBP+4. Указатель фрейма стека (EBP) следующей ф-и в стеке находится по адресу EBP. На системе AMD x64 используется ф-я RtlLookupFunctionEntry. Она возвращает структуру RUNTIME_FUNCTION в которой, в частности, есть информация для розкрутки стека (поле UnwindData указывает на структуру UNWIND_INFO). Структура UNWIND_INFO содержит массив элементов UNWIND_CODE которые указывают действия выполняемые прологом ф-и. С помощью этой информации соответствующим образом изменяем значение указателя стека и определяем адрес возврата с текущей ф-и и значение указателя стека RSP следующей ф-и в стеке. И т.д. циклически.... |
|
Создано: 19 декабря 2006 05:02 · Поправил: kropalik · Личное сообщение · #6 дизассемблируется код по адресу из стека. если там какая нибудь разновидность call то это адрес возврата. есть конечно и другие методы (использование EBP) но они менее надежны (прога может юзать EBP для других целей). на самом деле Olly не всегда корреккно показывает call stack в случае если какая нибудь функция например подменяет адрес возврата или модифицирует код. |
eXeL@B —› Программирование —› Call Stack |