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

Void DelEnum(long enum_id);

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

Пример:

FFFFFFFF ; enum enum_1

FFFFFFFF enum_1_0 = 1

FFFFFFFF enum_1_2 = 2

FFFFFFFF

FFFFFFFF ; ----------------------------

FFFFFFFF

FFFFFFFF ; enum enum_2

FFFFFFFF MyEnum = 16h

FFFFFFFF

DelEnum(

GetEnum("enum_2")

);

FFFFFFFF ; enum enum_1

FFFFFFFF enum_1_0 = 1

FFFFFFFF enum_1_2 = 2

FFFFFFFF

Операнд

Пояснения

Enum_id

Идентификатор перечисления

Интерактивно перечисление можно удалить, установив курсор на любой его элемент и нажав клавишу <DEL>

Success SetEnumIdx(long enum_id,long idx);

Функция позволяет изменять индекс перечисления в списке. При этом перечисления меняются местами, и затирания не происходит.

Например:

FFFFFFFF ; enum enum_1

FFFFFFFF enum_1_0 = 1

FFFFFFFF enum_1_2 = 2

FFFFFFFF

FFFFFFFF ; ---------------------------

FFFFFFFF

FFFFFFFF ; enum MyNewEnum

FFFFFFFF MyNewEnum_0 = 0

FFFFFFFF

FFFFFFFF ; ---------------------------

FFFFFFFF

FFFFFFFF ; enum enum_9

FFFFFFFF enum_9_0 = 0

SetEnumIdx(

GetEnum("enum_1"),1

);

FFFFFFFF ; enum MyNewEnum

FFFFFFFF MyNewEnum_0 = 0

FFFFFFFF

FFFFFFFF ; ---------------------------------

FFFFFFFF

FFFFFFFF ; enum enum_1

FFFFFFFF enum_1_0 = 1

FFFFFFFF enum_1_2 = 2

FFFFFFFF

FFFFFFFF ; ---------------------------------

FFFFFFFF

FFFFFFFF ; enum enum_9

FFFFFFFF enum_9_0 = 0

FFFFFFFF

Операнд

Пояснения

id

Идентификатор (ID) перечисления

Return

==return

Пояснения

==1

Успешное завершение

==0

Ошибка

Fixup alma mater

Более привычным синонимом fixup вероятно, окажется термин «перемещаемые элементы».

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

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

Покажем это на небольшом примере, MS-DOS exe файла.

Просмотр с помощью HIEW

00000200: B80100 mov ax,00001

00000203: 8ED8 mov ds,ax

00000205: B409 mov ah,009 ;"

00000207: BA0000 mov dx,00000

0000020A: CD21 int 021

Просмотр с помощью IDA

seg000:0000 start proc near

seg000:0000 mov ax, 1001h

seg000:0003 mov ds, ax

seg000:0005 assume ds:dseg

seg000:0005 mov ah, 9

seg000:0007 mov dx, 0

seg000:000A int 21h

Что грузиться в регистр AX? С виду непосредственное значение. Однако, это не так. Если приглядеться, то можно увидеть, что дальше оно помещается в регистр DS и, следовательно, скорее всего указывает на сегмент данных программы.

То есть 0x1 это адрес сегмента данных выраженный в параграфах. Знакомым с архитектурой IBM PC может показаться, с чего бы это вдруг он казался расположенным глубоко в таблице векторов прерываний. Но ничего странного нет. И сегмент данных расположен вовсе не там, где можно было бы подумать.

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

По умолчанию IDA загружает exe файлы по адресу 0x10000. Следовательно, считая в параграфах, 0x1000+0x1 == 0x1001, как видим, результат совпадает с тем, что отобразила IDA.

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

00000000: 4D 5A 2C 00-02 00 02 00-20 00 00 00-FF FF 00 00 MZ, __

00000010: 00 00 00 00-00 00 00 00-3E 00 00 00-01 00 FB 71 > _q

00000020: 6A 72 00 00-00 00 00 00-00 00 00 00-00 00 00 00 jr

00000030: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 01 00

00000040: 00 00 0D 00-00 00 00 00-00 00 00 00-00 00 00 00

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

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

Если же обратиться к другим платформам, а не замыкаться на серии Intel 80x86, то мы столкнемся с феейверком самых разных технических решений от которого может быстро зарябить в глазах.

Каким же образом IDA может поддерживать все это одним махом? Ведь перемещаемыми элементами управляют меньше десяти функций.

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

Вот этот операнд ссылается туда. И все! Этого достаточно, что бы обеспечить нормальную функциональность и работоспособность!

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

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

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

Большинство, использующих IDA, этой возможности ни когда в своей жизни не использовали (ну, может быть, разве что из любопытства). И это правильно.

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

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

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

Основная трудность описания перемещаемых элементов в объяснении их типов. А они то же разными бывают. Причем большая часть существует только на других платформах и совершенно чужда пользователям PC с Windows и Pentium. А поэтому описывать их подробно в этой книге совершенно бессмысленно.

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

Поэтому ниже на типе перемещаемых элементах внимание акцентироваться не будет.

МЕТОДЫ

Функция

Назначение

long GetNextFixupEA(long ea)

Возвращает линейный адрес следующего перемещаемого элемента

long GetPrevFixupEA(long ea)

Возвращает линейный адрес предыдущего перемещаемого элемента

long GetFixupTgtType(long ea)

Тип перемещаемого элемента

long GetFixupTgtSel(long ea)

Возвращает селектор перемещаемого элемента

long GetFixupTgtOff(long ea)

Возвращает смещение перемещаемого элемента

void SetFixup(long ea,long type,long targetsel,long targetoff,long displ)

Добавляет новый перемещаемый элемент

void DelFixup(long ea)

Функция удаляет перемещаемый элемент

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