Главная страница
Навигация по странице:

  • IsUnion ( GetStrucIdByName("union_13") ) );1 0000 MY_STRUC struc 0000 MY_STRUC ends Message("%x \n", IsUnion(

  • 0000 struc_11 struc ; (sizeof=0x0) 0000 struc_11 ends

  • GetLastMember( GetStrucIdByName("MYSTRUC") )

  • 0000 MyMember_1 dw 4 dup()

  • Описание функций встроенного языка


    Скачать 2.86 Mb.
    НазваниеОписание функций встроенного языка
    Анкорobraz_mihlenia_-_dizassembler_IDA
    Дата29.09.2022
    Размер2.86 Mb.
    Формат файлаpdf
    Имя файлаobraz_mihlenia_-_dizassembler_IDA.pdf
    ТипСправочник
    #704305
    страница26 из 39
    1   ...   22   23   24   25   26   27   28   29   ...   39

    AddStrucEx(0x22,"MY_STRUC",0)
    );
    0xFFFFFFFF
    Операнд
    Пояснения
    ==index
    Действие
    [0,MaxIdx]
    Индекс структуры (старая структура при этом будет затерта)
    MaxIdx+1
    Индекс новой структуры index
    BADADDR
    Индекс новой структуры name
    Имя струкуры
    ==is_union
    Значение
    1
    Структура типа «Объединение» UNION
    Is_union
    0
    Структура по умолчанию
    Завершение
    Пояснения
    !=BADADDR
    Идентификатор структуры
    Return
    ==BADADDR
    Элемент не является структурой
    Интерактивно создать структуру можно вызвав командой меню

    View \ Structures список всех структур и нажав
    Появиться следующее диалоговое окно:

    264
    long IsUnion(long id);
    Функция определяет тип структуры. Если она представляет собой объединение, то возвращается единица, и ноль в противном случае.
    Пример использования:
    0000 union_13 union ; (sizeof=0x0)
    0000 union_13 ends
    0000
    Message("%x \n",
    IsUnion(
    GetStrucIdByName("union_13")
    )
    );
    1 0000 MY_STRUC struc
    0000 MY_STRUC ends
    Message("%x \n",
    IsUnion(
    GetStrucIdByName("MY_STRUC")
    )
    );
    0
    Обратите внимание, что функция в результате ошибки возвращает не BADADDR, а
    ноль!
    Например:
    0000 MY_STRUC struc
    0000 MY_STRUC ends

    265
    Message("%x \n",
    IsUnion(
    GetStrucIdByName("MYSTRUCT")
    )
    );
    0
    Не ясно, действительно ли структура MYSTRUCT не объединение, или же ее вообще не существует.
    Поэтому достоверным значением, возращенным функцией, следует считать только единицу.
    Операнд
    Пояснения id Идентификатор (ID) структуры
    Завершение
    Пояснения
    ==1
    Структура типа UNION
    Return
    ==0
    Структура не типа UNION или ошибка
    success DelStruc(long id);
    Функция удаляет существующую структуру по ее идентификатору. В большинстве случаев используется совместно с GetStrucIdxByName, поскольку ID структуры скрыт от пользователя.
    Например:
    0000 MY_STRUC struc
    0000 MY_STRUC ends
    0000 0000 ; --------------------
    0000 0000 struc_10 struc
    0000 struc_10 ends
    0000 0000 ; --------------------
    0000 0000 union_13 union
    0000 union_13 ends
    DelStruc(
    GetStrucIdByName("struc_10")
    );
    0000 MY_STRUC struc ;
    0000 MY_STRUC ends
    0000 0000 ; ----------------------
    0000 0000 union_13 union ;
    0000 union_13 ends
    0000

    266
    Обратите внимание, что при этом заново перестаиваются таблицы индексов структур, поэтому полученные ранее значения уже не действительны. Их необходимо обновить заново.
    Так, например:
    0000 MY_STRUC struc
    0000 MY_STRUC ends
    0000 0000 ; --------------------
    0000 0000 struc_10 struc
    0000 struc_10 ends
    0000 0000 ; --------------------
    0000 0000 union_13 union
    0000 union_13 ends auto id1,id2; id1= GetStrucId(0); id2= GetStrucId(1);
    DelStruc(id1);
    DelStruc(id2);
    0000 struc_10 struc
    0000 struc_10 ends
    Вместо того, что бы удалить первые две структуры IDA удалила первую и третью.
    Но эта ошибка не IDA, а разработчика скрипта!
    Действительно, когда была удалена первая структура, то по индексу 1 стала теперь расположена не вторая, а третья структура!
    Однако, если попытаться сделать так: auto id1,id2; id1= GetStrucId(0);
    DelStruc(id1); id2= GetStrucId(1);
    DelStruc(id2);
    То получится то же самое! Индексы были обновлены, однако, этого оказалось мало! В действительности код должен выглядеть так: auto id1,id2; id1= GetStrucId(0);
    DelStruc(id1); id2= GetStrucId(0);

    267
    DelStruc(id2);
    Из этого примера следует, что бы не усложнять себе жизнь не стоит пользоваться индексами структур, особенно при операциях удаления.
    Вместо этого лучше получить идентификаторы структуры по их имени, вызовом функции GetStrucIdByName
    Операнд Пояснения id Идентификатор (ID) структуры
    ==return Пояснения
    ==1
    Успешное завершение
    Return
    ==0
    Ошибка
    Для того, что бы интерактивно удалить функцию достаточно вызвать их список командой меню View \ Structures, а затем, встав на любой элемент структуры предназначенной для удаления, нажать DEL
    long SetStrucIdx(long id,long index);
    Эта функция позволяет изменить индекс структуры заданной ее идентификатором.
    Может использоваться для упорядочивания структур в списке.
    Индекс может принимать значения от нуля до максимального индекса структуры.
    При этом две структуры обмениваются местами, и затирания не происходит.
    Например:
    0000 MY_STRUC struc ; (sizeof=0x0)
    0000 MY_STRUC ends
    0000 0000 ; --------------------------------------
    0000 0000 union_13 union ; (sizeof=0x0)
    0000 union_13 ends
    0000 0000 ; --------------------------------------
    0000
    0000 struc_11 struc ; (sizeof=0x0)
    0000 struc_11 ends
    0000 0000 ; --------------------------------------
    0000 0000 MYSTRUC struc ; (sizeof=0x0)
    0000 MYSTRUC ends
    SetStrucIdx(
    GetStrucIdByName("MY_STRUC"),
    2);
    0000 union_13 union ; (sizeof=0x0)
    0000 union_13 ends
    0000 0000 ; -----------------------------------------

    268 0000 0000 struc_11 struc ; (sizeof=0x0)
    0000 struc_11 ends
    0000 0000 ; -----------------------------------------
    0000 0000 MY_STRUC struc ; (sizeof=0x0)
    0000 MY_STRUC ends
    0000 0000 ; -----------------------------------------
    0000 0000 MYSTRUC struc ; (sizeof=0x0)
    0000 MYSTRUC ends
    Если заданный индекс больше максимально допустимого, то считается, что был указан последний существующий индекс.
    Например:
    0000 union_13 union ; (sizeof=0x0)
    0000 union_13 ends
    0000 0000 ; -----------------------------------------
    0000 0000 struc_11 struc ; (sizeof=0x0)
    0000 struc_11 ends
    0000 0000 ; -----------------------------------------
    0000 0000 MY_STRUC struc ; (sizeof=0x0)
    0000 MY_STRUC ends
    0000 0000 ; -----------------------------------------
    0000 0000 MYSTRUC struc ; (sizeof=0x0)
    0000 MYSTRUC ends
    0000
    SetStrucIdx(
    GetStrucIdByName("MY_STRUC"),
    44
    );
    0000 union_13 union ; (sizeof=0x0)
    0000 union_13 ends
    0000 0000 ; -------------------------------------------
    0000 0000 struc_11 struc ; (sizeof=0x0)
    0000 struc_11 ends
    0000 0000 ; -------------------------------------------
    0000 0000 MYSTRUC struc ; (sizeof=0x0)
    0000 MYSTRUC ends
    0000 0000 ; -------------------------------------------
    0000 0000 MY_STRUC struc ; (sizeof=0x0)

    269 0000 MY_STRUC ends
    Операнд Пояснения id Идентификатор (ID) структуры
    ==return Пояснения
    ==1
    Успешное завершение
    Return
    ==0
    Ошибка
    long SetStrucName(long id,char name);
    Функция позволяет изменить имя структуры, заданной по ее идентификатору.
    Например:
    0000 union_13 union ;
    0000 union_13 ends
    SetStrucName(
    GetStrucIdByName("union_13"),
    "MyGoodRenamedStruc");
    0000 MyGoodRenamedStruc union ; (sizeof=0x0)
    0000 MyGoodRenamedStruc ends
    Операнд Пояснения id Идентификатор (ID) структуры name Имя структуры
    ==return Пояснения
    ==1
    Успешное завершение
    Return
    ==0
    Ошибка
    Интерактивно переименовать функцию можно, вызвав список всех структур командой меню View \ Structures, затем переместить курсор в начало выбранной структуры и нажать

    270
    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 Комментарий
    Флаг
    Пояснения
    0
    Неповторяемый комментарий
    Repeatable
    1
    Повторяемый комментарий
    ==return Пояснения
    ==1
    Успешное завершение
    Return
    ==0
    Ошибка

    271
    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
    Таким образом, тип нового члена структуры определяется сразу двумя аргументами.

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

    273
    "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 ?
    0001 MyMember4 db ?
    0002 db ? ; undefined
    0003 MyMember2 dw ?
    0005 field_5 db ?
    0006 MYSTRUC ends
    0006
    Последний аргумент nbytes задает размер нового члена структуры в байтах. С первого взгляда это бессмысленно, поскольку и так ясно из типа члена (смотри определения flag), за исключением, правда может быть ASCII строки, но и та в большинстве случаев определяется завершающим символом или типом, указанном в typeid.
    На самом деле этот аргумент необходимо указывать всегда. Он должен быть кратен размеру члена структуры и если это отношение больше единицы, то IDA автоматически создает массив однотипных элементов.

    274
    Например:
    0000 MY_STRUC struc ; (sizeof=0x8)
    0008 MY_STRUC ends
    AddStrucMember(
    GetStrucIdByName("MY_STRUC"),
    "MyMember_1",
    -1,
    FF_WORD,
    -1,
    8
    );
    0000 MY_STRUC struc ; (sizeof=0x8)
    0000 MyMember_1 dw 4 dup(?)
    0008 MY_STRUC ends
    Если попробовать указать не кратный размер, то вызов функции завершится ошибкой:
    0000 MY_STRUC struc ; (sizeof=0x8)
    0000 MyMember_1 dw 4 dup(?)
    0008 MY_STRUC ends
    Message("0x%X \n",
    AddStrucMember(
    GetStrucIdByName("MY_STRUC"),
    "MyMember_2",
    -1,
    FF_WORD,
    -1,
    9
    )
    );
    0000 MY_STRUC struc ; (sizeof=0x8)
    0000 MyMember_1 dw 4 dup(?)
    0008 MY_STRUC ends
    0xFFFFFFFD
    Эта функция практически единственная, способная возвращать расширенный код ошибки, не только указывающий на неуспешное завершение вызова, но еще и определяющий его источник.
    Все возможные коды возврата приведены в таблице ниже:
    Определение
    Значение
    STRUC_ERROR_MEMBER_NAME -1
    Заданное имя уже существует
    STRUC_ERROR_MEMBER_OFFSET -2
    Смещение принадлежит другому члену
    STRUC_ERROR_MEMBER_SIZE -3
    Неверный аргумент nbyte
    STRUC_ERROR_MEMBER_TINFO -4
    Неверный аргумент typeid
    STRUC_ERROR_MEMBER_STRUCT -5
    Неверный id структуры
    STRUC_ERROR_MEMBER_UNIVAR -6
    Объединение не может иметь членов, переменного размера
    STRUC_ERROR_MEMBER_VARLAST -7 Члены переменного размера

    275
    должны находится в конце
    Операнд Пояснения id Идентификатор (ID) структуры name Имя структуры
    ==offset
    Значение
    !=BADADDR
    Смещение нового члена структуры
    Offset
    ==BADADDR
    Добавить новый член в конец flag Тип нового члена typeid Идентификатор структуры или тип ASCII-строки nbytes Размер нового члена в байтах
    ==return Пояснения
    ==1
    Успешное завершение
    Return
    ==0
    Ошибка (см коды завершения выше)
    long DelStrucMember(long id,long member_offset);
    Функция удаляет члена структуры, заданной идентификатором. Доступ к члену обеспечивается указанием любого принадлежащего ему смещения.
    Однако, на самом деле IDA не удаляет члена структуры, а только преобразует его в последовательность неопределенных байтов. Поэтому, строго говоря, удалить ни какой член структуры (кроме последнего) нельзя, во всяком случае, так, что бы изменить смещения всех остальных (а это требуется и довольно часто!)
    Например:
    0000 MY_STRUC struc ; (sizeof=0xb)
    0000 MyMember_1 dw 4 dup(?)
    0008 field_8 db ?
    0009 field_9 dw ?
    000B MY_STRUC ends
    DelStrucMember(
    GetStrucIdByName("MY_STRUC"),
    0);
    0000 MY_STRUC struc ; (sizeof=0xb)
    0000 db ? ; undefined
    0001 db ? ; undefined
    0002 db ? ; undefined
    0003 db ? ; undefined
    0004 db ? ; undefined
    0005 db ? ; undefined
    0006 db ? ; undefined
    0007 db ? ; undefined
    0008 field_8 db ?
    0009 field_9 dw ?
    000B MY_STRUC ends
    При попытке же удалить последний член структуры, он действительно удаляется без остатка.
    Пример:
    0000 MY_STRUC struc ; (sizeof=0xb)

    276 0000 MyMember_1 dw 4 dup(?)
    0008 field_8 db ?
    0009 field_9 dw ?
    000B MY_STRUC ends
    DelStrucMember(
    GetStrucIdByName("MY_STRUC"),
    9);
    0000 MY_STRUC struc ; (sizeof=0xb)
    0000 MyMember_1 dw 4 dup(?)
    0008 field_8 db ?
    000B MY_STRUC ends
    Операнд Пояснения id Идентификатор (ID) структуры offset
    Смещение удаляемого члена структуры
    ==return Пояснения
    ==1
    Успешное завершение
    Return
    ==0
    Ошибка
    Интерактивно то же самое можно сделать, если перевести курсор на нужный элемент структуры и нажать клавишу
    long SetMemberName(long id,long member_offset,char name);
    Функция позволяет изменять имя члена функции. Функция задается идентификатором, а член любым, принадлежащим ему смещением.
    Например:
    0000 MY_STRUC struc ; (sizeof=0x9)
    0000 db ? ; undefined
    0001 db ? ; undefined
    0002 db ? ; undefined
    0003 db ? ; undefined
    0004 db ? ; undefined
    0005 db ? ; undefined
    0006 db ? ; undefined
    0007 db ? ; undefined
    0008 field_8 db ?
    0009 MY_STRUC ends
    SetMemberName(
    GetStrucIdByName("MY_STRUC"),
    8,"MyGoodMember");
    0000 MY_STRUC struc ; (sizeof=0x9)
    0000 db ? ; undefined
    0001 db ? ; undefined
    0002 db ? ; undefined
    0003 db ? ; undefined

    277 0004 db ? ; undefined
    0005 db ? ; undefined
    0006 db ? ; undefined
    0007 db ? ; undefined
    0008 MyGoodMember db ?
    0009 MY_STRUC ends
    Операнд Пояснения id Идентификатор (ID) структуры name
    Новое имя члена структуры offset
    Смещение удаляемого члена структуры
    ==return Пояснения
    ==1
    Успешное завершение
    Return
    ==0
    Ошибка
    Интерактивно изменить имя можно, переместив на него курсор и нажав клавишу

    1   ...   22   23   24   25   26   27   28   29   ...   39


    написать администратору сайта