Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 [ 54 ] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

seg000:0029 seg000:002A seg000:002A ;

seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000:

002A 002A 002A 002A

002D

0030 0033 0036 0036 0036 0037 0037

sub 0 2A

sub 0 2A

U B R

I N E

proc near

211h

call

0 DD

2BAh

call

0 DD

retn

endp

S U

U T I

seg000:0037 seg000:0037 seg000:0037 seg000:0037 seg000:0037 seg000:0037 seg000:0038

sub 0 37

proc near

push push

auto a; a=0;

while ((a=NextFunction(a))!=-1) Message("%x \n",a);

10000 1002a 10037

Операнд

Пояснения

Линейный адрес

Return

Завершение

Пояснения

!=BADADDR

Линейный адрес начала следующей функции

BADADDR

Ошибка

long PrevFunction(long ea)

Вызов возвращает линейный адрес предыдущий функции. Что бы получить адрес последней функции необходимо вызвать PrevFunction(BADADDR).

seg000:

0000

sub 0 0

proc

near

seg000:

0000

push

seg000:

0001

push

seg000:

0027

seg000:

0028

seg000:

0029

retn

seg000:

0029

sub 0 0

endp



seg000:0029 seg000:002A seg000:002A ;

S U B R O U T I N E

seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000:

002A 002A 002A 002A 002D 0030 0033 0036 0036 0036 0037 0037

sub 0 2A

proc near

sub 0 2A

call

call

retn endp

si, 211h sub 0 DD si, 2BAh sub 0 DD

S U B R O U T I N E

seg000:0037 seg000:0037 seg000:0037 seg000:0037 seg000:0037 seg000:0037 seg000:0038

sub 0 37

proc near

push push

auto a; a=0x10038;

while ((a=PrevFunction(a))!=-1) Message("%x \n",a);

10037 1002a 10000

Операнд

Пояснения

Линейный адрес

Return

Завершение

Пояснения

!=BADADDR

Линейный адрес начала предыдущей функции

BADADDR

Ошибка

long GetFunctionFlags(long ea);

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

Определение

Значение

Пояснения

FUNC NORET

0x00000001 L

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

FUNC FAR

0x00000002 L

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

FUNC LIB

0x00000004

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



FUNC STATIC

0x00000008 L

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

FUNC FRAME

0x00000010L

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

FUNC USERFAR

0x00000020 L

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

FUNC HIDDEN

0x00000040 L

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

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

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

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

seg000:2305 sub 0 2305

proc

near

seg000:2305

seg000:2306

call

sub 0 1CA

seg000:2309

ah, 4Ch

seg000:230B

seg000:230B sub 0 2305

endp

Message("%b \n",

GetFunctionFlags(0x12305)

Если в вашей ситуации это обстоятельство окажется критичным, то можно написать собственный скрипт, выполняющий такие проверки и устанавливающий атрибуты через вызов 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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 [ 54 ] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140