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

Char GetMemberName(long id,long member_offset);

Функция возвращает имя члена структуры. Для этого необходимо задать идентификатор (ID) структуры и смещение интересующего нас элемента от ее начала (member_offset) Подробнее об этом можно почитать в описании функции GetStrucNextOff.

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

0000 MyStruc struc ; (sizeof=0x7)

0000 field_0 db ?

0001 field_1 dw ?

0003 field_3 dd ?

0007 MyStruc ends

auto a;

for (a=0;;)

{

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

a,

GetMemberName(

GetStrucIdByName("MyStruc"),a)

);

a=GetStrucNextOff(

GetStrucIdByName("MyStruc"),a

);

if (a==-1) break;

}

0x0 field_0

0x1 field_1

0x3 field_3

0x7

Очевидно, что код работает неправильно, и пытается возвратить на один элемент больше, чем содержит структура. Причина такого поведения заключается в том, что функция GetStrucNextOff возвращает смещение «виртуального» элемента, замыкающего структуру. И хотя IDA отображает его имя, как показано ниже, на самом деле виртуальный элемент не имеет никакого имени и не видим для всех остальных функций, кроме GetStrucNextOff, GetPrevNextOff

0007 MyStruc ends

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

В результате код должен выглядеть так:

auto a;

for (a=0;;)

{

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

a,

GetMemberName(

GetStrucIdByName("MyStruc"),a)

);

a=GetStrucNextOff(GetStrucIdByName("MyStruc"),a);

if (a>GetLastMember(GetStrucIdByName("MyStruc"))) break;

}

0x0 field_0

0x1 field_1

0x3 field_3

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

Этот может продемонстрировать следующий скрипт:

0000 MyStruc struc

0000 field_0 dw ?

0002 field_1 dw ?

0004 field_2 dw ?

0006 MyStruc ends

auto a;

for (a=0;;)

{

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

a,

GetMemberName(

GetStrucIdByName("MyStruc"),

a+1)

);

a=GetStrucNextOff(

GetStrucIdByName("MyStruc"),a

);

if (a==-1) break;

}

0x0 field_0

0x1 field_1

0x3 field_2

Операнд

Пояснения

id

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

member_offset

Смещение, лежащее в границах интересующего нас элемента

Return

Завершение

Пояснения

!=””

Имя члена структуры

==””

Ошибка

Char GetMemberComment(long id,long member_offset,long repeatable);

Функция возвращает комментарий, связанный с членом структуры. IDA поддерживает два типа комментариев – ‘regular’ и ‘repeatable’. Последний отличается тем, что дублируется по месту обращения к элементу обращения структуры. Однако в случае со структурами и их членами, IDA игнорирует это требование, в чем убеждает следующий пример:

0000 MyStruc struc ; (sizeof=0x4) ; XREF: seg000:0F72r

0000 field_0 dw ? ; My Repeatable comment

0002 field_1 dw ? ;

0004 MyStruc ends

seg000:0F72*stru_0_F72 dw 0 ; field_0 ; DATA XREF: sub_0_F56r

seg000:0F72* ; sub_0_2456+1Cw ...

seg000:0F72* dw 0 ; field_1

seg000:0F56 mov es, stru_0_F72.field_0

seg000:0F5A assume es:nothing

seg000:0F5A xor bx, bx

Остается только надеяться, что в будущем рано или поздно такая поддержка появится.

Операнд

Пояснения

id

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

member_offset

Смещение, лежащее в границах интересующего нас элемента

Repeatable

Флаг

Пояснения

0

Неповторяемый комментарий

1

Повторяемый комментарий

Return

Завершение

Пояснения

!=””

Комментарий

“”

Ошибка

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