Анимация
JavaScript
|
Главная Библионтека
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
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
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 |