в IDA pro есть шаг назад?

Тема в разделе "WASM.BEGINNERS", создана пользователем deadly83, 29 янв 2008.

  1. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    Добрый вечер!
    Как в иде узнать адрес предыдущей выполенной инструкции или сделать шаг назад? Нпример ида вываливается на каком то адресе типа память не может быть прочитана, а как узнать какая инструкция предшествовала той на которой застопорился процесс?
    Спасибо
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Шаг назад -- клавиша Esc. Только не помню, работает ли она для исключений. Для исключений можно попробовать посмотреть в стеке на структуру CONTEXT, которая передается обработчику исключений. В ней живет значение регистра eip.
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    не работает. esc - это шаг назад в буфере перемещений юзера. Т.е. кликнул по адресу - ушел туда. esc - вернулся назад.
     
  4. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    deadly83
    Не, это называется обратная трассировка и ее сейчас нет в современных мейнстримных отладчиках.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В описании исключения есть вся необходимая информация (адрес инструкции, адрес памяти, флаг чтения/записи). А так - аппаратная поддержка этого есть, но отладчики режима пользователя её не используют.
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я думаю, можно написать скрипт, который будет вытаскивать необходимую информацию и ставить курсор на провинившуюся инструкцию. Но, если честно, сам еще не пробовал.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Таки попробовал. При живом отладчике (только при живом!) надо выполнить след. скрипт:

    Код (Text):
    1. auto addr, context;
    2.  
    3. context = ecx;
    4. addr = Dword(context + 0xB8);
    5. Message("%x", addr);
    Когда IDA спросит "Отдать ли исключение программе?" ответить 'Yes'. Мы окажемся в ф-ии KiUserExceptionDispatcher. В ecx лежит адрес CONTEXT в котором прописан eip. Извлекаем eip из CONTEXT и выводим на экран. К сожалению, ф-ии, которая ставит курсор по заданному адресу я не нашел. Саму ф-ию можно выделить в .idc файл и вызывать по требованию. Для файла ф-ия будет выглядеть так:

    Код (Text):
    1. static get_excpt_addr()
    2. {
    3.   auto addr, context;
    4.  
    5.   context = ecx;
    6.   addr = Dword(context + 0xB8);
    7.   Message("%x", addr);
    8. }
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    jump(ea).

    Да, жаль, что плагину даётся мало информации об исключении (только код и "Possible address referenced by the exception"), по идее, можно было бы обойтись средствами плагина для получения информации об исключении до захода в KiUserExceptionDispatcher.