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

Флаг

Пояснения

Repeatable

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

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

Завершение

Пояснения

Return

Комментарий

Ошибка

long GetMemberSize(long id,long member offset);

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

Например:

0000 MyStruc

0000 field 0

0001 field 1

0003 field 3

0007 field 7

OOOF field F

0019 MyStruc

struc ; (sizeof=0x19) db

ends

auto a;

for (a=0;;) {

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

GetMemberSize(

GetStrucIdByName("MyStruc"), a));

a=a+GetMemberSize(

GetStrucIdByName("MyStruc"), a);

if (a>GetLastMember(

GetStrucIdByName("MyStruc")) ) break;

0x0 0x1

0x1 0x2

0x3 0x4 0x7 0x8

OxF OxA

Операнд

Пояснения

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

member offset

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

Return

Завершение Пояснения



!=BADADDR

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

==BADADDR

Ошибка

0000 0000 0001 0003 0007

000F

0012 0012 0000 0000 0000 0001 0003

MyStruc

field 0 field 1 field 3 field 7 field F

MyStruc

ChldStruc field 0 field 1 ChldStruc

; (sizeof=0x12)

struc

db ? dw ? dd ?

dq ?

ChldStruc ?

ends

struc ; (sizeof=0x3)

db ? dw ?

ends

auto a;

for (a=0;;)

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

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

0000 field 0

0002 field 2

0004 field 4

0006 field 6

0008 field 8

0011 struc 1 0011

0000 ; 0000

0000 struc 2

0000 field 0

0011 struc 2 0011

struc ; (sizeof=0x11)

dw ? dw ? dw ? dw ?

struc 2 0 dup(?)

ends

struc ; (sizeof=0x11)

struc 1 ?

ends

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

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

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

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

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

0000 struc 2 0000 field 0 0011 struc 2

struc ; (sizeof=0x11)

struc 1 ?

ends

Message("%x \n", GetMemberStrId(

GetStrucIdByName("struc 2"),0x0)

ff0000f8

Операнд

Пояснения

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

member offset

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

Return

Завершение

Пояснения

!=BADADDR

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

==BADADDR

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



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