Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Long IsUnion(long id);

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

Пример использования:

0000 union_13 union ; (sizeof=0x0)

0000 union_13 ends

0000

Message("%x \n",

IsUnion(

GetStrucIdByName("union_13")

)

);

1

0000 MY_STRUC struc

0000 MY_STRUC ends

Message("%x \n",

IsUnion(

GetStrucIdByName("MY_STRUC")

)

);

0

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

Например:

0000 MY_STRUC struc

0000 MY_STRUC ends

Message("%x \n",

IsUnion(

GetStrucIdByName("MYSTRUCT")

)

);

0

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

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

Операнд

Пояснения

id

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

Return

Завершение

Пояснения

==1

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

==0

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

Success DelStruc(long id);

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

Например:

0000 MY_STRUC struc

0000 MY_STRUC ends

0000

0000 ; --------------------

0000

0000 struc_10 struc

0000 struc_10 ends

0000

0000 ; --------------------

0000

0000 union_13 union

0000 union_13 ends

DelStruc(

GetStrucIdByName("struc_10")

);

0000 MY_STRUC struc ;

0000 MY_STRUC ends

0000

0000 ; ----------------------

0000

0000 union_13 union ;

0000 union_13 ends

0000

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

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

0000 MY_STRUC struc

0000 MY_STRUC ends

0000

0000 ; --------------------

0000

0000 struc_10 struc

0000 struc_10 ends

0000

0000 ; --------------------

0000

0000 union_13 union

0000 union_13 ends

auto id1,id2;

id1= GetStrucId(0);

id2= GetStrucId(1);

DelStruc(id1);

DelStruc(id2);

0000 struc_10 struc

0000 struc_10 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);

DelStruc(id2);

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

Вместо этого лучше получить идентификаторы структуры по их имени, вызовом функции GetStrucIdByName

Операнд

Пояснения

id

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

Return

==return

Пояснения

==1

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

==0

Ошибка

Для того, что бы интерактивно удалить функцию достаточно вызвать их список командой меню ~ View \ Structures, а затем, встав на любой элемент структуры предназначенной для удаления, нажать DEL

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]