есть функция с нетрадиционным calling convention, которая похожа на printf, только постоянные аргументы передаются через регистры. в неё передаётся количество переменных параметров, и соответственно после выхода из неё стэк сдвигается на их количество. после выхода из функции ida пишет, что стек не изменился, и соответственно, в вызывающей функции анализ стека сбивается. при вызове C функций типа printf всё нормально. можно ли этого добиться и если можно, то как? я посмотрел определение printf, там всё стандартно, кроме того, что в сигнатуре присутствует ... я добавил троеточие к сигнатуре "плохой" функции, но это ничего не изменило
sergegers А как происходит восстановление стека в самой программе? Вообще влияние каждой инструкции на регистр sp можно менять (Alt+K). Например инструкция push eax изменяет значение на -4, в то время как call меняет его на неопределённое значение в общем случае. IDA пытается протрейсить значение регистра, но у неё не всегда это получается. Например, очень часто её обламывают вызовы виртуальных функций.
восстановление стека происходит очень просто, вызывается много всяких команд, меняющих стек, и в итоге он восстанавливается. проблема в том, что после вызова "неправильной" функции Ida считает, что стек не поменялся. про Alt-K я знаю. в талмуде по Ida описано два способа корректировать стек, поправить в месте вызова через Alt-K или поправить саму функцию. Вот я и спрашиваю про второй способ, ведь с printf Ida как то справляется. И ещё тогда микро вопрос. Если я через Alt-K скручиваю стек в ноль в на выходе из функции, почему не пропадает красная полосочка с надписью sp analyze failed? версия 6.1 пизженная в китае
Значит что-то сделано неправильно или функция имеет и другие return, кроме последнего, а выравнивать стек всегда нужно в том месте где ИДА ошибается, а не в конце функции.