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

Long mk_fp (long seg,long off)

Функция преобразует сегментный адрес в линейный по следующей схеме . Перед ее использованием необходимо убедится что “seg” представляет собой именно базовый адрес сегмента, выраженный в параграфах, а не селектор, иначе полученный результат будет неверен.

Оператор “квадратные скобки” полностью аналогичен функции MK_FP, но обладает более компактной формой записи (6 символов “MK_FP()” вместо двух “[]”).

Замечание: в комментариях, содержащихся в файле <idc.idc>, часто используется конструкция [“имя сегмента”, смещение]. Попытка использования этой схематической конструкции в коде скриптов приведет к появлению синтаксической ошибки, но если передать имя сегмента в строковой переменной, оператор «квадратные скобки» автоматически подставит его базовый адрес – если, конечно, такой сегмент существует; в противном случае строка будет преобразована в число, согласно правилам преобразования «строка- число» в 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

??? #верстальщику – change table

аргумент

пояснения

seg

базовый адрес сегмента (не селектор!), выраженный в параграфах

off

смещение ячейки в сегменте

return

пояснения

long

32-битный линейный адрес ячейки

Родственные функции: оператор []

Интерактивный аналог: “~View\Calculate” <?>

Char atoa(long ea)

Функция преобразует линейный адрес ea в строковой сегментный, действуя по следующему алгоритму:

  • если линейный адрес ea принадлежит некоторому сегменту, смещение вычисляется относительно его базового адреса, а сам адрес записывается в виде “имя сегмента:смещение”

  • если линейный адрес ea не принадлежит ни одному сегменту, преобразование выполняется по формуле .

Пример использования:

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), использующимся для адресации ячеек внутри сегмента.

Адрес начала задает наименьший линейный адрес, принадлежащий данному сегменту, напротив, адрес конца, задает линейный адрес на единицу превышающий наибольший адрес, принадлежащий указанному сегменту. Такая мера необходима для поддержки сегментов нулевой длинны – в силу архитектурных ограничений IDA, один линейный адрес не может является и началом, и концом сегмента одновременно, поэтому, приходится «искусственно» увеличивать адрес конца сегмента.

Смещение первого байта внутри сегмента вычисляется по формуле . Поддержка базирования позволяет создавать сегменты с произвольным начальным смещением, например, равным 0x100. Поскольку, смещения выражаются неотрицательными величинами, начальный адрес должен быть не меньше базы сегмента, измеряемой в байтах.

Напротив, базовый адрес по известному адресу начала сегмента и смещению первого байта в сегменте вычисляется по формуле

Атрибут use32 задает разрядность сегмента – нулевое значение соответствует 16-разрядному сегменту, любое другое – 32-разрядному. Разрядность оказывает влияние только на способ дизассемблирования машинных инструкций, принадлежащих этому сегменту, но независимо от разрядности смещения в сегменте всегда задаются 32-битовыми значениями.

Атрибут align задает кратность выравнивания сегмента, помещая соответствующую директиву в ассемблерный листинг. Никакого влияния на размещение сегмента в виртуальной памяти атрибут align не оказывает!

Атрибут comb задает флаг комбинирования, разрешающий (запрещающий) линкеру объединять несколько сегментов в один. Никакого влияния на объединение сегментов в виртуальной памяти атрибут comb не оказывает – независимо от его значения смежные сегменты не будут автоматически объединены.

Детали:

а) Базовый адрес задается неотрицательным 16-разрядным значением и может адресовать не более одного мегабайта памяти . Если этого недостаточно, следует указать вместо базового адреса селектор, который необходимо предварительно создать вызовом функции SetSelector.

Если базовый адрес, переданный функции SegCreate, больше 0x10000, IDA автоматически создаст новый селектор и использует его для адресации данного сегмента.

б) Если передать линейный адрес, принадлежащий некоторому сегменту, но отличный от адреса начала (т.е. попытаться создать вложенный сегмент), функция автоматически укорит или разобьет данный сегмент и создаст новый (см. рисунок)

seg000->║───────║ seg000->║───────║

║ ║ ║ ║

║ ║ ║ ║

┌─> ║─ ─ ─ ─║ seg001->║───────║

│ ║ ║ ║ ║

│ ║ ║ ║ ║

│ ║ ║ ║ ║

│ ║ ║ ║ ║

╟─> ║─ ─ ─ ─║ seg002->║───────║

║ ║ ║ ║ ║

║ ║───────║ ║───────║

╚═══════╤─┐

SegCreate(x,y,.....);

Рисунок 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

=use32

пояснения

==0

16-разрядный сегмент

==1

32-разрядный сегмент

aling

кратность выравнивания начала сегмента

comb

комбинирование сегмента

return

=return

пояснения

==1

операция завершилась успешно

==0

ошибку

Родственные функции: SetSelector; SegClass; SegAlign; SegComb; SegAddrng;

Интерактивный аналог: “~View\Segments”, <Insert>;

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