Анимация
JavaScript
|
Главная Библионтека 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
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
long PrevFunction(long ea) Вызов возвращает линейный адрес предыдущий функции. Что бы получить адрес последней функции необходимо вызвать PrevFunction(BADADDR).
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
long GetFunctionFlags(long ea); Вызов GetFunctionFlags позволяет узнать атрибуты функции. Назначение отдельных битов в возвращаемом значении показано в таблице ниже.
Подробнее о каждом атрибуте будет рассказано ниже. FUNC NORET Этот атрибут устанавливается тем функциям, что не возвращают управления командой ret. Однако в большинстве случаев IDA автоматически не присваивает его. Так, например, в следующей функции он не установлен.
Если в вашей ситуации это обстоятельство окажется критичным, то можно написать собственный скрипт, выполняющий такие проверки и устанавливающий атрибуты через вызов 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 |