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


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, хотя это и следовало бы.

Операнд

Пояснения

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

Comment

Комментарий

Repeatable

Флаг

Пояснения

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

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

Return

==return Пояснения

==1 Успешное завершение

==0 Ошибка



long AddStrucMember(long id,char name,long offset,long flag, long typeid,long nbytes);

Добавляет нового члена к ранее созданной структуре, заданной ее идентификатором ID.

Членом структуры может быть ASCII строка, ячейка или другая структура, заданная ее идентификатором.

Тип добавляемого члена структуры определяется флагом flag следующим образом:

Определение

Значение

Пояснения

FF BYTE

0x00000000L

Байт

FF WORD

0x10000000L

Слово

FF DWRD

0x20000000L

Двойное слово

FF QWRD

0x30000000L

Четвертное слово

FF TBYT

0x40000000L

Восьмерное слово

FF ASCI

0x50000000L

ASCII строка

FF STRU

0x60000000L

Структура

FF RESERVED

0x70000000L

Зарезервировано

FF FLOAT

0x80000000L

Float

FF DOUBLE

0x90000000L

Double

FF PACKREAL

0xA0000000L

Packed decimal real

FF ALIGN

0xB0000000L

Директива выравнения

В зависимости от состояния флага, значение аргумента typeid может трактоваться по разному.

Состояние flag

Значение typeid

FF STRU

ID структуры

FF ASCII

Тип ASCII строки (см. таблицу ниже)

Другое

BADADDR

Обратите внимание, что если новый член структуры не представляет собой ни вложенную структуру, ни ASCII строку, то аргумент typeid должен быть равен BADADDR

Определение

Значение

Пояснения

ASCSTR C

ASCSTR TERMCHR

C-style ASCII string

ASCSTR TERMCHR

Character-terminated ASCII string

ASCSTR PASCAL

Pascal-style ASCII string (length byte)

ASCSTR LEN2

Pascal-style, length has 2 bytes

ASCSTR UNICODE

Unicode string

ASCSTR LEN4

Pascal-style, length has 4 bytes

Таким образом, тип нового члена структуры определяется сразу двумя аргументами.



Аргумент 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