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


long IsUnion(long id);

Функция определяет тип структуры. Если она представляет собой объединение, то возвращается единица, и ноль в противном случае. Пример использования:

0000 union 13 0000 union 13

0000

union ; (sizeof=0x0) ends

Message("%x \n", IsUnion(

GetStrucIdByName("union 13")

0000 MY STRUC 0000 MY STRUC

struc ends

Message("%x \n", IsUnion(

GetStrucIdByName("MY STRUC")

ноль!

Обратите внимание, что функция в результате ошибки возвращает не BADADDR, а Например:

0000 MY STRUC 0000 MY STRUC

struc ends



Message("%x \n", IsUnion(

GetStrucIdByName("MYSTRUCT")

Не ясно, действительно ли структура MYSTRUCT не объединение, или же ее вообще не существует.

Поэтому достоверным значением, возращенным функцией, следует считать только единицу.

Операнд

Пояснения

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

Завершение

Пояснения

Return

Структура типа UNION

Структура не типа UNION или ошибка

success DelStruc(long id);

Функция удаляет существующую структуру по ее идентификатору. В большинстве случаев используется совместно с GetStrucIdxByName, поскольку ID структуры скрыт от пользователя.

Например:

0000 MY STRUC

0000 MY STRUC 0000

0000 ; 0000

0000 struc 10

0000 struc 10 0000

0000 ; 0000

0000 union 13

0000 union 13

struc ends

struc ends

union ends

DelStruc(

GetStrucIdByName("struc 10")

0000 MY STRUC 0000 MY STRUC 0000 0000 ; 0000

0000 union 13 0000 union 13 0000

struc ; ends

union ; ends



Обратите внимание, что при этом заново перестаиваются таблицы индексов структур, поэтому полученные ранее значения уже не действительны. Их необходимо обновить заново.

Так, например:

0000 MY STRUC

0000 MY STRUC 0000

0000 ; 0000

0000 struc 10

0000 struc 10 0000

0000 ; 0000

0000 union 13

0000 union 13

struc ends

struc ends

union ends

auto id1,id2;

id1= GetStrucId(0); id2= GetStrucId(1);

DelStruc(id1); DelStruc(id2);

0000 struc 10 0000 struc 10

struc ends

Вместо того, что бы удалить первые две структуры IDA удалила первую и третью. Но эта ошибка не IDA, а разработчика скрипта!

Действительно, когда была удалена первая структура, то по индексу 1 стала теперь расположена не вторая, а третья структура!

Однако, если попытаться сделать так:

auto id1,id2;

id1= GetStrucId(0);

DelStruc(id1);

id2= GetStrucId(1);

DelStruc(id2);

То получится то же самое! Индексы были обновлены, однако, этого оказалось мало! В действительности код должен выглядеть так:

auto id1,id2;

id1= GetStrucId(0); DelStruc(id1); id2= GetStrucId(0);



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