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

Long GetMemberSize(long id,long member_offset);

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

Например:

0000 MyStruc struc ; (sizeof=0x19)

0000 field_0 db ?

0001 field_1 dw ?

0003 field_3 dd ?

0007 field_7 dq ?

000F field_F dt ?

0019 MyStruc ends

auto a;

for (a=0;;)

{

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

a,

GetMemberSize(

GetStrucIdByName("MyStruc"),

a));

a=a+GetMemberSize(

GetStrucIdByName("MyStruc"),

a);

if (a>GetLastMember(

GetStrucIdByName("MyStruc"))

) break;

}

0x0 0x1

0x1 0x2

0x3 0x4

0x7 0x8

0xF 0xA

Операнд

Пояснения

id

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

member_offset

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

Return

Завершение

Пояснения

!=BADADDR

Размер члена структуры в байтах

==BADADDR

Ошибка

0000 MyStruc struc ; (sizeof=0x12)

0000 field_0 db ?

0001 field_1 dw ?

0003 field_3 dd ?

0007 field_7 dq ?

000F field_F ChldStruc ?

0012 MyStruc ends

0012

0000

0000 ChldStruc struc ; (sizeof=0x3)

0000 field_0 db ?

0001 field_1 dw ?

0003 ChldStruc ends

auto a;

for (a=0;;)

{

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

a,

GetMemberStrId(

GetStrucIdByName("MyStruc"),

a));

a=a+GetMemberSize(

GetStrucIdByName("MyStruc"),

a);

if (a>GetLastMember(

GetStrucIdByName("MyStruc"))

) break;

}

0x0 0xFFFFFFFF

0x1 0xFFFFFFFF

0x3 0xFFFFFFFF

0x7 0xFFFFFFFF

0xF 0xFF0000FB

Long GetMemberStrId(long id,long member_offset);

Функция возвращает ID элемента структуры, если он является структурой или BADADDR в противном случае.

То есть, IDA поддерживает вложенные структуры, и дает возможность получить идентификатор, для нисходящего разбора.

Вложение при этом может быть как угодно глубоким и вложенные структуры могут содержать ссылки друг на друга.

Например:

0000 struc_1 struc ; (sizeof=0x11)

0000 field_0 dw ?

0002 field_2 dw ?

0004 field_4 dw ?

0006 field_6 dw ?

0008 field_8 struc_2 0 dup(?)

0011 struc_1 ends

0011

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

0000

0000 struc_2 struc ; (sizeof=0x11)

0000 field_0 struc_1 ?

0011 struc_2 ends

0011

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

На самом деле максимальная глубина вложенности равна единице! То есть IDA всего-навсего поддерживает членов типа «структура» и умеет возвращать их ID. Все остальное ложиться на плечи программиста, пишущего скрипт.

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

Так, в приведенном выше примере, при попытке вывести полный перечень членов структуры, включая вложенные, получиться бесконечный рекурсивный спуск и скрипт «зависнет»

Однако, по-видимому, все же не стоит усложнять код, а просто лишь быть внимательным в отношении вложенных структур и не допускать подобных ситуаций.

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

0000 struc_2 struc ; (sizeof=0x11)

0000 field_0 struc_1 ?

0011 struc_2 ends

Message("%x \n",

GetMemberStrId(

GetStrucIdByName("struc_2"),0x0)

);

ff0000f8

Операнд

Пояснения

id

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

member_offset

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

Return

Завершение

Пояснения

!=BADADDR

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

==BADADDR

Элемент не является структурой

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