Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Success MakeFunction(long start,long end);

Вызов MakeFunction позволяет создавать функцию. IDA не различает функций и процедур – в ее терминологии все это функции.

Каждая функция обладает принадлежащим ей непрерывным диапазонов адресов. В его границах может отслеживаться значения указателя стека, создаются ссылки на следующие инструкции и так далее. То есть ряд вызовов API работает исключительно с функциями.

Для создания функции достаточно только указать линейный адрес ее начала и конца. Функции могут создаваться только внутри сегментов и располагаться только с начала, а не середины машинных инструкций.

В то же время допускается в качестве конца задавать адрес, приходящейся на середину инструкции. IDA все равно его округлит до адреса конца предыдущей инструкции.

Например:

seg000:002A mov si, 211h

seg000:002D call sub_0_DD

seg000:0030 mov si, 2BAh

seg000:0033 call sub_0_DD

seg000:0036 retn

MakeFunction(0x1002A,0x10037);

seg000:002A ; _______________ S U B R O U T I N E

seg000:002A

seg000:002A

seg000:002A sub_0_2A proc near

seg000:002A mov si, 211h

seg000:002D call sub_0_DD

seg000:0030 mov si, 2BAh

seg000:0033 call sub_0_DD

seg000:0036 retn

seg000:0036 sub_0_2A endp

seg000:0036

seg000:0037

seg000:0037 ; _______________ S U B R O U T I N E

При этом функции автоматически дается имя, вид которого зависит от настоек. По умолчанию оно предваряется префиксом ‘sub’ (от subroutine - то есть процедура; забавно – ведь в терминологии IDA она называется функцией) и последующим смещением внутри сегмента.

Если вместо адреса конца функции указать константу BADADDR, то IDA попытается самостоятельно определить его.

Этот механизм довольно бесхитростен (концом функции считается инструкция ret или jmp) и довольно часто приводит к ошибкам и занижает адрес.

Разберем, например, такой случай. Путь некая функция имеет более одной точки выхода. В этом случае IDA часто принимает за конец функции первый встретившийся их них, а второй так и остается в «хвосте».

Это не упрек в несовершенстве алгоритма, а просто предостережения от всецелого доверия ему. В действительности же машинный анализ никогда не станет настолько совершенным, что бы полностью заменить человека.

Обратите внимание, что вызов MakeFunction провалится, если выделенная под функцию область будет помечена как undefined. Что и видно из следующего примера:

seg000:002A db 0BEh

seg000:002B db 11h

seg000:002C db 2

seg000:002D db 0E8h

seg000:002E db 0ADh

seg000:002F db 0

seg000:0030 db 0BEh

seg000:0031 db 0BAh

seg000:0032 db 2

seg000:0033 db 0E8h

seg000:0034 db 0A7h

seg000:0035 db 0

seg000:0036 db 0C3h

Message(“0x%X \n”,MakeFunction(0x1002A,0x10037));

0

Но в то же время, если в качестве адреса конца указать константу BADADDR, то функция будет успешно создана!

seg000:002A db 0BEh

seg000:002B db 11h

seg000:002C db 2

seg000:002D db 0E8h

seg000:002E db 0ADh

seg000:002F db 0

seg000:0030 db 0BEh

seg000:0031 db 0BAh

seg000:0032 db 2

seg000:0033 db 0E8h

seg000:0034 db 0A7h

seg000:0035 db 0

seg000:0036 db 0C3h

Message(“0x%X \n”,MakeFunction(0x1002A,-1));

1

seg000:002A ; _______________ S U B R O U T I N E _______________________________________

seg000:002A

seg000:002A

seg000:002A sub_0_2A proc near

seg000:002A mov si, 211h

seg000:002D call sub_0_DD

seg000:0030 mov si, 2BAh

seg000:0033 call sub_0_DD

seg000:0036 retn

seg000:0036 sub_0_2A endp

seg000:0036

seg000:0037

seg000:0037 ; _______________ S U B R O U T I N E _______________________________________

Операнд

Пояснения

Start

Линейный адрес начала функции. Функция не может начинаться с середины инструкции

End

==end

Пояснения

!=-1

Линейный адрес конца функции. Может приходиться на середину инструкции. IDA его округлит до адреса конца предыдущей инструкции.

==-1

IDA автоматически вычисляет адрес конца функции и при необходимости преобразует undefined в инструкции

Return

Завершение

Пояснения

0

Вызов завершился не успешно. Функция не была создана

1

Вызов завершился Успешно

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]