Анимация
JavaScript
|
Главная Библионтека long AddStrucEx(long index,char name,long is union); Функция позволяет создавать новую структуру. Для этого необходимо указать ее имя (которое впоследствии может быть изменено) и тип, который в дальнейшем уже не может быть изменен. Поддерживаются следующие типы структур:
С точки зрения IDA оба типа абсолютно идентичны и работа с один из них ничем не отличается от другого. Однако, различия проявляются при ассемблировании листинга. При необходимости ассемблер может располагать члены структуры по удобным для него адресам, вставляя незначимые байты, например, для выравнивания (что ускоряет работу кода). Разумеется, что во многих случаях это недопустимо и просто развалит всю программу. Для предотвращения этого и была введена поддержка типа «объединение», которая отличается от обычной структуры лишь тем, что ассемблер всегда ее оставляет в неприкосновенности и гарантирует, что смещения членов относительно друг друга всегда останутся неизменными.
Какой тип выбрать при создании структуры должен решать сам пользователь. Чаще всего взаимное расположение элементов в структуре некритично, поскольку ассемблер автоматически вычисляет смещение каждого члена. Но если речь идет о структуре, выражающей, скажем, заголовок файла, то в этом случае любые отклонения от жестко заданных смещений приведут к неправильной работе программы, а следовательно, для работы с ними необходимо использовать тип «объединение» При этом структуры оба типа разделяют общее пространство имен. Другими словами невозможно создать структуру, совпадающую по имени с уже существующим объединением. В остальном же на имена наложены точно такие ограничения, как и на метки. Необходимо помнить, что 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
Интерактивно создать структуру можно вызвав командой меню ~ 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 |