IDA Pro, неправильный стэк

Тема в разделе "WASM.RESEARCH", создана пользователем sergegers, 27 июн 2011.

  1. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    есть функция с нетрадиционным calling convention, которая похожа на printf, только постоянные аргументы передаются через регистры. в неё передаётся количество переменных параметров, и соответственно после выхода из неё стэк сдвигается на их количество. после выхода из функции ida пишет, что стек не изменился, и соответственно, в вызывающей функции анализ стека сбивается. при вызове C функций типа printf всё нормально. можно ли этого добиться и если можно, то как? я посмотрел определение printf, там всё стандартно, кроме того, что в сигнатуре присутствует ... я добавил троеточие к сигнатуре "плохой" функции, но это ничего не изменило
     
  2. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    sergegers
    А как происходит восстановление стека в самой программе?
    Вообще влияние каждой инструкции на регистр sp можно менять (Alt+K). Например инструкция push eax изменяет значение на -4, в то время как call меняет его на неопределённое значение в общем случае. IDA пытается протрейсить значение регистра, но у неё не всегда это получается. Например, очень часто её обламывают вызовы виртуальных функций.
     
  3. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    восстановление стека происходит очень просто, вызывается много всяких команд, меняющих стек, и в итоге он восстанавливается. проблема в том, что после вызова "неправильной" функции Ida считает, что стек не поменялся.
    про Alt-K я знаю. в талмуде по Ida описано два способа корректировать стек, поправить в месте вызова через Alt-K или поправить саму функцию. Вот я и спрашиваю про второй способ, ведь с printf Ida как то справляется.
    И ещё тогда микро вопрос. Если я через Alt-K скручиваю стек в ноль в на выходе из функции, почему не пропадает красная полосочка с надписью sp analyze failed? версия 6.1 пизженная в китае
     
  4. Vam

    Vam New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2008
    Сообщения:
    149
    Значит что-то сделано неправильно или функция имеет и другие return, кроме последнего, а выравнивать стек всегда нужно в том месте где ИДА ошибается, а не в конце функции.
     
  5. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    не, я скручиваю стек в месте вызова "неправильной" функции, чтобы на ret вызываюшей функции был 0
     
  6. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    printf не меняет стек, поэтому с ним "справляться" не надо.
     
  7. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    ясно, спасибо