Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Long SetStrucComment(long id,char comment,long repeatable);

Функция возвращает комментарии к структуре. В текущих версиях, включая IDA 4.0, комментарии к структурам поддерживаются лишь частично. Так, например, отсутствует возможность интерактивного комментирования функций (приходится пользоваться вызовом SetStuctComment), повторяемые комментарии поддерживаются лишь частично, что подтверждается следующим примером:

SetStrucComment(

GetStrucIdByName("_msExcInfo"),

" MyComment",1);

0000 ; MyComment

0000 _msExcInfo struc ; (sizeof=0x8) ; XREF: .rdata:004077E6

0000 ; .rdata:00407780r ...

0000 Id dd ? ; sss

0004 Proc dd ? ; offset (FFFFFFFF)

0008 _msExcInfo ends

.rdata:004077E6 dd 1879048192 ; Id

.rdata:004077E6 dd 0 ; Pro

Обратите внимание, что IDA не отобразила повторяемый комментарий в строке rdata:004077E6, хотя это и следовало бы.

Операнд

Пояснения

id

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

Comment

Комментарий

Repeatable

Флаг

Пояснения

0

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

1

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

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

0

Character-terminated ASCII string

ASCSTR_PASCAL

1

Pascal-style ASCII string (length byte)

ASCSTR_LEN2

2

Pascal-style, length has 2 bytes

ASCSTR_UNICODE

3

Unicode string

ASCSTR_LEN4

4

Pascal-style, length has 4 bytes

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

Аргумент offset указывает смещение элемента в структуре. Как уже было рассказано в описании предыдущих функций, доступ к членам структуры осуществляется по их смещению.

Что бы добавить новый член к структуре достаточно в качестве смещения указать BADADDR и тогда IDA вычислит его автоматически.

Например:

0000 MYSTRUC struc

0000 field_0 db ?

0001 MYSTRUC ends

AddStrucMember(

GetStrucIdByName("MYSTRUC"),

"MyMember",

-1,

FF_WORD,

-1,

2);

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,

-1,

2);

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

"MyMember2",

3,

FF_WORD,

-1,

2)

);

0000 MYSTRUC struc ; (sizeof=0x3)

0000 field_0 db ?

0001 MyMember dw ?

0003 MYSTRUC ends

0xFFFFFFFE

Возникает вопрос – «а для чего тогда был введен аргумент смещение?» На самом деле он может быть равен не только смещению последнего элемента. Дело в том, что при удалении членов структуры, IDA не изменяет смещения остальных. Она просто преобразует удаляемые члены в неопределенные байты, на месте которых могут быть созданы новые.

Например:

0000 MYSTRUC struc ; (sizeof=0x6)

0000 field_0 db ?

0001 MyMember4 db ?

0002 db ? ; undefined

0003 db ? ; undefined

0004 db ? ; undefined

0005 field_5 db ?

0006 MYSTRUC ends

AddStrucMember(

GetStrucIdByName("MYSTRUC"),

"MyMember4",

3,

FF_WORD,

-1,

2)

0000 MYSTRUC struc ; (sizeof=0x6)

0000 field_0 db ?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]