Анимация
JavaScript
|
Главная Библионтека s0=substr(str,0,pos); s0=s0+ch; s0=s0+substr(str,pos+strlen(ch), strlen(str)); return s0; static setstr(str, pos, ch) { auto s0; s0=substr(str,0,pos); s0=s0+ch; s0=s0+substr(str,pos, strlen(str)); return s0; Первая из них позволяет в строке str заместить любую подстроку ch с позиции pos, а вторая осуществляет вставку с «раздвижкой» Примеры использования даны ниже, но для повседневного использования обе функции рекомендуется дополнить проверками корректности передаваемых параметров. Message("%s \n", setstr("Hello World!",5,",") Hello, World! Message("%s \n", insstr("Hello, World!",7,"my ") Hello, my World! Таким образом, достаточно лишь одной функции взятия подстроки, что бы обеспечить неограниченный доступ к объекту строка. Для этого достаточно лишь скопировать ее в другой объект, доступный нам для чтения и записи, например, виртуальную память, массив и так далее. К сожалению, это медленно работает, но зачастую является возможным единственным выходом. Другую группу строковых операций представляют функции всевозможного преобразования форматов. Например, перевод символьной строки в двоичное (шестнадцатеричное) число и наоборот. Однако, поскольку IDA поддерживает аналог функции sprintf, то чаще всего пользуются одним единственным вызовом form. Это гораздо удобнее, чем хранить в голове имена множества функций. char substr (char str, long x1,long x2); Функция осуществляет взятие подстроки. IDA не поддерживает стандартную для Си конструкцию str[a], поэтому для любого посимвольного разбора строки приходится вызывать substr Функция принимает следующие операнды: операнд пояснение
В версии 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); Функция осуществляет поиск подстроки в строке, принимая следующие операнды:
При успешном завершении возвращается индекс начала подстроки в строке. Если подстрока не найдена, то функция возвращает 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); Функция возвращает длину строки. Длина ненулевой строки равна индексу последнего символа плюс единица.
Перенос строки считается за один символ. Однако, при выводе строки в текстовой файл он представляется последовательностью символов 0xD 0xA, занимая, таким образом, два байта. Это необходимо учитывать при позиционировании внутри файла, а так же оценке необходимого свободного пространства на диске. Пример: Message("%d \n", str1enC"He11o, Word! \n")); 14 char form (char format,...); Ближайший аналог известной функции sprintf. Возвращает форматированную строку и преобразует длинные целые и числа с плавающей запятой в стоковые значения. Например: auto a,s0; a=0x123; s0=form("%x \n",a); Message(sO); form не единственное средство для преобразования типов, к тому же достаточно медленно работающие. В большинстве случаев рекомендуется использовать другие 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 [ 136 ] 137 138 139 140 |