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

0x10

0x14

0x20

0x22

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

GetStrucIdByName(" msExcept"))

0x20

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

Операнд

Пояснения

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

Return

Завершение

Пояснения

!=BADADDR

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

==BADADDR

Ошибка

char GetMemberName(long id,long member offset);

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

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

0000 MyStruc 0000 field 0

0001 field 1 0003 field 3 0007 MyStruc

db ?

struc ; (sizeof=0x7)

dw ? dd ?

ends

auto a;

for (a=0;;) {

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

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",

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 0000 field 0 0002 field 1 0004 field 2

0006 MyStruc auto a;

for (a=0;;) {

dw ?

struc

dw ? dw ?

ends



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

GetMemberName(

GetStrucIdByName("MyStruc"),

a+1)

a=GetStrucNextOff(

GetStrucIdByName("MyStruc"),a

if (a==-1) break;

0x0 field 0 0x1 field 1 0x3 field 2

Операнд

Пояснения

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

member offset

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

Return

Завершение

Пояснения

!=""

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

==""

Ошибка

char GetMemberComment(long id,long member offset,long repeatable);

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

0000 MyStruc 0000 field 0 0002 field 1

0004 MyStruc

struc ; (sizeof=0x4) dw ? dw ?

ends

XREF: seg000:0F72r My Repeatable comment

seg000:0F72*stru 0 F72 dw 0 ; field 0

seg000:0F72*

seg000:0F72* dw 0 ; field 1

DATA XREF: sub 0 F5 6r sub 0 2456+1Cw ...

seg000:0F56 seg000:0F5A seg000:0F5A

mov es, stru 0 F72.field 0 assume es:nothing

xor bx, bx

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

Операнд

Пояснения

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

member offset

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



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