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

Long XrefType(void);

Эта функция возвращает тип перекрестной ссылки, которая была возвращена последним вызовом функций Rfirst, Rnext, RfirstB, RnextB, Dfirst, Dnext, DfirstB, DnextB.

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

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

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

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

Например:

seg000:014C loc_0_14C: ; CODE XREF: seg000:0148w

Rfirst(0x10148);

Message(“0x%X \n”,

XrefType()

);

0x15

Функция вернула тип dr_W, но это еще не дает возможности утверждать, что эта перекрестная ссылка указывает на данные.

Return

Пояснения

Тип перекрестной ссылки возращенной последним вызовом, манипулирующей с ней функции.

Точки входа архитектура точек входа

Поддержка точек входа (Entry Point) самый мало проработанный элемент архитектуры IDA. Причиной тому абсолютная ненужность их для пользователя. В большинстве случаев даже не требуется знать, что такое понятие есть и поддерживается IDA

С одной стороны, вполне логично, что каждый файл имеет некоторую точку, с которой начинается его выполнение, причем эта точка может не совпадать с началом файла. Например, exe файл может начинать выполнение с любой своей точки (между прочим, возможно даже выходящей за границы файла, - но это относиться к недокументированным особенностям MS-DOS совместимых операционных систем и поэтому не будет больше заострять на этом внимания)

Адрес регистра (регистров) – указателя команд в момент передачи управления загруженному файлу и называется точкой входа.

Таким образом, любой дизассемблер как минимум должен быть осведомлен, как вычислить этот адрес. Чаще всего он присутствует в заголовке файла (значит, дизассемблер должен понимать его формат), реже предполагается по умолчанию – так для com файлов он всегда расположен по адресу 0x100, но для бинарных файлов (дампов RAM, например), точка входа не может и вовсе не иметь смысла. Поскольку управление может быть передано на множество мест, в зависимости от обстоятельств.

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

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

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

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

Но разного рода извращенцам и маньякам этого очень мало. Например, при анализе ПЗУ сталкиваешься с тем, что код может начинать выполняться с десятков разных мест (например, обработчиков прерываний) и хорошим решением будет создать собственные точки входа (IDA, разумеется, бессильна их определить) и потом взаимодействовать с ними как интерактивно, так и программно (из скриптов).

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

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

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

МЕТОДЫ

Функция

Описание

Long GetEntryPointQty(void);

Возвращает число точке входа

success AddEntryPoint(long ordinal,long ea,char name,long makecode)

Добавляет новую точку входа

long GetEntryOrdinal(long index);

Возвращает ординал точки входа по ее индексу

long GetEntryPoint(long ordinal)

Возвращает адрес точки входа по ординулу

success RenameEntryPoint(long ordinal,char name);

Переименовывает точку входа

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