Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Char AskStr (char defval,char prompt);

Функция создает и выводит модальный диалог ввода строки. Используется в скриптах, тесно взаимодействующими с пользователем.

В консольной версии окно будет выглядеть следующим образом:

AskStr(“MyDefaultString”,”MyPromt”);

А в графической версии приглашения ввода выглядит так:

операнд

Пояснения

defval

Значение по умолчанию

promt

Пояснение, которое будет выведено в диалоговом окне

Return

Завершение

Пояснения

!=””

Строка

“”

Ошибка

Если пользователь откажется от ввода и нажмет <Esc> или Cancel, то функция возвратит пустую строку, а не значение по умолчанию.

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

auto s;

s="";

while(s!="-")

{

s=AskStr(s,"Ваше имя?");

Message

("Добрый деньь (утро, вечер, ночь!) %s! \n",s);

}

Char AskFile (long forsave,char mask,char prompt);

Функция выдает диалоговое окно, предназначенное для выбора файла, оснащенное минимальными средствами навигации.

Внешний вид окна для консольной и GUI версий, естественно различен. И в последнем случае у пользователя значительно больше возможностей и свободы действий.

Флаг ‘forsave’, вероятно, должен был уточнять тип окна – на отктыие файла или на запись. За кажущейся идентичностью (и то и другое окно с точни зрения пользователя выгдядит одинаково) скрыта большая разница. Окно выбора файла для записи должно само запрашивать подтверждение, если запрошенный файл уже существет.

IDA, однако, это не делает не зависимо от значения флага forsave. И в любом случае не выдает никаких подтверждений, если указанный файл уже существует.

Если пользователь откажется от выбора и нажмет <Esc> или CANCEL – функция вернет пустую строку. В противном случае имя файла.

Эта функция поддерживает длинные имена Windows 95\Windows NT 4.0, и это следует учитывать при операциях с именами файлов (например, синтаксическом разборе)

операнд

пояснения

forsave

Флаг, выбора типа диалога. Не поддерживается в настоящих версиях

mask

Маска для выбора отображаемых в окне файлов

promt

Заголовок окна

Return

Завершение

Пояснения

!=””

Имя файла

“”

Ошибка

Пример использования (два приведенные выше окна были созданы с помощью вызова)

AskFile(0,”*.*”,”MyPromt”);

Long AskAddr (long defval,char prompt);

Функция выводит модальный диалог, запрашивающий у пользователя ввод адреса в формате segment : offset. Если сегмент указан, то функция вернет значение, вычисленное по следующей формуле.

Value == segment << 4 + offset

При этом функция позволяет указывать не только адреса, но и имена сегментов, вычисляя при этом адреса автоматически (обратите внимание, что при этом необходимо соблюдать регистр).

Например:

Message (“%x \n”, AskAddr(0,”MyPromt”));

[seg000:0]

10000

Но вот уже [Seg000:0] приведет к выводу диалога, предупреждающего о неверно введенном адресе, а функция возвратит ошибку BADADDR.

Если не указывать сегмент (а только одно смещение), то функция возьмет по умолчанию базовый сегмент файла.

Например:

Message(“0x%x \n”,AskAddr(0,”MyAddr”)); <Ctrl-Enter>

123h <Enter>

0x10123

Если уж необходимо, что бы функция воспринимала ввод «как он есть», то следует вместо сегмента указать ‘0’, как показано ниже:

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

RetVal == ScreenEA() + EntVal

То есть вычисляется адрес, относительно текущей позиции курсора. При этом полученное значение может выходить за рамки доступных адресов сегмента, - никакой проверки функция не обеспечивает, - эта задача ложится на плечи пользователя, то есть программиста, разрабатывающего скрипт.

Например:

seg000:32E8> db 21h ;

seg000:32E9 db 0 ;

seg000:32E9 seg000 ends :

Message(“0x%X \n”,AskAddr(0,””)); <Ctrl-Enter>

+4 <Enter>

0x132ED

Обратите внимание, что если указать ‘+0:4’, то IDA будет трактовать такое выражение совершенно иначе! А именно, как абсолютный адрес.

При этом отрицательные значения преобразуются в беззнаковое с учетом разрядности сегмента (16 или 32 бит), а переполнение «вверх» никак не отслеживается. Это дает возможность адресовать память, как в пределах сегмента, так и за ними.

Операнд

Пояснения

defval

Значение по умолчанию (long)

promt

Заголовок окна

Return

Завершение

Пояснения

!=BADADRR

Адрес

“”

Ошибка

Обратите внимание, что ‘defval’ имеет значение long, а не char, и, следовательно, представляет собой линейный адрес, преобразование которого в сегментный ложится на плечи IDA. Логично, что было бы необходимо воспользоваться следующей формулой – seg = EntVal / 10 ; off = EntVal – seg, однако, до версии 4.0 IDA не выполняет никаких операций над адресом, используя нулевой сегмент, если только адрес невозможно представить комбинацией уже существующего сегмента и смещения. То есть, ‘0x10002’ будет автоматически преобразовано IDA в ‘seg000:2’. При этом всегда проверяются принадлежность образовавшегося смещения к доступному диапазону адресов выбранного сегмента и в случае нарушении границ, никакого преобразования не происходит.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]