Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Call Stack
Посл.ответ Сообщение


Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 17 апреля 2006 07:09 · Поправил: Nimnul
· Личное сообщение · #1

Как отладчики раскручивают стек? Вот допустим происходит серия Call'ов, мы в отладчике можем видеть Call Stack. У меня бы не возник этот вопрос, еслиб не следующее обстоятельство:

Call
push x
push x
Call
push x
Call

А здесь мы спокойно видим всю серию вызовов. Интересно как отладчики раскручивают стек, ведь на стеке, между адресами возврата, лежат данные проги.
 

-----
have a nice day





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 17 апреля 2006 07:40
· Личное сообщение · #2

Nimnul
Скорее всего сравнивают адреса на принадлежность к сегменту кода, хотя это только догадки... Может они это дело протоколируют по мере вхождения...

-----
DREAMS CALL US





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 17 апреля 2006 07:51 · Поправил: Nimnul
· Личное сообщение · #3

=TS=

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

-----
have a nice day




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 17 апреля 2006 09:32 · Поправил: S_T_A_S_
· Личное сообщение · #4

Про отладчики в MSDN есть: StackWalk http://search.microsoft.com/search/results.aspx?View=msdn&c=4&qu=StackWalk .
Если без PDB, есть ещё RtlCaptureStackBackTrace, или свой аналог писать.



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 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 следующей ф-и в стеке.

И т.д. циклически....



Ранг: 10.5 (новичок)
Активность: 0=0
Статус: Участник

Создано: 19 декабря 2006 05:02 · Поправил: kropalik
· Личное сообщение · #6

дизассемблируется код по адресу из стека.
если там какая нибудь разновидность call
то это адрес возврата. есть конечно и другие
методы (использование EBP) но они менее
надежны (прога может юзать EBP для других целей).

на самом деле Olly не всегда корреккно показывает call
stack в случае если какая нибудь функция например
подменяет адрес возврата или модифицирует код.


 eXeL@B —› Программирование —› Call Stack
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати