Анимация
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

0009 MY STRUC

0009

ends

Message("0x%X \n", SetMemberType(

GetStrucIdByName("MY STRUC"),

FF BYTE,

0000

MY STRUC

struc

; (sizeof=0x9)

0000

field 0

dw ?

0002

field 2

db ?

0003

db ? ;

undefined

0004

field 4

dw ?

0006

field 6

dw ?

0008

MyGoodMember

db ?

0009

MY STRUC

ends

Операнд

Пояснения

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

name

Имя структуры

Offset

==offset

Значение

!=BADADDR

Смещение нового члена структуры

==BADADDR

Добавить новый член в конец

flag

Новый тип члена

typeid

Идентификатор структуры или тип ASCII-строки

Nbytes

Размер нового члена в байтах

Return

==return

Пояснения

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

Ошибка (см коды завершения выше)

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



Остается только надеяться, что в будущем рано или поздно такая поддержка появится.

Операнд

Пояснения

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

comment

Комментарий члена

member offset

Смещение, лежащее в границах интересующего нас элемента

Repeatable

Флаг

Пояснения

Неповторяемый комментарий

Повторяемый комментарий

Return

==return

Пояснения

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

Ошибка (см коды завершения выше)

ПЕРЕЧИСЛЕНИЯ 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