Сейчас на форуме: zds, _MBK_ (+8 невидимых)

 eXeL@B —› Основной форум —› IDA: не коректное дисассемблирование функции
Посл.ответ Сообщение

Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 16:44 · Поправил: dx2003
· Личное сообщение · #1

Приветствую,

IDA не совсем корректно дисассемблировала функцию:




Из за Армадилы ли или ещё из-за чего, но IDA не понимает красный участок кода.

Подскажите, что нужно подсказать IDA'е, чтобы она верно собрала функцию?

Спасибо.

С уважением,
dx2003



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 12 июня 2007 16:55
· Личное сообщение · #2

undefine->convert to code, всё в попап менюшке...

-----
Shalom ebanats!




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

Создано: 12 июня 2007 17:02
· Личное сообщение · #3

Change stack pointer... Alt+K

Вероятно неправильно определена конвенция вызова (__cdecl а не __stdcall) у sub_40483C



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 17:07 · Поправил: dx2003
· Личное сообщение · #4

SLV

[undefine->convert to code, всё в попап менюшке...]

Я, видимо, не совсем корректно выразился...

Код выделенный красным цветом уже является кодом (м-да... ) дело в том, что этот код неприкаянный.
Он сам посебе, а должен быть частью функции адрес возврата из которой: 0x0073FD0A.

На рисунке я специально пометил стрелочками callflow.

Из-за того, что код этот сам по себе, IDA регистрирует ошибку востановления стека.
Я конечно могу поправить стек вручную.... но хочется всёже как-то поправить сам код (саму функцию)



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 17:09 · Поправил: dx2003
· Личное сообщение · #5

S_T_A_S_

Да, как вариант, стек можно поправить вручную...

Но таких участков кода много (спасибо разработчикам Армадилы) и ошибки со стеком это мелкая неприятность. Хуже, что такие участки мешают понять логику кода.

У функции sub_40483C или у следующих по вызову подобные же проблемы...
В том или ином месте повляется участок, маскирующий востановление стека.
Найти это место не вопрос, вопрос как этот найденный кусок запихнуть в функцию..



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 17:42
· Личное сообщение · #6

Здесь знающие люди посказывают, что нужно писать скрипт....
Никогда этого не делал, кто-нибуть может помочь?

Спасибо.



Ранг: 74.4 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 12 июня 2007 17:42
· Личное сообщение · #7

И чемже тебе мешает это понять логику? Помоему никаких помех там нету.
Я такое часто видел, и армадила это не причина.



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 17:46 · Поправил: dx2003
· Личное сообщение · #8

WoLFeR

Я чуть позже с удовольствием расскажу почему и от чего это мешает понять логику...
А сейчас мне больше интересно как всё это добавлять в функцию.

Кстати, если это не Армадила, то что (кто)?
Неужели это балуется компилятор или шутят разработчики?

Может быть это "такая" опримизация кода? +)




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 12 июня 2007 18:32 · Поправил: s0larian
· Личное сообщение · #9

dx2003, красная метка это не код, а логическая граница функции, как её понимает IDA. Строгого понятия функция в x86 нет, т.к. есть инструкция "call" показывающая на код, и потом идёт поток инструкций до "ret". IDA пытается найти этот поток и обернуть его в своё собственное понятие "function". Alt-P покажет тебе что именно она нашла для конкректной ф-ции.

Теперь по поводу метки - IDA неправильно сосчитала сколько данных идёт на стек и сколько снимается. Если тебя это беспокоит, пройдись по всему дереву вызовов от этой ф-ции вниз и проверь/поставь количесво байт которое получает каждая из них. Опять таки, IDA пытается это всё считать сама и ошибается.



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 19:03 · Поправил: dx2003
· Личное сообщение · #10

Вот что меня всегда поражает в некоторых людях, так это полное не желание отвечать на поставленный вопрос да ещё и при этом направлять на спрашивающего свой поток сознания...

Вот я справишаю, как помочь IDA'е с определением функции.
Мне отвечают:

а) ты шо тупой? без этого не разберёшся? я вот, например, разобрался!
б) а вы знаете, молодой человек, что в x86 нет функций .... они конечно есть в IDA... Правда, знаети ли, IDA может ошибаться с их определением
b) ...

Или вот я пишу: Да, как вариант, стек можно поправить вручную...

мне отвечают:
а) друг, пройдись по коду и замени стек ВРУЧНУЮ!
б) ...

Мне не сложно, я спрошу ещё раз:

Подскажите, что нужно подсказать IDA'е, чтобы она верно собрала функцию?

Для сомневаюшихся в вопросе уточню сразу: функцию в понимании IDA.

PS
Если то, что я прошу сделать просто не возможно, то не совсем понятно, почему так прямо и не сказать? +)




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 12 июня 2007 19:18
· Личное сообщение · #11

Правой кнопкой -> Edit function... -> function Begin & func end.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 12 июня 2007 19:25
· Личное сообщение · #12

dx2003 пишет:
Подскажите, что нужно подсказать IDA'е, чтобы она верно собрала функцию?

Я ж тебе всё отписал - Alt-P, или через меню, Edit -> Function -> Edit Function

Там можно поправить начало/конец, stack usage и calling convention.

Что ещё ты понимаешь под "подсказать"?



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 19:26
· Личное сообщение · #13

HoBleen

Попробовал изменить адрес конца функции на 0x0073FD1A
IDA сообщает, что это не возможно +(



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 19:31
· Личное сообщение · #14

s0larian

[Что ещё ты понимаешь под "подсказать"?]

Хм... сложный вопрос +)

Я понимаю, что здесь "Edit -> Function -> Edit Function" правятся параметры. Но собрать функцию используя этот диалог я пока не могу...

Всё таки считаю, что это делается только при помощи скрипта.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 12 июня 2007 19:33
· Личное сообщение · #15

0x0073FD0B уже входит в процедуру, один и тот же код не может принадлежать разным ф-ям =)
Удали эту подфункцию и раздуй главную.



Ранг: 43.2 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 12 июня 2007 19:34 · Поправил: AlexVel
· Личное сообщение · #16

Блин, да это просто конструкция Try...finally
Что сделать:
встаешь на строку 73FD0B и жмешь "u" (undefined)
Затем там же жмешь "c" (Make Code)
встаешь на строку 73FD1A и жмешь "e" (end of function)

и еще
встаешь на 73АВ28 жмешь "A" (Make ANSI String)
Т.к. там дельфовые строки-константы
Тоже самое с 73FD3C и 73FD54




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 12 июня 2007 19:34
· Личное сообщение · #17

что значит "собрать функцию"?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 12 июня 2007 19:36 · Поправил: s0larian
· Личное сообщение · #18

а, так ёлки, просто undefine след. функцию и увелич эту



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 19:39 · Поправил: dx2003
· Личное сообщение · #19

HoBleen
AlexVel

Монстры! +)
Просто отцы IDA!

s0larian ну хорошо, хорошо, Вы тоже монстр! +)

PS
Ведь можем когда захотим +)



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2007 19:43
· Личное сообщение · #20

От ить, уж всплакнул от счастья! +)

Спасибо Вам друзья!

PS
Нет, ну просто МОНСТРЫ!! +))




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

Создано: 12 июня 2007 21:28
· Личное сообщение · #21

dx2003
Читай Касперски "Образ мышления -дизассемблер ИДА", и не задавай глупых вопросов. Не умеешь ты читать код это раз, второе - рипать ты тоже не умеешь и в третих ты очень хуево умеешь работать с идой, а стало быть выход один - RTFM.

-----
– Почему ты работаешь по ночам ? – Так удобнее... В одну смену с чертями...




Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 июня 2007 05:28
· Личное сообщение · #22

ещё один поток сознания...

тнт, от таких как ты одна защита - презерватив.



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

Создано: 13 июня 2007 09:14
· Личное сообщение · #23

73fd0b - сделать unexplored, потом 73fd1a нажать E (set function end)




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

Создано: 13 июня 2007 16:18
· Личное сообщение · #24

dx2003 пишет:
тнт, от таких как ты одна защита - презерватив.

бугага! мазефакер, жжешь!

dx2003
Покайся и в монастырь!

-----
– Почему ты работаешь по ночам ? – Так удобнее... В одну смену с чертями...



 eXeL@B —› Основной форум —› IDA: не коректное дисассемблирование функции
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати