Анимация
JavaScript
|
Главная Библионтека dseg:0271 retn dseg:0271 checknull endp dseg:0272 ; Attributes: library function bp-based frame dseg:0272 dseg:0272 terminate proc
success SetFunctionFlags(long ea,long flags); Позволяет устанавливать атрибуты функции. Подробнее об этом было сказано в описании функции GetFunctionFlags.
Как уже отмечалось в описании функции 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;
Но вот установка флага FUNC HIDDEN приведет к незамедлительному сворачиванию функции и сброс соответственно, наоборот. SetFunctionFilegs 0x10272, GetFunctionFlags(0x10272) + 0x40; dseg:0272 ; [00000009 BYTES: COLLAPSED FUNCTION terminate. PRESS KEYPAD "+" TO EXPAND] char GetFunctionName(long ea); Возвращает имя функции. Если указанный адрес не принадлежит ни одной из функций, то возвращается пустая строка. Поскольку функции без имени не бывает, то неоднозначной ситуации не возникает.
Пример использования: 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 |