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

  • Родственные функции

  • Таблица 12 поддерживаемые типы данных

  • Навигатор по функуциям Группа функций MakeByte , MakeWord , MakeDword , MakeQword , MakeFloat , MakeDouble , MakePackedReal , MakeTbyte

  • MakeStr

  • PASCAL

  • Align

  • Сводная таблица функций функции создания новых элементов, преобразования и уничтожения элементов

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


    Скачать 2.86 Mb.
    НазваниеОписание функций встроенного языка
    Анкорobraz_mihlenia_-_dizassembler_IDA
    Дата29.09.2022
    Размер2.86 Mb.
    Формат файлаpdf
    Имя файлаobraz_mihlenia_-_dizassembler_IDA.pdf
    ТипСправочник
    #704305
    страница11 из 39
    1   ...   7   8   9   10   11   12   13   14   ...   39

    , распространяемого вместе с IDA.
    Замечание: линейный адрес начала следующего элемента будет возвращен
    даже в том случае, если элемент находится в другом сегменте.
    ??? #Верстальщику – Change Table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу
    =return пояснения
    !=BADADDR линейный адрес головы следующего элемента return
    ==BADADDR ошибка
    Родственные функции: PrevHead
    Интерактивный аналог: нет long NextHead(long ea, long maxea)
    (версия IDA 4.0 и старше)
    В версии 4.0 прототип функции NextHead(long ea) (см. ее описание) был изменен, добавлением еще одного аргумента – maxea, ограничивающего диапазон адресов, доступных функции.
    Функция возвращает адрес головы следующего элемента, при условии, что он меньше, чем maxea, т.е. отвечает следующему условию ea < return value < maxea .
    Изменение прототипа повлекло за собой неработоспособность всех ранее созданных скриптов, использующих эту функцию и необходимости внесения в них исправлений – замены NextHead(ea) на NextHead(ea, BADADDR).
    Замечание: ограничение максимального адреса облегчает написание скриптов,
    работающих с выделенными регионами (см. описание функций SelStart и SelEnd)
    ??? #Верстальщику – Change Table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу maxea значение на единицу превышающее наибольший адрес, доступный функции
    =return пояснения
    !=BADADDR линейный адрес головы следующего элемента return
    ==BADADDR ошибка
    Родственные функции: PrevHead

    92
    Интерактивный аналог: нет long PrevHead(long ea)
    (версия IDA 3.85 и младше)
    Функция возвращает линейный адрес предыдущей головы элемента (не головы предыдущего элемента!). Если указать на хвост элемента, функция возвратит адрес его головы. Переданный функции линейный адрес ea не обязательно должен принадлежать какому-то элементу – он может даже вообще не существовать.
    Пример использования: seg000:0000 aHelloIdaPro db 'Hello,IDA Pro!' seg000:000E a1234 db '1234' a) исходные данные
    Message(“>%s\n”,atoa(PrevHead(SegByName(“seg000”)+0x2))); b) вызываем функцию PrevHead, передавая ей адрес принадлежащий элементу
    “Hello, IDA Pro!”.
    >seg000:000E c) результат – функция вернула адрес предыдущей головы элемента (этого элемента)
    ??? #Верстальщику – Change table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу
    =return пояснения
    !=BADADDR линейный адрес предыдущей головы элемента (не головы предыдущего элемента!) return
    ==BADADDR ошибка
    Родственные функции: NextHead
    Интерактивный аналог: нет long PrevHead(long ea, long minea)
    (версия IDA 4.0 и старше)
    В версии 4.0 прототип функции PrevHead(long ea) (см. ее описание) был изменен, добавлением еще одного аргумента – minea, ограничивающего диапазон адресов, доступных функции.
    Функция возвращает адрес предыдущей головы элемента, при условии, что он не меньше, чем minea, т.е. отвечает следующему условию minea
    ≥ return value > ea .
    Изменение прототипа повлекло за собой неработоспособность всех ранее созданных скриптов, использующих эту функцию и необходимости внесения в них исправлений – замены PrevHead(ea) на PrevHead(ea, 0).
    Замечание: ограничение максимального адреса облегчает написание скриптов,
    работающих с выделенными регионами (см. описание функций SelStart и SelEnd)

    93
    ??? #Верстальщику – Change Table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу minea минимальный адрес, доступный функции
    =return пояснение
    !=BADADDR линейный адрес предыдущей головы элемента (не головы предыдущего элемента!) return
    ==BADADDR ошибка
    Родственные функции: NextHead
    Интерактивный аналог: нет long NextNotTail(long ea)
    Функция возвращает линейный адрес головы следующего элемента или бестипового байта. Переданный функции линейный адрес ea не обязательно должен принадлежать какому-то элементу – он может даже вообще не существовать.
    Пример использования: seg000:0000 aHelloIdaPro db 'Hello,IDA Pro!' seg000:000E a1234 db '1234' a) исходные данные
    Message(“>%s\n”,atoa(NextNotTail(0))); b) вызываем функцию NextNotTail, передавая ей нулевой адрес.
    >seg000:0000 c) результат – функция вернула адрес головы первого элемента
    ??? #Верстальщику – Change table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу
    =return пояснения
    !=BADADDR линейный адрес головы следующего элемента или бестипового байта return
    ==BADADDR ошибка
    Родственные функции: PrevNotTail
    Интерактивный аналог: нет long PrevNotTail(long ea)
    Функция возвращает линейный адрес головы предыдущего элемента (не предыдущей головы элемента!). Переданный функции линейный адрес ea не обязательно должен принадлежать какому-то элементу – он может даже вообще не существовать.
    Пример использования:

    94
    seg000:0000 aHelloIdaPro db 'Hello,IDA Pro!' seg000:000E a1234 db '1234' a) исходные данные
    Message(“>%s\n”,atoa(NextNotTail(BADADDR))); b) вызываем функцию PrevNotTail, передавая ей значение BADADDR
    >seg000:000E c) результат – функция вернула адрес головы самого последнего из существующих элемента
    Замечание: в отличие от функции NextNotTail, функция PrevNotTail игнорирует
    бестиповые байты.
    ??? #Верстальщику – Change table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу
    ==return пояснения
    !=BADADDR линейный адрес головы предыдущего элемента return
    ==BADADDR ошибка
    Родственные функции: PrevNotTail
    Интерактивный аналог: нет
    ТИПЫ ЭЛЕМЕНТОВ
    #Definition
    Поле флагов головы элемента определяет является ли данный элемент элементом кода или элементом данных (см. главу «Элементы»), а так же уточняет его тип. Например, один и та же цепочка из четырех байт может быть двойным словом, типом float, ASCII- строкой, массивом байт или двойных слов и т.д.
    Замечание: типотизация данных – одно из немаловажных достоинств IDA Pro,
    ощутимо
    повышающее
    качество
    дизассемблирования.
    В
    полностью
    дизассемблированной программе не должно быть ни одного байта данных
    неопределенного типа.
    IDA Pro поддерживает следующие типы данных – байт, слово, двойное слово,
    четвертное слово, восьмерное слово, float, double, packed real, ASCII-строка, массив, состоящих из любых вышеперечисленных типов, а так же тип align – байты, использующиеся для выравнивания кода (данных) по кратным адресам (см. таблицу 12)
    ??? #Верстальщику – change table константа
    # тип
    FF_BYTE 0x00000000 байт
    FF_WORD
    0x10000000 слово
    FF_DWRD
    0x20000000 двойное слово
    FF_QWRD
    0x30000000 четвертное слово
    FF_TBYT
    0x40000000 восьмерное слово

    95
    FF_ASCI
    0x50000000
    ASCII-строка
    FF_STRU
    0x60000000 структура
    FF_XTRN
    0x70000000 внешние данные неизвестного размера
    FF_FLOAT
    0x80000000 float
    FF_DOUBLE
    0x90000000 double
    FF_PACKREAL 0xA0000000 упакованное десятичное целое
    FF_ALIGN 0xB0000000 директива выравнивания
    Таблица 12 поддерживаемые типы данных
    Цепочка бестиповых байт может быть преобразована в любой поддерживаемый
    IDA Pro тип данных, при условии что имеет достаточный для такой операции размер. Уже существующий элемент данных, также может быть преобразован в данные другого типа, если имеет достаточный для такой операции размер, либо за его хвостом следует цепочка бестиповых байт необходимой длины.
    Если в результате преобразования, размер элемента уменьшается, его остаток преобразуется в один или несколько бестиповых байт.
    Примеры: seg000:0000 Var db 48h ; H seg000:0001 db 65h ; e seg000:0002 db 6Ch ; l seg000:0003 db 6Ch ; l seg000:0004 db 6Fh ; o seg000:0005 Var2 db 2Ch seg000:0006 db 20h ; seg000:0007 db 49h ; I seg000:0008 db 44h ; D seg000:0009 db 41h ; A seg000:000A db 20h ;
    Бестиповая переменная “Var” может быть преобразована в байт, слово, двойное слово, float, ASCII-строку, но попытка преобразовать ее в четверное, восьмерное слово, double, packed real приведет к ошибке – поскольку тому препятствует элемент данных, расположенный по адресу “seg000:0005”. Если же его уничтожить, преобразование пройдет успешно. Аналогично: seg000:0000 Var dw 6548h seg000:0000 Var dw 6548h seg000:0002 db 6Ch seg000:0002 dw 6C6Ch seg000:0003 db 6Ch а) преобразование Var в двойное b) преобразование Var в двойное слово слово возможно невозможно – требуется предварительно уничтожить следующий за ним элемент
    Два и более последовательных элементов одного типа могут быть объединены в массив – как бы макроэлемент, собирающий их всех под одну крышу. С массивом IDA Pro работает как с единым целым, в частности, в начале каждой строки указывает не адрес текущего элемента, а адрес начала массива: seg000:0000 db 6Ch, 6Fh, 2Ch, 20h, 49h, 44h, 41h, 20h, 50h, 72h, 6Fh seg000:0000 db 21h, 0
    Функции трассировки элементов (см. главу «Элементы») будут возвращать только адреса начала массива и следующего за массивом элемента, но не адреса элементов самого массива! Аналогично, функции изменения представления операндов (см. главу

    96
    «Операнды») будут изменять представление всех элементов массива одновременно, но никак не выборочно.
    Поэтому, разумно объединять в массив данные лишь тогда, когда они имеют одинаковый тип, одинаковое представление и нет никакой необходимости в индивидуальной работе ни с одним элементом. В противном случае создание массива доставит больше неудобств, чем пользы.
    Важно понять – массив в IDA Pro это один элемент, а не совокупность множества элементов другого типа.
    Максимальная длина элемента ограничена четырьмя килобайтами – это связано с тем, что под хвостовые биты, содержащие смещения относительно начала (конца) элемента отведено 12 разрядов, отсюда и ограничение на длину.
    Если требуется создать строку или массив большего размера, единственный выход
    – создать два (или более) массивов (строк), расположив их последовательно друг за другом.
    Элемент данных может иметь тип align – указывающий, что эти байты используются для выравнивания кода (данных) по кратным адресам. Формально тип align – такой же точно тип как, например, слово или двойное слово, и с ним можно выполнять точно те же операции, что и над любым другим элементом данных. Единственное его отличие от состоит в том, что принадлежащие ему байты, в ассемблерный листинг не попадают: seg000:0000 db 48h ; H seg000:0000 db 48h ; H seg000:0001 db 65h ; e seg000:0001 align 2 seg000:0002 db 6Ch ; l seg000:0002 db 6Ch ; l
    Элемент кода не имеет никаких типов, разрядность инструкций определяется разрядностью сегмента, а логика работы дизассемблера – типом выбранного процессора.
    Элемент данных не может быть непосредственно преобразован в элемент кода и, соответственно, наоборот. Элемент кода может быть создан только из цепочки бестиповых байт достаточной длины.
    Если после создания элемента кода, IDA может определить адрес следующей выполняемой инструкции, она автоматически пытается создать в соответствующем месте очередной элемент кода – так продолжается до тех пор, пока ей не встретится инструкция передающее управление по адресу, который IDA вычислить не в состоянии. Это может быть, например, регистровый переход, команда выхода из подпрограммы (прерывания) и т.д. Возможности создания одного элемента кода в IDA Pro нет.
    Строго говоря, элементы кода и данных не являются неделимым целым – IDA Pro предоставляет возможность выборочной работы с их операндами (если они есть) – см. главу «Операнды».
    Навигатор по функуциям
    Группа функций MakeByte, MakeWord, MakeDword, MakeQword, MakeFloat,
    MakeDouble, MakePackedReal, MakeTbyte предназначена для преобразования цепочки бестиповых байт (или уже существующего элемента данных) в элемент данных типа байт, слово, двойное слово, четвертное слово, float, double, PackedReal и восьмерное слово соответственно.
    Интерактивный аналог первый трех функций пункт “Data” меню “

    Edi” (или «горячая клавиша “D”»>, циклично преобразующий тип элемента, находящегося под курсором в байт, слово и двойное слово. При необходимости в эту последовательность можно включить и другие типы данных, вызвав диалог “Setup data types” из меню “Options”
    («горячая клавиша – “Alt-D”»).
    Функция MakeStr преобразует цепочку бестиповых байт в ASCII-строку заданной длины или попытается определить ее автоматически. Автоматически распознаются длины следующих типов строк– ASCIIZ-строк, заканчивающихся символом нуля; PASCAL-строк,

    97
    начинающихся с байта, содержащего длину строки и DELPHI-строк, начинающиеся со слова (двойного слова), содержащего длину строки. Если строка не принадлежит ни к одному из этих трех типов, концом строки считается: а) первый нечитабельный ASCII-символ. b) неинициализированный байт c) голова элемента кода или данных d) конец сегмента
    Функция MakeArray создает массив состоящий из данных одного типа – байтов, слов, двойных слов, четверных слов, двойных слов в формате float, четверных слов в формате double, packed real, tbyte. Бестиповые байты могут стать частью массива любого типа. Строки не могут быть элементами никакого массива.
    Тип массива определяется типом его первого элемента. Все остальные элементы массива на момент его создания должны быть представлены бестиповыми байтами, - последовательность типизированных данных не может быть преобразована в массив.
    Элементы массива записываются в строку, отделяясь друг от друга знаком запятой. Если два или более подряд идущих элемента имеют одно и то же значение (в том числе и неинициализированное) для сокращения ассемблерного листинга используется конструкция “DUP”.
    Функция Align помещает в ассемблерный файл директиву выравнивания align и исключает из дизассемблируемого листинга байты, используемые для выравнивания.
    Функция MakeCode создает по указанному адресу элемент кода, выполняя дизассемблирование первой машинной инструкции. Если это возможно, автоматически дизассемблируется и другие инструкции. Это происходит в следующих случаях: а) текущая инструкция не изменяет нормального выполнения программы и за ее концом расположены бестиповые байты; b) текущая инструкция изменяет нормальное выполнение программы, осуществляя переход по непосредственному адресу, тогда IDA продолжит дизассемблирование с этого адреса
    Если встречается инструкция, изменяющая адрес перехода непредсказуемым образом (например, RET) IDA прекращает дизассемблирование.
    Во время дизассемблирования IDA при необходимости создает перекрестные ссылки и автогенерируемые метки.
    Функция MakeUnkn разрушает элемент, заданный любым принадлежащим ему адресом, превращая его содержимое в бестиповые байты. Объекты, связанные с элементом (например, метки, комментарии) при этом не уничтожаются.
    Сводная таблица функций
    функции создания новых элементов, преобразования и уничтожения элементов
    имя функции каткое описание success MakeByte(long ea) создает (преобразует) ячейку в байт success MakeWord(long ea) создает (преобразует) ячейку в слово (2 байта) success MakeDword(long ea) создает (преобразует) ячейку в двойное слово (4 байта) success MakeQword(long ea) создает (преобразует) ячейку в четвертное слово
    (8 байт) success MakeFloat(long ea) создает (преобразует) ячейку в тип float
    (представление с плавающей запятой 4 байта) success MakeDouble(long ea) создает (преобразует) ячейку в тип Double
    (представление с плавающей запятой 8 байт) success MakePackReal(long ea) создает (преобразует) ячейку в тип PackReal (от 10 до 12 байт)

    98
    success MakeTbyte(long ea) создает (преобразует) ячейку в тип Tbyte (10 байт) success MakeStr (long ea,long endea) создает ASCII строку success MakeArray (long ea,long nitems) создает массив success MakeAlign(long ea,long count,long align) создает директиву выравнивания long MakeCode(long ea) дизассемблирует одну (или больше) инструкций void MakeUnkn (long ea,long expand); уничтожает элемент
    функции возвращающие свойства элементов
    имя функции краткое описание char GetMnem (long ea) возвращает мнемонику инструкции в символьном виде
    функции, поиска элементов
    имя функции краткое описание long FindCode(long ea, long flag) возвращает линейный адрес ближайшего элемента кода long FindData(long ea,long flag) возвращает линейный адрес ближайшего элемента данных long FindUnexplored(long ea,long flag) возвращает линейный адрес ближайшего бестипового байта long FindExplored(long ea, long flag); возвращает линейный адрес ближайшего элемента success MakeByte(long ea)
    Функция создает по переданному ей линейному адресу ea элемент данных типа
    байт.
    Если по данному адресу находится голова ранее созданного элемента данных, функция преобразует его в байт, а хвост элемента (если он есть) – в бестиповые байты.
    Если по данному адресу находится хвост элемента данных, голова или хвост элемента кода, функция возвратит ошибку.
    Наличие неинициализированных байт в создаваемом или преобразуемом элементе не является препятствием для выполнения этой функции.
    Пример использования:
    1. эксперимент
    seg000:0000 db ? ; unexplored a) исходные данные
    Message(“>%x\n”,MakeByte(SegByName(“seg000”))); b) вызываем функцию MakeByte для создания нового элемента данных типа байт, передавая ей адрес бестипового байта seg000:0000 db
    ?
    >1 с) результат – элемент данных типа байт успешно создан
    Замечение: в ассемблерном листинге бестиповые байты помечаются
    комментарием “unexplored” (или ASCII кодом содержимого), сигнализирующим о
    неисследованости данной ячейки. В полностью дизассемблированной программе
    не должно остаться ни одного неисследованого байта – тип каждой ячейки
    должен быть задан явно.

    99
    1   ...   7   8   9   10   11   12   13   14   ...   39


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