Анимация
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

dseg:0271 retn

dseg:0271 checknull endp

dseg:0272 ; Attributes: library function bp-based frame

dseg:0272

dseg:0272 terminate proc

Операнд

Пояснения

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

Return

Завершение

Пояснения

!=BADADDR

Набор атрибутов функции (смотри таблицу выше)

BADADDR

Ошибка

success SetFunctionFlags(long ea,long flags);

Позволяет устанавливать атрибуты функции. Подробнее об этом было сказано в описании функции GetFunctionFlags.

Операнд

Пояснения

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

flag

Атрибуты функции (смотри таблицу в описании GetFunctionFlags)

Return

Завершение

Пояснения

!=BADADDR

Набор атрибутов функции (смотри таблицу выше)

BADADDR

Ошибка

Как уже отмечалось в описании функции SetFunctionFlags, часто IDA автоматически не распознает функции, не возвращающие управления (нет команды ref в завершении функции).

Если это критично, то нужный атрибут можно установить вручную. Покажем это на следующем примере:

dseg: dseg: dseg: dseg: dseg: dseg: dseg: dseg: dseg: dseg: dseg:

0272 0272 0272 0272 0272 0272 0272 0274 0276 0279 0279

; Attributes: library function bp-based frame

terminate arg 0

terminate

SetFunctionFilegs

proc near = byte ptr

mov mov mov int endp

0x10272,

GetFunctionFlags(0x10272)

; COD

bp, sp ah, 4Ch

al, [bp+arg 0]

DOS AL



dseg:0272 ; Attributes: library function noreturn bp-based frame dseg:0272

proc near

dseg:0272 terminate

dseg:0272 dseg:0272 arg 0 dseg:0272 dseg:0272 dseg:0274 dseg:0276 dseg:0279

dseg:0279 terminate

; CODE XREF: sub 0 3C7+4 4p

= byte ptr 2

mov mov mov

endp

bp, sp

ah, 4Ch ; L al, [bp+arg 0]

DOS - 2+ - QUIT WITH EXIT AL = exit code

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

SetFunctionFilegs

0x10272,

GetFunctionFlags(0x10272)

0x10;

dseg:0272 ; Attributes:

library

function

dseg:0272

dseg:0272 terminate

proc near

; CODE XREF: sub 0 3C7+44p

dseg:0272

dseg:0272 arg 0

= byte

ptr 2

dseg:0272

dseg:0272

bp, sp

dseg:0274

ah, 4Ch ; L

dseg:0276

al, [bp+arg 0]

dseg:0279

; DOS - 2+ - QUIT WITH EXIT

dseg:0279 terminate

endp

; AL = exit code

Но вот установка флага FUNC HIDDEN приведет к незамедлительному сворачиванию функции и сброс соответственно, наоборот.

SetFunctionFilegs

0x10272,

GetFunctionFlags(0x10272) + 0x40;

dseg:0272 ; [00000009 BYTES: COLLAPSED FUNCTION terminate. PRESS KEYPAD "+" TO EXPAND]

char GetFunctionName(long ea);

Возвращает имя функции. Если указанный адрес не принадлежит ни одной из функций, то возвращается пустая строка.

Поскольку функции без имени не бывает, то неоднозначной ситуации не возникает.

Операнд

Пояснения

Любой линейный адрес, принадлежащий функции

Return

Завершение Пояснения



Имя функции

Ошибка

Пример использования:

dseg:025E cleanup proc near

dseg:025E mov es, cs:DGROUP@

dseg:0263 push si

dseg:0264 push di

Message("%s \n", GetFunctionName(0x10263)

cleanup

void SetFunctionCmt(long ea, char cmt, long repeatable);

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

Существует возможность повторять тот же комментарий в точке вызова функции (так называемый repeatable comment). Для этого необходимо установить флаг repeatable равным единице.

Например:

SetFunctionCmt(0x10271,"Hello IDA 4.0",1);

dseg:0271 ; Hello IDA 4.0 dseg:0271 ; Attributes: static

dseg:0271

dseg:0271 checknull proc near ; CODE XREF:

sub 0 3C7+2Cp

dseg:0271 retn

dseg:0271 checknull endp

Если перейти по перекрестной ссылке к месту вызова функции, то там будет можно обнаружить следующее:

dseg:03F0 call restorezero

dseg:03F3 call checknull ; Hello IDA

dseg:03F6 cmp [bp+arg 2], 0

dseg:03FA jnz loc 0 40F

Если в строке комментария будет присутствовать символ переноса, то экран будет выглядеть так:

SetFunctionCmt(0x10271,"Hello \nIDA 4.0",1);



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