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

"MyMember2",

FF WORD,

0000 MYSTRUC

0000 field 0

0001 MyMember 0003 MYSTRUC

struc ; (sizeof=0x3) db ? dw ? ends

0xFFFFFFFE

Возникает вопрос - «а для чего тогда был введен аргумент смещение?» На самом деле он может быть равен не только смещению последнего элемента. Дело в том, что при удалении членов структуры, IDA не изменяет смещения остальных. Она просто преобразует удаляемые члены в неопределенные байты, на месте которых могут быть созданы новые.

Например:

0000 MYSTRUC

0000 field 0

0001 MyMember4 0002

0003 0004

0005 field 5

0006 MYSTRUC

struc ; (sizeof=0x6)

db ? db ?

db ? ; undefined db ? ; undefined db ? ; undefined

db ?

ends

AddStrucMember( GetStrucIdByName("MYSTRUC"),

"MyMember4",

FF WORD,

0000

MYSTRUC

struc

0000

field 0

db ?

0001

MyMember4

db ?

0002

db ? ;

0003

MyMember2

dw ?

0005

field 5

db ?

0006

MYSTRUC

ends

0006

; (sizeof=0x6)

; undefined

Последний аргумент nbytes задает размер нового члена структуры в байтах. С первого взгляда это бессмысленно, поскольку и так ясно из типа члена (смотри определения flag), за исключением, правда может быть ASCII строки, но и та в большинстве случаев определяется завершающим символом или типом, указанном в typeid.

На самом деле этот аргумент необходимо указывать всегда. Он должен быть кратен размеру члена структуры и если это отношение больше единицы, то IDA автоматически создает массив однотипных элементов.



Например:

0000 MY STRUC 0008 MY STRUC

struc ; (sizeof=0x8) ends

AddStrucMember(

GetStrucIdByName("MY STRUC"),

"MyMember 1",

FF WORD, -1,

0000 MY STRUC 0000 MyMember 1 0008 MY STRUC

struc ; (sizeof=0x8

dw 4 dup(?)

ends

Если попробовать указать не кратный размер, то вызов функции завершится ошибкой:

0000 MY STRUC 0000 MyMember 1 0008 MY STRUC

struc ; (sizeof=0x8 dw 4 dup(?) ends

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

GetStrucIdByName("MY STRUC"), "MyMember 2",

FF WORD,

0000 MY STRUC 0000 MyMember 1 0008 MY STRUC

struc ; (sizeof=0x8

dw 4 dup(?) ends

0xFFFFFFFD

Эта функция практически единственная, способная возвращать расширенный код ошибки, не только указывающий на неуспешное завершение вызова, но еще и определяющий его источник.

Все возможные коды возврата приведены в таблице ниже:

Определение

Значение

STRUC ERROR MEMBER NAME

Заданное имя уже существует

STRUC ERROR MEMBER OFFSET

Смещение принадлежит другому члену

STRUC ERROR MEMBER SIZE

Неверный аргумент nbyte

STRUC ERROR MEMBER TINFO

Неверный аргумент typeid

STRUC ERROR MEMBER STRUCT

Неверный id структуры

STRUC ERROR MEMBER UNIVAR

Объединение не может иметь членов, переменного размера

STRUC ERROR MEMBER VARLAST

Члены переменного размера



должны находится в конце

Операнд

Пояснения

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

name

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

Offset

==offset

Значение

!=BADADDR

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

==BADADDR

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

flag

Тип нового члена

typeid

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

nbytes

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

Return

==return

Пояснения

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

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

long DelStrucMember(long id,long member offset);

Функция удаляет члена структуры, заданной идентификатором. Доступ к члену обеспечивается указанием любого принадлежащего ему смещения.

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

Например:

0000 MY STRUC

0000 MyMember 1

0008 field 8

0009 field 9 000B MY STRUC

struc ; (sizeof=0xb) dw 4 dup(?)

db ? dw ?

ends

DelStrucMember( GetStrucIdByName("MY STRUC"),

0000 MY STRUC

0000 0001 0002 0003 0004 0005 0006 0007

0008 field 8

0009 field 9 000B MY STRUC

struc

db db db db db db db db db

dw ends

; (sizeof=0xb) undefined undefined undefined undefined undefined undefined undefined undefined

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

Пример:

0000 MY STRUC

struc ; (sizeof=0xb)



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