Анимация
JavaScript
|
Главная Библионтека "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"),
; (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 Эта функция практически единственная, способная возвращать расширенный код ошибки, не только указывающий на неуспешное завершение вызова, но еще и определяющий его источник. Все возможные коды возврата приведены в таблице ниже:
должны находится в конце
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 |