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

Long FindBinary(long ea,long flag,char str)

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

В зависимости от флага направления поиск может идти как вперед (от младших адресов к старшим), так и назад (от старших адресов к младшим), регистр символов может как различаться, так и нет.

Аргумент ea задает линейный адрес начала поиска и не обязательно должен существовать.

Аргумент str задает подстроку поиска, выраженную в шестнадцатеричных кодах символов (точнее – в системе исчисления, установленной системой исчисления по умолчанию), разделенных между собой пробелами. Суффикс “h”, равно как и префикс “x” при этом указывать не нужно.

Аргумент flag задает направление поиска и определяет чувствительность к регистру символов: если его младший бит установлен поиск идет от младших адресов к старшим и, соответственно, наоборот; если первый справа бит (считая от нуля) установлен – прописные и строчечные буквы различаются и, соответственно, наоборот.

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

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

seg000:000C db 72h ; r

seg000:000D db 6Fh ; o

seg000:000E db 21h ; !

seg000:000F db 0 ;

Message(">%s\n",atoa(FindBinary( SegByName("seg000"),1,"49 44 41")));

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

аргумент

пояснения

ea

линейный адрес начала поиска

flag

=flag

пояснения

бит

#

0

0

поиск от старших адресов к младшим

1

поиск от младших адресов к старшим

1

0

не различать регистр символов

1

различать регистр символов

return

=return

Пояснения

!=BADADDR

линейный адрес найденной подстроки

==BADADDR

ошибка

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

Интерактивный аналог: “~Search\Text”, <Alt-T>

Сегменты и селекторы #Definition

Сегментом называется непрерывная область памяти, адресуемая относительно базового адреса сегмента.

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

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

Адрес начала сегмента задает наименьший адрес, принадлежащей сегменту; адрес конца сегмента – адрес, на единицу больше превышающий наибольший адрес, принадлежащий сегменту.

Никакой линейный адрес не может принадлежать более чем одному сегменту одновременно – т.е. сегменты не могут пересекаться.

В дальнейшем, если не оговорено обратное, адрес начала сегмента обозначается “startea”, адрес конца сегмента – “endea”, а базовый адрес – “BASE”.

Смещение первого байта в сегменте обозначается “startoffset” и связано с адресом начала и базовым адресом следующим соотношением:

startoffset = startea – BASE * 0x10

Формула 1 Смещение первого байта в сегменте

Смещения в сегменте измеряются целыми неотрицательными числами, следовательно, приравняв startoffset к нулю, получаем: .

Сегментный адрес [BASE:offset] связан с линейным адресом следующим соотношением:

ea = BASE * 0x10 + offset

Формула 2 Перевод сегментного адреса в линейный

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

Для облегчения преобразования сегментных адресов в линейные предусмотрен специальный макрос MK_FP(long BASE, long offset), возвращающий значение BASE*0x10+offset, а так же оператор «квадратные скобки» - “[BASE, offset]” аналогичного назначения.

Линейные адреса начала и конца сегмента представляют собой 32-битовые значения, ограничивающие максимальный размер сегмента четырьмя гигабайтами.

Базовый адрес представляет собой 16-битовое значение, ограничивающее адресуемую память одним мегабайтом, которого в ряде случаев оказывается недостаточно.

Замечание: размер сегмента ограничен разрядностью линейных адресов его начала и конца и составляет 4 гигабайта, но выбор адреса начала сегмента, первый байт которого имеет нулевое смещение, ограничен разрядностью базового адреса, и равен , т.е. немногим менее одного мегабайта.

Выход состоит в использовании селекторов, ссылающихся на 32-разрядные адреса, что позволяет адресовать с их помощью до 4 гигабайт.

К селектору можно обратится по его индексу в таблице селекторов. Индексы представляют собой 16-разрядные целые значения, увеличивающиеся с каждым очередным элементом на единицу.

Элементы таблицы – 32-разрядные базовые адреса сегмента, измеряемые в параграфах.

Таблица селекторов представляет собой разряженный массив, допуская создание элементов с несмежными индексами. Например, 0x5,0x07,0x16,0x88…

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

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

Замечание: создание двух сегментов с одинаковыми базовыми адресами допускается, но пользоваться этой возможностью категорически не рекомендуется.

Над каждым сегментом можно выполнять следующие операции – создание и удаление сегментов, получение и изменение основных характеристик сегментов (линейного адреса начала, линейного адреса конца, базового адреса), получение и изменение атрибутов сегмента (имя, кратность выравнивания, разрядность и т.д.). Подробнее об этом рассказано в главе «Функции, работающие с сегментами и селекторами».

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