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

Архитектура перечислений

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

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

Однако, перечисления – это не просто иная форма отображения операнда на экране – с точки зрения IDA это элемент bTree, который может ссылаться на линейный адрес, объекта… впрочем, не стоит повторяться, об этом уже писалось выше.

Но если каждый сегмент (имя, комментарий, функция) связан только с одним линейным адресом, то одно и то же перечисление может повторяться в десятке разных мест! И поэтому старые методы для него не подходят!

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

Точно то же происходит и с перечислениями. Есть список перечислений, на который ссылается объект. Элементы списка просматриваются до тех пор, пока не найдется элемент совпадающий по значению с операндом, объекта.

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

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

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

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

При этом разумно стремиться к уменьшению числа списков, поскольку, как уже говорилось выше, для представления операнда в виде перечисления достаточно сослаться на список, и IDA самостоятельно подберет нужный элемент!

В идеале, если у нас всего один список (что бывает достаточно часто) необходимо перевести курсор на нужную строку и нажать <T>, как IDA все сделает автоматически.

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

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

МЕТОДЫ

Функция

Назначение

long GetEnumQty(void)

Возвращает число типов перечислений

long GetnEnum(long idx)

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

long GetEnumIdx(long enum_id);

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

long GetEnum(char name)

Возвращает идентификатор перечисления по его имени

char GetEnumName(long enum_id)

Возвращает имя перечисления по его идентификатору

char GetEnumCmt(long enum_id,long repeatable

Возвращает комментарий перечисления

long GetEnumSize(long enum_id)

Возвращает число членов перечисления

long GetEnumFlag(long enum_id)

Возвращает флаги, определяющие представление элементов перечисления

long GetConstByName(char name)

Возвращает идентификатор константы по ее имени

long GetConstValue(long const_id)

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

char GetConstName(long const_id)

Возвращает имя константы по ее идентификатору

char GetConstName(long const_id)

Возвращает комментарий константы по ее идентификатору

long AddEnum(long idx,char name,long flag)

Добавляет новое перечисление

void DelEnum(long enum_id)

Удаляет перечисление

success SetEnumIdx(long enum_id,long idx)

Задает индекс перечисления в списке

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