Анимация
JavaScript
|
Главная Библионтека 0009 MY STRUC 0009 ends Message("0x%X \n", SetMemberType( GetStrucIdByName("MY STRUC"),
long SetMemberComment(long id,long member offset,char comment,long repeatable); Функция устанавливает комментарий, связанный с членом структуры. IDA поддерживает два типа комментариев - regular и repeatable. Последний отличается тем, что дублируется по месту обращения к элементу обращения структуры. Однако в случае со структурами и их членами, IDA игнорирует это требование, в чем убеждает следующий пример: 0000 MyStruc 0000 field 0 0002 field 1 0004 MyStruc struc ; (sizeof=0x4) dw ? dw ? ends seg000:0F72*stru 0 F72 seg000:0F72* seg000:0F72* dw 0 dw 0 ; field 0 ; field 1 XREF: seg000:0F72r My Repeatable comment DATA XREF: sub 0 F5 6r sub 0 2456+1CW ... seg000:0F56 seg000:0F5A seg000:0F5A mov es, stru 0 F72.field 0 assume es:nothing xor bx, bx Остается только надеяться, что в будущем рано или поздно такая поддержка появится.
ПЕРЕЧИСЛЕНИЯ ALMA MATER Организация перечислений очень близка к организации структур, поэтому рекомендуется ознакомиться с главой «структуры», - что бы не повторяться многие моменты при описании перечислений будут опущены, если они ничем не отличаются от описанных выше. Прежде всего, - что же такое перечисления? Грубо говоря, - это константы, то есть предопределенные символьные значения, которые в ходе ассемблирования заменяются действительными значениями. Использования непосредственных значений - дурной тон программирования. Как, например, на счет следующего кода: PUSH 10 PUSH 02 CALL GotoXY PUSH offset ProgramName CALL WriteLn Как нетрудно догадаться, числа 10 и 2 представляют собой экранные координаты, в которых будет выведено имя программы. Впрочем, если вы не автор этого фрагмента кода, то догадаться может быть вовсе не так просто, да и кроме того, что делать если придется переписывать программу для работы с другим экранным разрешением? Просматривать весь код на предмет поиска всех, относящихся к экранным координатам констант? Вот для этого в ассемблерах и появилась директива EQU, которая позволяла определить «говорящие» константы, которые не только повышали информативность листинга и заменяли комментарии. Но позволяла легко модифицировать их, - ведь теперь непосредственное значение указывалось только в одной точке. Разумеется, IDA поддерживает константы. Но делает не так, как это можно ожидать. Если все ассемблеры поддерживают исключительно глобальные списки констант, что часто вызывает путаницу, то IDA умеет «разбивать» их на отдельные кучки - каждая под своей «крышей» Внешне список констант напоминает структуру. Взгляните, в самом деле это очень похоже: ; enum enum 1 enum 1 0 = 3 enum 1 4 = 5 ; enum enum 3 enum 3 14E enum 3 0 enum 3 2D = 1 = 2Ch = 14Dh Однако, в отличие от структуры элементы перечисления не имеют ни типа, ни размера. Точнее тип определяется только на стадии ассемблирования. Так, например, если enum 1 0 равен трем, это еще не означает, что он имеет тип байт. Вполне вероятно, что он окажется словом или даже и словом и байтом одновременно, например: MOV AL, enum 1 0 CMP AX, enum 1 0 Этот код, не смотря на всю его чудаковатость, все же будет успешно ассемблирован! Но если нет типов, и не возможно вычислить размер членов, то как же тогда осуществить к ним доступ? Теоретически было можно условиться, что каждый член занимает 32 байта (двойное слово) и организовать к ним доступ точно так, как и в структурах. И это бы неплохо работало! Но разработчик IDA пошел по другому пути - он связал каждый член с идентификатором! Разумеется, существует функция, возвращающая идентификатор по имени функции и наоборот. В свете этого становиться еще более непонятым, какой смысл имеет «группировка» перечислений. Имена членов - глобальные, идентификаторы - тем более. Что же дает принадлежность элемента к той или иной группе? =[] = FFFFFFFF FFFFFFFF ; FFFFFFFF ; For bitfieldthe 1 FFFFFFFF ; FFFFFFFF FFFFFFFF ; eniin enun i FFFFFFFF enun l 0 enum J. 4 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF! FF En urns et a connent for the current item В каждой группе может существовать не более одной константы с одним и тем же значением. С первого взгляда не понятно ни как можно «жить» с этим, ни какие мотивы побудили принять разработчика такое нелепое ограничение. Однако, на самом деле это следствия выбранной архитектуры. И весьма удачной, стоит только взглянуть на нее изнутри, чем мы сейчас и займемся. 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 |