Анимация
JavaScript
|
Главная Библионтека
IDA поддерживает возможность быстрого перемещения между отдельными фрагментами дизассемблируемого текста с сохранением позиции курсора и относительного положения текста в окне. Для запоминания текущей позиции необходимо нажать <Alt-N>, а для вызова списка всех запомненных ранее позиций <Ctrl-N>. При этом возникнет следующего вида диалоговое окно: IDA позволяет формировать содержание этого списка не только интерактивно, но и с помощью функций встроенного языка. Это может быть удобно в тех случаях, когда скрипт в результате анализа возвращает требующие внимания со стороны пользователя линейные адреса. Чаще всего их просто выводят в окно сообщений, но это плохое решение. Гораздо удобнее вывести их в список быстрых переходов. void MarkPosition(long ea,long lnnum,long x,long y,long slot,char comment); Функция добавляет новый элемент в список быстрых переходов. Каждый элемент характеризуется следующим набором атрибутов. Прежде всего, это линейный адрес строки, в которой расположен курсор. Поскольку, часто по одному и тому же адресу расположено несколько строк, то атрибут lnnum указывает на требуемую строку, считая от нуля. Позиция курсора по горизонтали, начиная от левого края окна, задается атрибутом x, а y по вертикали, считая от верхней границы окна. Поскольку курсор жестко связан с выбранной строкой, то IDA прокручивает текст в окне дизассемблера на требуемую величину. Положение элемента в списке определяется атрибутом Slot. Он может принимать любые значения в интервале от 1 до 20. Элементы не обязательно должны следовать друг за другом. Однако IDA не уничтожает пустые элементы в списке и поэтому задача их упорядочивания ложится на плечи разработчиков скрипта. Ситуация осложняется тем, что существует только один глобальный список, разделяемый одновременно как пользователем, так и всеми скриптами. Прежде, чем заносить новый элемент рекомендуется проверить, что требуемый слот свободен. Если указать слот, выходящий за допустимые границы, то IDA выведет интерактивный диалог для его выбора. Рассмотрим это подробнее на следующем примере: [ ] IDA view-A 2=[ ]=я seg000:0122 Т pop seg000:0123 pop seg000:0124 pop seg000:0125 pop seg000:0126 retn seg000:0126 sub 0 PD endp seg000:0126 У seg000:0127 j dx cx bx ax seg000:0127 ; S U B R O U T I N E seg000:0127 «---X--2-Lnnum I proc near ; CODE XREF: call sub 0 DD retn endp seg000:0127 sub 0 127 seg000:0127 seg000:012A seg000:012A sub 0 127 seg000:012A seg000:012B I seg000:012B ; S U B R O U T I N E II seg000:012B seg000:012B seg000:012B sub 0 12B seg000:012B seg000:012C seg000:012D proc near ; CODE XREF: push ax push si push di И-0001012C: sub 0 12B+1 -И MarkPosition(0x10127, 4, 26, 12,1, "MyMark"); Допустимо существование двух и более объектов по одному и тому же линейному адресу, поскольку IDA идентифицирует их по номеру слота. Операнд Пояснения lnnum Линейный адрес начала строки Номер линии, располагающейся по тому же адресу начиная с нуля
long GetMarkedPos(long slot); Функция возвращает линейный адрес закладки по указанному slot. Подробнее о закладках можно прочитать в описании функции SetMarkedPos. Например: auto a; for (a=1;a<21;a++) if (GetMarkedPos(a)!=-1) Message("0x%X \n", GetMarkedPos(a)); 0x1005A 0x10037 0x100A7 0x10392 Обратите внимание, что следующий код не является корректным: auto a,x; a=0; 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 |