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

Взаимодействие с пользователем alma mater

Изначально IDA проектировалась, как интерактивная среда, то есть тесно взаимодействующая с пользователем.

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

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

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

Вот для этого и существует набор специальных функций, ютящихся под одной крышей, только потому, что они попали под критерий «взаимодействие с пользователем». В отличие от всех, описанных выше, они не относятся к какому-то определенному объекту и не понятно какой частью архитектуры IDA они являются.

Но… они есть, и следовательно, будут тщательно рассмотрены о описаны. Для облегчения понимания введем некоторую дополнительную классификацию, хотя она, конечно, будет весьма условна.

Итак, одна группа функций взаимодействует с курсором на экране. Что есть курсор с точки зрения IDA? Это указатель текущей строки, которая связана с некоторым объектом, точнее с линейным адресом его начала.

То есть при работе с курсором IDA не рассматривает его экранные координаты, а только линейный адрес памяти, на который этот курсор указывает.

Часто бывает так, что несколько строк расположены по одному и тому же линейному адресу.

Например:

.text:00401020

.text:00401020 ; _______________ S U B R O U T I N E _______________________________________

.text:00401020

.text:00401020 ; Attributes: library function bp-based frame

.text:00401020

.text:00401020 public start

.text:00401020 start proc near

.text:00401020

.text:00401020 var_20 = dword ptr -20h

.text:00401020 var_1C = dword ptr -1Ch

.text:00401020 var_18 = dword ptr -18h

.text:00401020 var_14 = dword ptr -14h

.text:00401020 var_4 = dword ptr -4

.text:00401020

.text:00401020 push ebp

Все эти стоки совершенно идентичны с точки зрения IDA, поэтому в которой бы из них не находился курсор, при попытке определить его положение, всегда вернется адрес 0х401020, что в общем-то неудивительно.

Но вот далеко не однозначно, на какую строку переместится курсор при попытке изменить его положение. Оказывается, что на первую в которой присутствует инструкция или команда.

Впрочем, это относится к тем тонкостям реализации, сохранность которых в последующих версиях не гарантируется. Но, с другой стороны, скорее всего не будет изменяться, поскольку это решение выглядит достаточно логичным.

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

Этим заведуют всего две функции, - SelStart и SelEnd. К сожалению, выделение программно доступно «Только на чтение» и выделить регион самостоятельно скрипт не может.

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

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

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

МЕТОДЫ

Функция

Назначение

char AskStr (char defval,char prompt)

Запрашивает у пользователя строку

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

Создает диалоговое окно для выбора имени файла

long AskAddr (long defval,char prompt)

Запрашивает у пользователя адрес

long AskLong (long defval,char prompt)

Запрашивает у пользователя число типа long

long AskSeg (long defval,char prompt

Запрашивает сегмент у пользователя

char AskIdent (char defval,char prompt);

Запрашивает у пользователя ввод имени идентификатора

long AskYN (long defval,char prompt)

Создает модальный диалог Yes \ No \ Cancel

void Message (char format,...);

Выводит строку в окно сообщений

void Warning (char format,...)

Функция выводит предупреждающий диалог

void Fatal (char format,...)

Выводит фатальный диалог

long ScreenEA ();

Возвращает линейный адрес строки, на которой стоит курсор

long SelStart ();

Возвращает линейный адрес начала выделенной области

long SelEnd ();

Возвращает линейный адрес конца выделенной области

success Jump (long ea)

Изменяет позицию курсора в окне дизассемблера

void Wait ();

Функция ожидает конца автоанализа

long AddHotkey(char hotkey, char idcfunc);

Добавляет новую горячую клавишу

success DelHotkey(char hotkey);

Удаляет горячую клавишу

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