Анимация
JavaScript
|
Главная Библионтека Если не указывать сегмент (а только одно смещение), то функция возьмет по умолчанию базовый сегмент файла. Например: Message("0x%x \n",AskAddr(0,"MyAddr")); <Ctrl-Enter> 123h <Enter> 0x10123 Если уж необходимо, что бы функция воспринимала ввод «как он есть», то следует вместо сегмента указать 0, как показано ниже: Очень полезна поддержка относительного адреса. Если перед вводимым числом указать знак, то возращенное функцией значение будет вычислено по следующей формуле: RetVal == ScreenEAO + EntVal То есть вычисляется адрес, относительно текущей позиции курсора. При этом полученное значение может выходить за рамки доступных адресов сегмента, - никакой проверки функция не обеспечивает, - эта задача ложится на плечи пользователя, то есть программиста, разрабатывающего скрипт. Например:
Message("0x%X \n",AskAddr(0, +4 0x132ED <Ctrl-Enter> <Enter> Обратите внимание, что если указать +0:4, то IDA будет трактовать такое выражение совершенно иначе! А именно, как абсолютный адрес. При этом отрицательные значения преобразуются в беззнаковое с учетом разрядности сегмента (16 или 32 бит), а переполнение «вверх» никак не отслеживается. Это дает возможность адресовать память, как в пределах сегмента, так и за ними.
Обратите внимание, что defval имеет значение long, а не char, и, следовательно, представляет собой линейный адрес, преобразование которого в сегментный ложится на плечи IDA. Логично, что было бы необходимо воспользоваться следующей формулой -seg = EntVal / 10 ; off = EntVal - seg, однако, до версии 4.0 IDA не выполняет никаких операций над адресом, используя нулевой сегмент, если только адрес невозможно представить комбинацией уже существующего сегмента и смещения. То есть, 0x10002 будет автоматически преобразовано IDA в seg000:2. При этом всегда проверяются принадлежность образовавшегося смещения к доступному диапазону адресов выбранного сегмента и в случае нарушении границ, никакого преобразования не происходит. long AskLong (long defval,char prompt); Функция запрашивает у пользователя ввод длинного целого числа. По умолчанию используется шестнадцатеричная система исчисления. Префикс x можно ставить, а можно не ставить - все равно число будет трактоваться как шестнадцатеричное. Отмена ввода или некорректный ввод приводит к возвращению ошибки BADADDR и, возможно, предупреждающему диалоговому окну, поясняющим источник ошибки.
Пример использования: AskLong(8 65 62,"MyLong");
long AskSeg (long defval,char prompt); Функция выводит диалог, запрашивающий ввод сегмента (селектора). Допустимо вводить имена сегментов с учетом регистра. Введенные селекторы автоматически не преобразуется адреса сегментов и эту операцию приходится выполнять вручную. В любом случае функция возвращает значение типа word, а не long. О факте выхода за допустимые границы IDA не сообщает, просто отбрасывая старшее слово введенного значения.
Обратите внимание, что defval имеет тип long, а не char. Поэтому непосредственная передача имени сегмента по умолчанию невозможна. Однако IDA автоматически подставляет его, если сегмент с заданным адресом уже существует. К сожалению, в IDA, включая версию 4.0, присутствует ошибка, в результате чего, вместо ожидаемого символьного имени сегмента выводится нечто нечитабельное и непечатаемое. AskSeg(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 |