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

Long SegEnd(long ea)

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

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

Линейный адрес конца сегмента на единицу больше наибольшего адреса, принадлежащего сегменту. Подробнее об этом рассказывается в описании функции SegCreate.

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

SegCreate(0x1000,0x2000,0x100,0,0,0);

SegCreate(0x2000,0x3000,0x200,0,0,0);

a) создаем два смежный сегмента с адресами начала и конца 0x1000; 0x2000 и 0x2000; 0x3000 соответственно

0. Creating a new segment (00001000-00002000) ... ... OK

1. Creating a new segment (00002000-00003000) ... ... OK

b) сегменты успешно созданы

Message(">%X\n",SegEnd(0x1100));

c) вызываем функцию SegEnd, передавая ей один из адресов, принадлежащих первому сегменту

>2000

d) результат – адрес конца первого сегмента

Message(">%X\n",SegStart(0x2000));

e) вызываем функцию SegStart, передавая ей адрес конца первого сегмента

>2000

f) результат – адрес начала второго сегмента. Таким образом, наглядно продемонстрировано – адрес конца сегмента не принадлежит самому сегменту.

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

аргумент

пояснения

ea

любой 32-разрядный линейный адрес, принадлежащий сегменту

return

=return

пояснения

!=BADADDR

линейный адрес конца сегмента

==BADADDR

ошибка

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

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

адрес конца сегмента –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––--┐

╔═[■]═════════════════════════════════ Program Segmentation ═════════════════════════==═====═══│═3═[↑]═╗

║ Name Start End Align Base Type Cls 32es ss ds fs gs ▼ ▲

║ seg000 00000000 00010000 at 1000 pri N FFFF FFFF FFFF FFFF FFFF 00010000 00020000 ▓

║ ▓

║ ▼

╚1/1 ══════════════════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘

Long SegByName(char segname)

Функция по имени сегмента (с учетом регистра) определяет его базовый адрес.

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

Если сегмента с указанным именем не существует, функция возвратит значение BADADDR, сигнализируя об ошибке.

Детали:

а) вызов SegByName – единственный способ определения базового адреса сегмента. Чтобы определить базовый адрес сегмента, по некому линейному адресу, принадлежащему сегменту, необходимо воспользоваться конструкцией .

b) Поскольку, IDA допускает совместное существование двух и более одноименных сегментов, определение базового адреса сегмента по ему имени позволяет определишь базовый адрес лишь одного из них.

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

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

SegCreate(0x1000,0x2000,0x100,0,0,0);

SegRename(0x1000,"MySeg");

a) создаем новый сегмент с базовым адресом 0x1000 и тут же переименовываем его в “MySeg”

Message(">%X\n",SegByName("MySeg"));

b) вызываем функцию SegByName передавая ей имя только что созданного сегмента

>1000

c) результат – базовый адрес сегмента MySeg

SegCreate(0x2000,0x3000,0x200,0,0,0);

SegRename(0x2000,"MySeg");

d) создаем второй сегмент с именем “MySeg”, но на этом раз базовым адресом, равным 0x2000

╔═[■]════════════════════════════════ Program Segmentation ═══════════════════════════════4═[↑]═╗

║ Name Start End Align Base Type Cls 32es ss ds fs gs ▲

║ MySeg 00000000 00001000 at 0100 pri N FFFF FFFF FFFF FFFF FFFF 00001000 00002000 ▒

║ MySeg 00000000 00001000 at 0200 pri N FFFF FFFF FFFF FFFF FFFF 00002000 00003000 ■

║ ▼

╚2/2 ═════════════════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘

e) это получилось! Теперь существуют два одноименных сегмента

Message(">%X\n",SegByName("MySeg"));

f) вызываем функцию SegByName передавая ей имя “MySeg”

>1000

g) результат – базовый адрес первого сегмента

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

аргумент

пояснения

segname

имя сегмента (регистр учитывается)

return

=return

пояснения

!=BADADDR

базовый адрес сегмента или значение селектора

==BADADDR

ошибка

Родственные функции: SegRename, SegName

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

базовый конца сегмента –––––––––--┐

┌–- имя сегмента │

╔═[■]═══▼══=====═════════════════=═════▼══ Program Segmentation ═════════════════════==═=====════3═[↑]═╗

║ Name Start End Align Base Type Cls 32es ss ds fs gs ▲

║ seg000 00000000 00010000 at 1000 pri N FFFF FFFF FFFF FFFF FFFF 00010000 00020000 ▓

║ ▓

║ ▼

╚1/1 ══════════════════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘

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