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

Long GetFunctionFlags(long ea);

Вызов GetFunctionFlags позволяет узнать атрибуты функции. Назначение отдельных битов в возвращаемом значении показано в таблице ниже.

Определение

Значение

Пояснения

FUNC_NORET

0x00000001L

Функция не возвращает управления

FUNC_FAR

0x00000002L

FAR (далекая) функция

FUNC_LIB

0x00000004L

Библиотечная функция

FUNC_STATIC

0x00000008L

Статическая функция

FUNC_FRAME

0x00000010L

Функция использует для указателя кадра стека регистр BP

FUNC_USERFAR

0x00000020L

Функция определена пользователем как далекая (FAR)

FUNC_HIDDEN

0x00000040L

Скрытая функция

Подробнее о каждом атрибуте будет рассказано ниже.

Func_noret

Этот атрибут устанавливается тем функциям, что не возвращают управления командой ret. Однако в большинстве случаев IDA автоматически не присваивает его.

Так, например, в следующей функции он не установлен.

seg000:2305 sub_0_2305 proc near

seg000:2305 sti

seg000:2306 call sub_0_1CA

seg000:2309 mov ah, 4Ch

seg000:230B int 21h

seg000:230B sub_0_2305 endp

Message(“%b \n”,

GetFunctionFlags(0x12305)

);

0

Если в вашей ситуации это обстоятельство окажется критичным, то можно написать собственный скрипт, выполняющий такие проверки и устанавливающий атрибуты через вызов SetFunctionFlags.

Func_far

«Далекая» функция. IDA считает далекими все функции, оканчивающиеся командой далекого возврата – retf.

Этот механизм достаточно несовершенен и может давать сбои. Так, например, в следующем фрагменте эмуляцию вызова CALL FAR \ RET IDA интерпретировала, как далекий возврат из функции.

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

seg000:048B sub_0_48B proc far

seg000:048B

seg000:048B pushf

seg000:048C push cs

seg000:048D push offset locret_0_499

seg000:0490 push word ptr ds:74Dh

seg000:0494 push word ptr ds:74Bh

seg000:0498 retf

seg000:0498 sub_0_48B endp ; sp = -0Ah

seg000:0498

seg000:0499 ; ------------------------------------------

seg000:0499

seg000:0499 locret_0_499:

seg000:0499 retn

Message(“%b \n”,

GetFunctionFlags(0x1048B)

);

10

Func_lib

Таким флагом отмечены стандартные «библиотечные» функции. То есть те, чьи сигнатуры известны FLIRT.

.text:004010FF ; Attributes: library function

.text:004010FF

.text:004010FF __amsg_exit proc near

.text:004010FF

.text:004010FF

.text:004010FF arg_0 = dword ptr 4

.text:004010FF

.text:004010FF cmp dword_0_408758, 2

.text:00401106 jz short loc_0_40110D

.text:00401108 call __FF_MSGBANNER

.text:0040110D

.text:0040110D loc_0_40110D:

.text:0040110D push [esp+arg_0]

.text:00401111 call __NMSG_WRITE

.text:00401116 push 0FFh

.text:0040111B call off_0_408050

.text:00401121 pop ecx

.text:00401122 pop ecx

.text:00401123 retn

.text:00401123 __amsg_exit endp

Message(“%b \n”,

GetFunctionFlags(0x4010FF)

);

100

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