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

Long AddStrucEx(long index,char name,long is_union);

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

Поддерживаются следующие типы структур:

Флаг is_union

Значение

1

Структура типа «Объединение» UNION

0

Структура по умолчанию

С точки зрения IDA оба типа абсолютно идентичны и работа с один из них ничем не отличается от другого.

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

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

0000 struc_3 struc

0000 field_0 dw ?

0002 field_2 db ?

0003 field_3 dw ?

0005 struc_3 ends

0000 struc_4 union

0000 field_0 dw ?

0002 field_2 db ?

0003 field_3 dw ?

0005 struc_3 ends

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

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

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

В остальном же на имена наложены точно такие ограничения, как и на метки. Необходимо помнить, что IDA различает строчечные и заглавные буквы, поэтому имена ‘MyStruc’ и “MYSTRUC” для нее два разных имени и могут быть присвоены двум структурами.

0000 MyStruc struc ; (sizeof=0x0)

0000 MyStruc ends

0000

0000 ; -------------------------------------

0000

0000 MYSTRUC struc ; (sizeof=0x0)

0000 MYSTRUC ends

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

Индекс структуры обычно устанавливают равным BADADDR – при этом IDA добавляет новую структуру в конец списка, автоматически расширяя последний.

Например:

0000 struc_10 struc ; (sizeof=0x0)

0000 struc_10 ends

0000

0000 ; --------------------------------------

0000

0000 struc_11 struc ; (sizeof=0x0)

0000 struc_11 ends

AddStrucEx(-1,"MYSTRUC",0);

0000 struc_10 struc ;

0000 struc_10 ends

0000

0000 ; ---------------------

0000

0000 struc_11 struc ;

0000 struc_11 ends

0000

0000 ; ---------------------

0000

0000 MYSTRUC struc ;

0000 MYSTRUC ends

0000

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

Например:

0000 struc_10 struc ; (sizeof=0x0)

0000 struc_10 ends

0000

0000 ; --------------------------------------

0000

0000 struc_11 struc ; (sizeof=0x0)

0000 struc_11 ends

AddStrucEx(0,"MY_STRUC",0);

0000 MY_STRUC struc ;

0000 MY_STRUC ends

0000

0000 ; ---------------------

0000

0000 struc_10 struc ;

0000 struc_10 ends

0000

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

Например:

0000 struc_10 struc ; (sizeof=0x0)

0000 struc_10 ends

0000

0000 ; --------------------------------------

0000

0000 struc_11 struc ; (sizeof=0x0)

0000 struc_11 ends

Message(“0x%X \n”,

AddStrucEx(0x22,"MY_STRUC",0)

);

0xFFFFFFFF

Операнд

Пояснения

index

==index

Действие

[0,MaxIdx]

Индекс структуры (старая структура при этом будет затерта)

MaxIdx+1

Индекс новой структуры

BADADDR

Индекс новой структуры

name

Имя струкуры

Is_union

==is_union

Значение

1

Структура типа «Объединение» UNION

0

Структура по умолчанию

Return

Завершение

Пояснения

!=BADADDR

Идентификатор структуры

==BADADDR

Элемент не является структурой

Интерактивно создать структуру можно вызвав командой меню ~ View \ Structures список всех структур и нажав <INS>

Появиться следующее диалоговое окно:

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