Анимация
JavaScript
|
Главная Библионтека long SetStrucComment(long id,char comment,long repeatable); Функция возвращает комментарии к структуре. В текущих версиях, включая IDA 4.0, комментарии к структурам поддерживаются лишь частично. Так, например, отсутствует возможность интерактивного комментирования функций (приходится пользоваться вызовом SetStuctComment), повторяемые комментарии поддерживаются лишь частично, что подтверждается следующим примером: SetStrucComment( GetStrucIdByName(" msExcInfo"), " MyComment",1); 0000 ; MyComment 0000 msExcInfo 0000 0000 Id 0004 Proc 0008 msExcInfo struc ; (sizeof=0x8) dd ? dd ? ends XREF: .rdata:004077E6 .rdata:00407780r ... sss offset (FFFFFFFF) rdata:004077E6 rdata:004077E6 dd 1879048192 dd 0 Id Pro Обратите внимание, что IDA не отобразила повторяемый комментарий в строке rdata:004077E6, хотя это и следовало бы.
long AddStrucMember(long id,char name,long offset,long flag, long typeid,long nbytes); Добавляет нового члена к ранее созданной структуре, заданной ее идентификатором ID. Членом структуры может быть ASCII строка, ячейка или другая структура, заданная ее идентификатором. Тип добавляемого члена структуры определяется флагом flag следующим образом:
В зависимости от состояния флага, значение аргумента typeid может трактоваться по разному.
Обратите внимание, что если новый член структуры не представляет собой ни вложенную структуру, ни ASCII строку, то аргумент typeid должен быть равен BADADDR
Таким образом, тип нового члена структуры определяется сразу двумя аргументами. Аргумент offset указывает смещение элемента в структуре. Как уже было рассказано в описании предыдущих функций, доступ к членам структуры осуществляется по их смещению. Что бы добавить новый член к структуре достаточно в качестве смещения указать BADADDR и тогда IDA вычислит его автоматически. Например: 0000 MYSTRUC struc 0000 field 0 db ? 0001 MYSTRUC ends AddStrucMember( GetStrucIdByName("MYSTRUC"), "MyMember", FF WORD, -1, 0000 MYSTRUC struc ; (sizeof=0x3) 0000 field 0 db ? 0001 MyMember dw ? 0003 MYSTRUC ends Однако, то же значение можно вычислить и самостоятельно: 0000 MYSTRUC struc 0000 field 0 db ? 0001 MYSTRUC ends AddStrucMember( GetStrucIdByName("MYSTRUC"), "MyMember", GetLastMember( GetStrucIdByName("MYSTRUC") FF WORD, 0000 MYSTRUC struc ; (sizeof=0x3) 0000 field 0 db ? 0001 MyMember dw ? 0003 MYSTRUC ends Но так или иначе, при попытке указать смещение, принадлежащие уже существующему члену функция вернет ошибку. 0000 MYSTRUC struc ; (sizeof=0x3) 0000 field 0 db ? 0001 MyMember dw ? 0003 MYSTRUC ends Message("0x%X \n", AddStrucMember( GetStrucIdByName("MYSTRUC"), 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 |