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

Long GetMemberQty(long id);

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

0000 _msExcept struc ;

0000 Magic dd ?

0004 Count dd ?

0008 InfoPtr dd ?

000C CountDtr dd ?

0010 DtrPtr dd ?

0014 _unk dd 3 dup(?)

0020 Info _msExcInfo 0 dup(?)

0020 _msExcept ends

Message("0x%X \n",

GetMemberQty(GetStrucIdByName("_msExcept"))

);

0x7

Операнд

Пояснения

id

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

Return

Завершение

Пояснения

!=BADADDR

Число членов структуры

==BADADDR

Ошибка

Long GetStrucNextOff(long id,long offset);

Функция возвращает смещение начала очередного элемента в структуре. Первый элемент всегда имеет нулевое смещение (что очевидно), а последний смещение численно равное размеру структуры минус единица.

Это происходит потому, что каждую структуру замыкает «виртуальный» элемент, который не видим для всех остальных функций (в том числе и GetMemberQty). Он был введен из соображений удобства программирования, и во всех остальных случаях может не браться в расчет.

Если неверно задан идентификатор или структура не содержит ни одного члена, то обоих случаях возвращается ошибка BADADDR

Например:

0000 _msExcept struc ; (sizeof=0x22)

0000

0000 Magic dd ?

0004 Count dd ?

0008 InfoPtr dd ?

000C CountDtr dd ?

0010 DtrPtr dd ?

0014 _unk dd 3 dup(?)

0020 Info dw ?

0022 _msExcept ends

auto a;

a=0;

for (;;)

{

Message("0x%X \n",a);

a=GetStrucNextOff

(GetStrucIdByName("_msExcept"),a);

if (a==-1) break;

}

0x0

0x4

0x8

0xC

0x10

0x14

0x20

0x22

0000 struc_9 struc ; (sizeof=0)

0000 struc_9 ends

Message("0x%X \n",

GetStrucNextOff(

GetStrucIdByName("struc_9"))

);

0xFFFFFFFFF

Числа, отображаемые IDA слева элементов структуры, и есть искомые смещения элементов. При этом необязательно, что бы каждому смещению соответствовал именованный элемент. Поскольку для доступа к членам структуры используются не имена, а смещения элементов, то IDA поддерживает и безыменные поля, которые могут оказаться полезными в ряде случаев.

0000 struc_3 struc ; (sizeof=0xd)

0000 field_0 dw ?

0002 db ? ; undefined

0003 field_3 dd ?

0007 field_7 db ?

0008 db ? ; undefined

0009 db ? ; undefined

000A db ? ; undefined

000B field_B db ?

000C field_C db ?

000D struc_3 ends

Членом структуры могут быть, в том числе, и массивы однотипных (гомогенных) элементов.

0000 struc_7 struc ; (sizeof=0x15)

0000 field_0 dd ?

0004 field_4 db 16 dup(?)

0014 field_14 db ?

0015 struc_7 ends

В этом случае очередным смещением будет смещение следующего элемента структуры.

Операнд

Пояснения

id

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

Return

Завершение

Пояснения

!=BADADDR

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

==BADADDR

Ошибка

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