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

Char substr (char str, long x1,long x2);

Функция осуществляет взятие подстроки. IDA не поддерживает стандартную для Си конструкцию str[a], поэтому для любого посимвольного разбора строки приходится вызывать 'substr'

Функция принимает следующие операнды:

операнд

пояснение

x1

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

x2

индекс конца подстроки

если x2 == -1, то возвращается весь остаток строки целиком

Return

Пояснение

char

Подстрока

В версии 3.84 и более ранних, эта функция не имела никакого контроля над границами индексов, и если оказывалось, что x2 < x1, то Windows закрывала приложение IDA, как совершившее недопустимую операцию. Так же наблюдалась непредсказуемая работа приложения при выходе индексов за границы строки.

В версии 4.0 этот недостаток уже устранен. В случае x2 < x1 функция возвращает, пустую строку, а при нарушении границ доступа (начальный индекс за границами строки) хоть и выводит диалоговое окно, сообщающие о нарушении границ доступа, но не выходит из дизассемблера, позволяя продолжить работу.

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

Если конечный индекс лежит за пределами строки, то IDA просто возвращает остаток строки и аварийной ситуации не возникает.

Пример использования этой функции для построения простейшего синтаксического анализатора:

auto a,temp,c;

a="key -Hello";

for (temp=0;temp<strlen(a);temp++)

{

c=substr(a,temp,temp+1);

if (c=="-")

{

Message (substr(a,temp+1,-1));

break;

}

}

Hello

Long strstr (char str, char substr);

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

Операнд

пояснния

'str'

строка

'substr'

подстрока

Return

==return

пояснения

!=BADADDR

Индекс подстроки в строке

==BADADDR

Ошибка

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

Недокументированной особенностью этой функции, является возможность сравнения тождественности числовых выражений. Так, например, strstr(0x1234,0x1234) возвратит ‘0', а strstr(0x1234,0x123) - BADADDR, т. е. ошибку.

Поиск пустой подстроки всегда успешен; поиск в пустой строке всегда возвращает ошибку.

Пример:

auto a,temp;

a="key -Hello";

temp=strstr(a,"-");

if (temp!=-1) Message (substr(a,temp+1,-1));

Hello

Long strlen (char str);

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

операнд

Пояснение

srt

Строка, заканчивающаяся нулем

Return

пояснения

Длина строки

Перенос строки считается за один символ. Однако, при выводе строки в текстовой файл он представляется последовательностью символов 0xD 0xA, занимая, таким образом, два байта.

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

Пример:

Message("%d \n", strlen("Hello, Word! \n"));

14

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