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

  • Рисунок 21 Операция удаления обратима и повторное создание уничтоженного селектора все вернет на свои места. Функция long FirstSeg()

  • Сводная таблица функций Верстальщику Unfortunately Change Table функции преобразования адресов

  • Функции, работающие с селекторами

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

  • Рисунок 22 Художнику - перерисовать

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


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

    void DelSelector (long sel)” либо присвоением ему собственного индекса – SetSelector (sel, sel).
    Если удалить используемый селектор, то смещение первого байта в сегменте, который на него ссылался станет равным: offset = startea - sel * 0x10 , где sel – индекс (не значение!) селектора.
    Например, после вызова “SelDelete(0x1);” экран дизассемблера будет выглядеть так:
    ╔═[■]═════════════════════════════════ Program Segmentation ════════════════════════════════4═[↑]═╗
    ║ Name Start End Align Base Type Cls 32es ss ds fs gs ▲
    ║ seg000 00000000 00000012 byte 1000 pub CODE N FFFF FFFF FFFF FFFF FFFF 00010000 00010012 ▒
    ║ seg001 00000100 0000013C byte 2000 pub N FFFF FFFF FFFF FFFF FFFF 00020100 0002013C ■
    ║ seg002 00100000 001000F0 at 0001 pri N FFFF FFFF FFFF FFFF FFFF 00100010 00100100 ▼
    ╚3/3 ═══════════════════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘
    Рисунок 21
    Операция удаления обратима и повторное создание уничтоженного селектора все вернет на свои места.
    Функция long FirstSeg() возвращает линейный адрес начальный сегмента, имеющего наименьший адрес начала, соответственно функция long NextSeg(long ea) возвращает линейны адрес сегмента, следующего за ea.
    Пример использования: auto a; a=FirstSeg(); while(a!=BADADDR)
    {
    Message(">%08x\n",a,SegName(a)); a=NextSeg(a);
    }
    >00010000
    >00020100
    >00100010
    Зная адрес начала сегмента можно получить его имя вызовом функции SegName, а зная имя сегмента можно получить его базовый адрес при помощи функции SegByName; более быстрого способа вычисления базового адреса по-видимому не существует.

    56
    Передав функциям SegStart и SegEnd любой принадлежащий сегменту линейный адрес можно получить линейный адрес его начала и конца соответственно.
    Скрипт, приведенный ниже, распечатывает список всех существующих сегментов, с указанием их основных характеристик. auto a; a=FirstSeg();
    Message(">Name | Start |End |BASE\n");
    Message(">--------------------––––––––-\n”); while(a!=BADADDR)
    {
    Message(">%s|%08x|%08x|%08x\n",
    SegName(a),a,SegEnd(a),SegByName(SegName(a))/0x10); a=NextSeg(a);
    }
    Message(">-----------------------------\n\n”);
    >Name | Start |End |BASE
    >---------------------------------
    >seg000|00010000|00010012|00001000
    >seg001|00020100|0002013c|00002000
    >seg002|00100010|00100100|00010000
    >---------------------------------
    Узнать обо всех остальных атрибутах сегмента можно при помощи функции
    GetSegmentAttr.
    Сводная таблица функций
    ??? # Верстальщику #Unfortunately Change Table
    функции преобразования адресов
    имя функции краткое описание long MK_FP (long seg, long off) преобразует сегментный адрес в линейный char atoa (long ea) преобразует линейный адрес в строковой сегментный
    функции, работающие с сегментами
    функции создания и удаления сегментов имя функции краткое описание success SegCreate(long startea,long endea,long base,long use32,long align,long comb) создает новый сегмент или изменяет атрибуты уже существующего сегмента success SegDelete (long ea,long disable) удаляет сегмент и при необходимости, принадлежащие ему адреса виртуальной памяти функции изменения основных характеристик сегмента имя функции краткое описание success SegBounds (long ea,long startea,long endea,long disable) задает новый адрес начала и адрес конца сегмента, при необходимости удаляет освободившиеся адреса виртуальной памяти функции получения основных характеристик сегмента имя функции краткое описание long SegStart (long ea) возвращает линейный адрес начала сегмента long SegEnd (long ea) возвращает линейный адрес конца сегмента long SegByName (char segname) по имени сегмента определяет его базовый адрес long SegByBase(long base) по базовому адресу сегмента определяет линейный адрес его начала
    Функции изменения атрибутов сегмента имя функции краткое описание

    57
    success SegRename (long ea,char name) изменяет имя сегмента success SegAddrng (long ea,long use32) изменяет разрядность сегмента success SegAlign (long ea,long alignment) изменяет кратность выравнивания сегмента success SegComb (long segea,long comb) изменяет атрибут объединения сегментов success SegClass (long ea,char class) изменяет класс сегмента success SegDefReg (long ea,char reg,long value) изменяет значение сегментных регистров success SetSegmentType(long segea,long type) изменяет тип сегмента функции получения атрибутов сегмента имя функции краткое описание long GetSegmentAttr (long segea,long attr) возвращает атрибуты сегмента char SegName (long ea) возвращает имя сегмента функции трассировки сегментов имя функции краткое описание long FirstSeg () возвращает линейный адрес начала первого сегмента long NextSeg (long ea) возвращает линейный адрес начала следующего сегмента
    Функции, работающие с селекторами
    функции создания и удаления селекторов имя функции краткое описание void SetSelector (long sel,long value) создает новый селектор или изменяет значение уже существующего селектора void DelSelector (long sel) удаляет селектор утилиты имя функции краткое описание long AskSelector (long sel) возвращает значение селектора в параграфах long FindSelector (long val) возвращает селектор с указанным значением long MK_FP (long seg,long off)
    Функция преобразует сегментный адрес в линейный по следующей схеме ea = seg * 0x10 + off. Перед ее использованием необходимо убедится что “seg” представляет собой именно базовый адрес сегмента, выраженный в параграфах, а не селектор, иначе полученный результат будет неверен.
    Оператор “квадратные скобки” полностью аналогичен функции MK_FP, но обладает более компактной формой записи (6 символов “MK_FP()” вместо двух “[]”).
    Замечание: в комментариях, содержащихся в файле , часто
    используется конструкция [“имя сегмента”, смещение]. Попытка использования
    этой схематической конструкции в коде скриптов приведет к появлению
    синтаксической ошибки, но если передать имя сегмента в строковой
    переменной, оператор «квадратные скобки» автоматически подставит его
    базовый адрес – если, конечно, такой сегмент существует; в противном случае
    строка будет преобразована в число, согласно правилам преобразования
    «строка-
    Æ число» в IDA-Cи (см. «Язык скриптов IDA Си» - «Объявление
    переменных, типы переменных, преобразования переменных»)
    Напротив, макрос MK_FP всегда преобразует переданное ему имя
    сегмента в строку, даже если сегмент с таким именем существует.
    Пример использования:
    Message(“>[seg %X,off%X]=%X=%X\n”,0x1000,0x6,MK_FP(0x1000,0x6),[0x1000,0x6]);
    >[seg 1000,off6]=10006=10006

    58
    ??? #верстальщику – change table аргумент пояснения seg базовый адрес сегмента (не селектор!), выраженный в параграфах off смещение ячейки в сегменте return пояснения long 32-битный линейный адрес ячейки
    Родственные функции: оператор []
    Интерактивный аналог: “

    View\Calculate” char atoa(long ea)
    Функция преобразует линейный адрес ea в строковой сегментный, действуя по следующему алгоритму:
    • если линейный адрес ea принадлежит некоторому сегменту, смещение вычисляется относительно его базового адреса, а сам адрес записывается в виде “имя сегмента:смещение”
    • если линейный адрес ea не принадлежит ни одному сегменту, преобразование выполняется по формуле seg = ea
    0x10; off = ea - seg.
    Пример использования:
    Message(">%s\n",atoa(0x200010));
    >0:00200010
    SegCreate(0x200000,0x201000,0x20000,0,0,0);
    0. Creating a new segment (00200000-00201000) ... ... OK
    Message(">%s\n",atoa(0x200010));
    >seg000:0010
    ??? #верстальщику – change table аргумент пояснения ea 32-разрядный линейный адрес
    =return пояснения
    !=”” сегментный адрес в строковом представлении return
    ==”” ошибка
    Родственные функции: нет
    Интерактивный аналог: нет success SegCreate(long startea,long endea,long base,long use32,long align,long comb)
    Функция создает новый сегмент. Сегмент задается линейным адресом начала
    (startea), линейным адресом конца (endea) и базовым адресом (BASE), использующимся для адресации ячеек внутри сегмента.

    59
    Адрес начала задает наименьший линейный адрес, принадлежащий данному сегменту, напротив, адрес конца, задает линейный адрес на единицу превышающий наибольший адрес, принадлежащий указанному сегменту. Такая мера необходима для поддержки сегментов нулевой длинны – в силу архитектурных ограничений IDA, один линейный адрес не может является и началом, и концом сегмента одновременно, поэтому, приходится «искусственно» увеличивать адрес конца сегмента.
    Смещение первого байта внутри сегмента вычисляется по формуле startoffset = startea - BASE * 0x10 . Поддержка базирования позволяет создавать сегменты с произвольным начальным смещением, например, равным 0x100. Поскольку, смещения выражаются неотрицательными величинами, начальный адрес должен быть не меньше базы сегмента, измеряемой в байтах.
    Напротив, базовый адрес по известному адресу начала сегмента и смещению первого байта в сегменте вычисляется по формуле BASE = startea - startoffset
    0x10
    Атрибут use32 задает разрядность сегмента – нулевое значение соответствует 16- разрядному сегменту, любое другое – 32-разрядному. Разрядность оказывает влияние только на способ дизассемблирования машинных инструкций, принадлежащих этому сегменту, но независимо от разрядности смещения в сегменте всегда задаются 32- битовыми значениями.
    Атрибут
    align задает кратность выравнивания сегмента, помещая соответствующую директиву в ассемблерный листинг. Никакого влияния на размещение сегмента в виртуальной памяти атрибут align не оказывает!
    Атрибут comb задает флаг комбинирования, разрешающий (запрещающий) линкеру объединять несколько сегментов в один. Никакого влияния на объединение сегментов в виртуальной памяти атрибут comb не оказывает – независимо от его значения смежные сегменты не будут автоматически объединены.
    Детали:
    а) Базовый адрес задается неотрицательным 16-разрядным значением и может адресовать не более одного мегабайта памяти




    0x10000 * 0x10 1024 * 1024 =1 . Если этого недостаточно, следует указать вместо базового адреса селектор, который необходимо предварительно создать вызовом функции SetSelector.
    Если базовый адрес, переданный функции SegCreate, больше 0x10000, IDA автоматически создаст новый селектор и использует его для адресации данного сегмента. б) Если передать линейный адрес, принадлежащий некоторому сегменту, но отличный от адреса начала (т.е. попытаться создать вложенный сегмент), функция автоматически укорит или разобьет данный сегмент и создаст новый (см. рисунок) seg000->║───────║ seg000->║───────║
    ║ ║ ║ ║
    ║ ║ ║ ║
    ┌─> ║─ ─ ─ ─║ seg001->║───────║
    │ ║ ║ ║ ║
    │ ║ ║ ║ ║
    │ ║ ║ ║ ║
    │ ║ ║ ║ ║
    ╟─> ║─ ─ ─ ─║ seg002->║───────║
    ║ ║ ║ ║ ║
    ║ ║───────║ ║───────║
    ╚═══════╤─┐
    SegCreate(x,y,.....);

    60
    Рисунок 22 ??? Художнику - перерисовать
    Пример использования:
    Пусть необходимо создать сегмент с (задача вычисления базовго адреса)
    SegCreate(0x1000,0x4000,0x100,0,0,0);
    0. Creating a new segment (00001000-00004000) ... ... OK
    ╔═[■]═══════════════════════════════ Program Segmentation ══════════════════════════════4═[↑]═╗
    ║ Name Start End Align Base Type Cls 32es ss ds ▲
    ║ seg000 00000000 00003000 at 0100 pri N FFFF FFFF FFFF 00001000 00004000 ▓
    ║ ▓
    ║ ▼
    ╚1/1 ═════════════════════════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘
    SegCreate(0x2000,0x3000,0x200,0,0,0);
    1. Creating a new segment (00002000-00003000) ...
    Additional segment (00003000-00004000) ...
    2. Creating a new segment (00003000-00004000) ... ... OK
    ... OK
    ╔═[■]═══════════════════════════════ Program Segmentation ══════════════════════════════4═[↑]═╗
    ║ Name Start End Align Base Type Cls 32es ss ds ▲
    ║ seg000 00000000 00001000 at 0100 pri N FFFF FFFF FFFF 00001000 00002000 ■
    ║ seg001 00000000 00001000 at 0200 pri N FFFF FFFF FFFF 00002000 00003000 ▒
    ║ seg002 00002000 00003000 at 0100 pri N FFFF FFFF FFFF 00003000 00004000 ▼
    ╚1/3 ═════════════════════════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘
    ??? #Верстальщику – change table аргумент пояснения startea 32-разрядный линейный адрес начала сегмента endea величина на единицу большая последнего принадлежащего сегменту адреса
    Base 16-разрядный базовый адрес в параграфах или указатель на селектор
    =use32 пояснения
    ==0 16-разрядный сегмент use32
    ==1 32-разрядный сегмент aling кратность выравнивания начала сегмента comb комбинирование сегмента
    =return пояснения
    ==1 операция завершилась успешно return
    ==0 ошибку
    Родственные функции: SetSelector; SegClass; SegAlign; SegComb; SegAddrng;
    Интерактивный аналог: “View\Segments”, ; success SegDelete(long ea,long disable)
    Функция удаляет сегмент вместе с результатами дизассемблирования (метками, функциями, переменными и т.д.) и адресным пространством виртуальной памяти, принадлежащей сегменту.
    Аргумент ea – представляет собой любой линейный адрес, принадлежащий сегменту, но не адрес его конца (см. описание функции SegCreate – адрес конца сегмента на единицу больше наибольшего адреса, принадлежащего сегменту)

    61
    Аргумент disable будучи неравным нулю указывает на необходимость удаления адресного пространства виртуальной памяти, принадлежащей сегменту, в противном случае удаляется лишь сам сегмент вместе с результатами дизассемблирования, а содержимое ячеек виртуальной памяти остается неизменным.
    Внимание: операция удаления сегментов необратима – повторное создание
    уничтоженного сегмента не восстановит удаленные вместе с сегментом
    метки,
    функции,
    переменные,
    комментарии
    и
    другие
    результаты
    дизассемблирования.
    Если переданный функции линейный адрес не принадлежит ни одному сегменту, она возвратит нулевое значение, сигнализируя об ошибке. Нормальное завершение возвращает единицу.
    Пример использования: seg000:0000 seg000 segment byte public '' use16 seg000:0000 assume cs:seg000 seg000:0000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing seg000:0000 aHelloIdaPro db 'Hello, IDA Pro! ',0Dh,0Ah ; Test seg000:0000 seg000 ends а) исходный сегмент, содержащий строку “aHelloIdaPro” и комментарий “Test”
    SegDelete(SegByBase(SegByName("seg000")>>4),0); b) удаление сегмента без уничтожения виртуальной памяти
    0:00010000 db 48h ; H
    0:00010001 db 65h ; e
    0:00010002 db 6Ch ; l
    0:00010003 db 6Ch ; l
    0:00010004 db 6Fh ; o
    0:00010005 db 2Ch ; ,
    0:00010006 db 20h ;
    0:00010007 db 49h ; I
    0:00010008 db 44h ; D
    0:00010009 db 41h ; A
    0:0001000A db 20h ;
    0:0001000B db 50h ; P
    0:0001000C db 72h ; r
    0:0001000D db 6Fh ; o
    0:0001000E db 21h ; !
    0:0001000F db 20h ;
    0:00010010 db 0Dh ; с) результат – сегмент удален, содержимое виртуальной памяти - нет
    SegCreate(0x10000,0x10012,0x1000,0,0,0); d) Попытка создания нового сегмента для восстановления удаленного seg000:0000 seg000:0000 ; Segment type: Regular seg000:0000 seg000 segment at 1000h private '' use16 seg000:0000 assume cs:seg000 seg000:0000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing seg000:0000 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 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 ; seg000:000B db 50h ; P

    62
    seg000:000C db 72h ; r seg000:000D db 6Fh ; o seg000:000E db 21h ; ! seg000:000F db 20h ; seg000:0010 db 0Dh ; seg000:0011 db 0Ah; seg000:0011 seg000 ends e) результат – сегмент восстановлен, а строка и комментарий – нет.
    SegDetele(0x10000,1); f) удаление сегмента вместе с принадлежащей ему виртуальной памятью
    ╔═[■]═══════════════════════════════════════ IDA view-A ══════
    пустой экран дизассемблера
    ║ j) результат – виртуальная память удалена
    SegCreate(0x10000,0x10012,0x1000,0,0,0); k) попытка создания нового сегмента для восстановления виртуальной памяти seg000:0000 ; Segment type: Regular seg000:0000 seg000 segment at 1000h private '' use16 seg000:0000 assume cs:seg000 seg000:0000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored seg000:0002 db ? ; unexplored seg000:0003 db ? ; unexplored seg000:0004 db ? ; unexplored seg000:0005 db ? ; unexplored seg000:0006 db ? ; unexplored seg000:0007 db ? ; unexplored seg000:0008 db ? ; unexplored seg000:0009 db ? ; unexplored seg000:000A db ? ; unexplored seg000:000B db ? ; unexplored seg000:000C db ? ; unexplored seg000:000D db ? ; unexplored seg000:000E db ? ; unexplored seg000:000F db ? ; unexplored seg000:0010 db ? ; unexplored seg000:0011 db ? ; unexplored seg000:0011 seg000 ends l) результат – адресное пространство восстановлено, но содержимое виртуальной памяти – нет.
    ??? #верстальщику – change table аргумент пояснения ea линейный адрес принадлежащий сегменту
    =disable пояснения
    ==0 не уничтожать адреса, принадлежащие сегменту disable
    ==1 уничтожать адреса, принадлежащие сегменту
    =return
    ==1 успешное завершение операции return
    ==0 ошибка
    Родственные функции: SegCreate
    Интерактивный аналог: “Edit\Segments\Delete segment”; “View\Segments”,

    63
    success SegBounds(long ea,long startea,long endea,long disable)
    Функция позволяет изменять адреса начала и конца сегмента, при необходимости уничтожая освободившуюся при уменьшении сегмента виртуальную память. Базовый адрес она изменить не в состоянии и при возникновении необходимости его модификации следует воспользоваться функцией SegCreate.
    Перед увеличением границ сегмента необходимо убедиться что для расширения сегмента имеется достаточное количество свободного места, в противном случае требуется предварительно укоротить соседние сегменты на соответственную величину.
    Адрес начала сегмента должен быть не меньше базового адреса сегмента, умноженного на шестнадцать, в противном случае первые байты сегмента будет иметь отрицательное смещение. Изменить базовый адрес можно вызовом SegCreate или
    SetSelector (если базовый адрес задан селектором).
    Адрес конца сегмента должен на единицу превышать наибольший адрес, принадлежащий сегменту. Подробнее об этом рассказывается в описании функции
    SegCreate.
    При уменьшении сегмента ранее принадлежащая ему виртуальная память освобождается. Позднее она может быть выделена в отдельный сегмент или же объединена с одним из смежных сегментов. Если же ни то, ни другое не планируется, то освободившуюся память можно удалить, передав функции ненулевое значение флага
    1   ...   4   5   6   7   8   9   10   11   ...   39


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