Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 [ 86 ] 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

long AddStrucEx(long index,char name,long is union);

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

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

Флаг is union

Значение

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

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

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

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

кода).

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

0000

struc

struc

0000

field

dw ?

0002

field

db ?

0003

field

dw ?

0005

struc

ends

0000

struc

union

0000

field

dw ?

0002

field

db ?

0003

field

dw ?

0005

struc

ends

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

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

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

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

0000 MyStruc 0000 MyStruc 0000 0000 ; 0000

struc ; (sizeof=0x0) ends



0000 MYSTRUC 0000 MYSTRUC

struc ; (sizeof=0x0) ends

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

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

Например:

0000 struc 10

0000 struc 10 0000

0000 ; 0000

0000 struc 11

0000 struc 11

struc ; (sizeof=0x0) ends

struc ; (sizeof=0x0) ends

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

0000 struc 10

0000 struc 10 0000

0000 ; 0000

0000 struc 11

0000 struc 11 0000

0000 ; 0000

0000 MYSTRUC

0000 MYSTRUC 0000

struc ends

struc ends

struc ends

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

Например:

0000 struc 10

0000 struc 10 0000

0000 ; 0000

0000 struc 11

0000 struc 11

struc ; (sizeof=0x0) ends

struc ; (sizeof=0x0) ends

AddStrucEx(0,"MY STRUC",0);

0000 MY STRUC

0000 MY STRUC 0000

0000 ; 0000

0000 struc 10

struc ends

struc ;



0000 struc 10 0000

ends

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

0000 struc 10

0000 struc 10 0000

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

0000 struc 11

0000 struc 11

struc ; (sizeof=0x0) ends

struc ; (sizeof=0x0) ends

Message("0x%X \n", AddStrucEx(0x22,"MY STRUC",0)

0xFFFFFFFF

Операнд

Пояснения

index

==index

Действие

[0,MaxIdx]

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

MaxIdx+1

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

BADADDR

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

name

Имя струкуры

Is union

==is union

Значение

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

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

Return

Завершение

Пояснения

!=BADADDR

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

==BADADDR

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

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

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




0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 [ 86 ] 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140