Анимация
JavaScript
|
Главная Библионтека 0x10 0x14 0x20 0x22 Message("0x%X \n", GetLastMember( GetStrucIdByName(" msExcept")) 0x20 Если неверно задан идентификатор или структура не содержит ни одного члена, то обоих случаях возвращается ошибка 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
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 Остается только надеяться, что в будущем рано или поздно такая поддержка появится.
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 |