Образ мышления – дизассемблер IDA Pro. Том I [Крис Касперски] (pdf) читать постранично, страница - 96

-  Образ мышления – дизассемблер IDA Pro. Том I  2.67 Мб, 426с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Крис Касперски

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

этой функции.
Пример использования:
Message (“%s \n “,
GetInputFile ()
);
My File.exe
Return

Пояснения
Имя дизассемблируемого файла вместе с расширением

СТРОКИ
К сожалению, встроенный язык IDA не поддерживает даже основных конструкций
Си для работы со стоками. Так, например, невозможно получить посимвольный доступ к
стоке или указатель на нее же.
Зато IDA поддерживает инициализацию и контекцию, (слияние) строк, что
демонстрирует следующий пример:
auto a,b;
a="Hello";
b="IDA! \n";
a=a+","+b;
Message("%s \n",a);
Hello,IDA!
Таким образом, строки в IDA представляют собой закрытые объекты, доступные
лишь посредством набора, манипулирующих с ними функций. Их всего три.
Это определение длины строки (strlen), взятие подстроки (substr) и поиск подстроки
(srtsrt). Возможность модификации строки отсутствует, и в том случае, когда возникает
потребность изменить хотя бы один символ, приходится перестраивать всю строку
целиком.
Для этого может пригодиться две следующие функции, которые рекомендуется
включить в idc.idc, что бы сделать их доступными для всех пользовательских скриптов.
static setstr(str, pos, ch)
{
auto s0;
410

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'
Функция принимает следующие операнды:
операнд

пояснение
411

x1
x2
Return
char

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

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

Если конечный индекс лежит за пределами строки, то IDA просто возвращает
остаток строки и аварийной ситуации не возникает.
Пример использования этой функции для построения
простейшего
синтаксического анализатора:
auto a,temp,c;
a="key -Hello";
for (temp=0;temp> 4;
offset = ea – (ea >> 4).
Например:
Message(“%s \n”,
atoa(0x18)
);
1:00000008

char ltoa (long n,long radix);
Функция преобразовывает длинное целое в символьное с произвольной системой
исчисления.
Функция принимает следующие операнды:
операнд
n

назначение
Задает операнд
==n Операнд
417

radix

Return

0 первый слева операнд
1 Втрой, третий и остальные
-1 все операнды
требуемая система исчисления.
ЗАМЕЧАНИЕ: В контекстной помощи IDA сообщается, что
'radix' может принимать значения 2, 8, 10, 16. Однако это
стандартная Си-функция, и она может принимать
и другие
значения, например, 3 или 11. Точнее, все кроме 0 и 1, а так же
не более 24, при которых, независимо от аргумента, функция
возвращает пустую строку.
==return пояснения
!=”” Сегментный адрес в строковом представлении
==”” Ошибка

Пример:
auto a;
for (a=0;a