Главная страница
Навигация по странице:

  • GetInputFile () ); My File.exe Return Пояснения Имя дизассемблируемого файла вместе с расширением СТРОКИ

  • РАЗНОЕ 419char Compile (char filename);

  • Описание функций встроенного языка


    Скачать 2.86 Mb.
    НазваниеОписание функций встроенного языка
    Анкорobraz_mihlenia_-_dizassembler_IDA
    Дата29.09.2022
    Размер2.86 Mb.
    Формат файлаpdf
    Имя файлаobraz_mihlenia_-_dizassembler_IDA.pdf
    ТипСправочник
    #704305
    страница38 из 39
    1   ...   31   32   33   34   35   36   37   38   39
    long Batch (long batch);
    Функция позволяет устанавливать (или снимать) пакетный режим работы. При этом IDA не выводит никаких диалоговых окон и не выдает предупреждений. Это может быть полезным при автономной работе и во время выполнения скриптов.
    В версии IDA 4.0 присутствуют некоторые ошибки в реализации пакетного режима.
    Так, например, попытка вызова калькулятора вызовет зависание IDA, поэтому пользоваться им следует с осторожностью и всегда обращать внимание, что бы скрипты, использующие его, возвращались в обычный режим при возрате в IDA.
    ==batch Режим
    0 Обычный режим
    1 Пакетный режим
    Функция возвращает прежний режим работы. Следующий скрипт определяет его текущее значение без изменений режима работы. auto a,s; s="нормальный"; a=Batch(0);
    Batch(a); if (a) s="пакетый";
    Message("Режимм работы %s \n",s);
    Режимм работы нормальный
    char GetIdaDirectory ();
    Функция возвращает полный путь к директории, в которой расположена IDA, без завершающего слеша в конце.
    Например:
    Message (“%s \n”, GetIdaDirectory ());
    D:\DEBUG\IDA384
    Return Пояснения полный путь к директории, в которой расположена IDA
    Точнее это путь к исполняемому файлу IDA.EXE (idaw.exe\ idax.exe). Расположение остальных файлов зависит от версии.
    Так, например, IDA 3.6 хранила все скрипты в базовом каталоге, а последние версии в каталоге IDC.
    Эти различия необходимо учитывать при поиске требуемых файлов. Желательно предусмотреть возможность диалога с пользователем и «ручным» указанием путей, а не полагаться на то, что требуемый файл окажется на месте.

    410
    char GetInputFile ();
    Возвращает имя дизассемблируемого файла вместе с расширением. Версия под win32 поддерживает длинные имена файлов, включая пробелы. Дозагрузка фалов не влияет на результат работы этой функции.
    Пример использования:
    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;

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

    412
    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 { 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 Ошибка
    При успешном завершении возвращается индекс начала подстроки в строке. Если

    413
    подстрока не найдена, то функция возвращает 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
    char form (char format,...);
    Ближайший аналог известной функции sprintf. Возвращает форматированную строку и преобразует длинные целые и числа с плавающей запятой в стоковые значения.
    Например: auto a,s0; a=0x123; s0=form("%x \n",a);
    Message(s0);
    123
    'form' не единственное средство для преобразования типов, к тому же достаточно медленно работающие. В большинстве случаев рекомендуется использовать другие

    414
    функции, преобразующие длинные целые в строку. 'form' выгодно применять только для чисел с плавающей запятой (‘float’).
    Управляющие символы стандартные, и частично совместимые с 'printf' и полностью совместимы со спецификаторами функции Message встроенного языка IDA.
    Сф пояснение
    %d десятичное длинное знаковое целое
    Пример:
    Message(“%d”,0xF);
    15
    %x шестнадцатеричное длинное целое строчечными символами
    Пример:
    Message(“%x”,10); a
    %X шестнадцатеричное длинное целое заглавными символами
    Пример:
    Message(“%X”,10);
    A
    %o восьмеричное длинное знаковое целое
    Пример:
    Message(“%o”,11);
    13
    %u десятичное длинное беззнаковое целое
    Пример:
    Message(“%u”,-1);
    4294967295
    %f десятичное с плавающей точной
    Пример:
    Message(“%f”, 1000000);
    1.e6
    %c символьное значение
    Пример:
    Message(“%c”,33);
    !
    %s строковое значение
    Пример:
    Message(“%s”,”Hello, Word! \n”);
    Hello, Word!
    %e вывод чисел в экспоненциальной форме
    Пример:
    Пример:
    Message(“%e”, 1000000);
    1.e6
    %g вывод чисел в экспоненциальной форме
    ЗАМЕЧАНИЕ: В оригинале спецификатор '%g' заставляет
    функцию саму решать, в какой форме выводить число - с десятичной
    точкой или в экспоненциальной форме, из соображений
    здравомыслия и удобочитаемости. IDA всегда при задании этого
    спецификатора представляет числа в экспоненциальной форме.

    415
    вывод указателя (не поддерживается)
    ЗАМЕЧАНИЕ: вместо спецификатора '%p' IDA использует '%a',
    преобразующее линейный адрес в строковой сегментный, и
    автоматически подставляет имя сегмента.
    Так, например,
    'Message("%a \n",0x10002
    )
    ' выдаст
    'seg000:2
    '.
    Обратите внимание, что таким способом нельзя узнать адрес
    переменной.
    Пример:
    auto a; a="Hello!\n";
    Message("%a \n",a);
    0
    Возвращается ноль, а не указатель на переменную.
    %p вывод десятичного целого всегда со знаком, не опуская плюс.
    %+d в оригинале - вывод шестнадцатеричного целого всегда со знаком, но ida воспринимает эту конструкцию точно так же как и ‘x'.
    %+x
    'n' длина выводимого десятичного числа, при необходимости дополняемая слева пробелами.
    Например:
    Message("Число-%3d \n”,1)
    ;
    Число- 1
    Если выводимое число не укладывается в 'n' позиций, то оно выводится целиком.
    Например:
    Message("Число-%3d \n”,10000)
    ;
    Число-10000
    %nd
    'n' длина выводимого шестнадцатеричного числа, при необходимости дополняемая слева пробелами.
    Например:
    Message("Число-%3x \n”,1);
    Число- 1
    Если выводимое число не укладывается в 'n' позиций, то оно выводится целиком.
    Напрмер:
    Message("Число-%3x \n”,0x1234);
    Число-1234
    %nd
    ‘n’ длина выводимого десятичного числа, при необходимости дополняемая слева незначащими нулями.
    Пример:
    Message("Число-%03d",1);
    Число-001
    Если выводимое число не укладывается в ‘n’ позиций, то оно выводится целиком.
    Пример
    Message("Число-%03d",1000)
    Число-1000

    416
    %0nx
    ‘n’ длина выводимого шестнадцатеричного числа, при необходимости дополняемая слева незначащими нулями.
    Пример:
    Message("Число-%03x",0x1);
    Число-001
    Если выводимое число не укладывается в ‘n’ позиций, то оно выводится целиком.
    Пример:
    Message("Число-%03x",0x1234);
    Число-1234
    %#x
    Вывод префикса ‘0x’ перед шестрадцатиричными числами
    Пример:
    Message(“%#x”,123);
    0x123
    %#o
    Вывод префикса ‘0’ перед восьмиричными числами
    Пример:
    Message(“%#o”,1);
    01
    %n Количество выведенных символов (не поддерживается)
    long xtol (char str);
    Функция преобразовывает строковое шестнадцатеричное значение str в длинное целое. операнд Пояснение srt Строковое шестнадцатиричное число
    Return
    ==return пояснения длинное целое
    ==0 Ошибка
    Разрешается использовать спецификаторы 'x' и 'h' для указания системы исчисления, в противном случае будет использоваться система исчисления по умолчанию
    (как правило, шестнадцатеричная).
    Функция понимает одиночный знак '+' или '-', но "спотыкается" на '+-1' или на префиксе шестнадцатеричных чисел '$', используемых языком Pascal.
    Числом считается все до первого нецифрового символа (кроме "A-F"). Так, например:
    Message(“0x%X \n”, xtol("123-2")
    );
    0x123
    В случае ошибки возвращается ноль. Так, например.
    Message(“0x%X \n”, xtol("*1")
    );

    417 0x0
    char atoa (long ea);
    Функция преобразовывает линейный адрес в строку, используя символьные имена сегментов, выбирая сегмент с наибольшим из возможных адресов. операнд Пояснение ea 32-разрядный линейный адрес
    Return
    ==return пояснения
    !=”” Сегментный адрес в строковом представлении
    ==”” Ошибка
    Так, например:
    +-[_]------------------------ Program Segmentation ----------------------3-[ ]-+
    ¦ Name Start End Align Base Type Cls 32es Start EA End EA -
    ¦ seg000 00000000 000032EA byte 1000 pub CODE N FFFF
    00010000 000132EA 0_
    ¦ _
    ¦
    +1/1 ______________________________________________________________ -+
    Message(“%s \n”, atoa(0x10000)
    ); seg000:0
    Если указанный адрес не принадлежит ни одному сегменту, то функция преобразует его к виду segment : offset, по стандартной формуле преобразования:
    segment = ea >> 4;
    offset = ea – (ea >> 4).
    Например:
    Message(“%s \n”, atoa(0x18)
    );
    1:00000008
    char ltoa (long n,long radix);
    Функция преобразовывает длинное целое в символьное с произвольной системой исчисления.
    Функция принимает следующие операнды: операнд назначение
    Задает операнд n
    ==n Операнд

    418 0 первый слева операнд
    1 Втрой, третий и остальные
    -1 все операнды radix требуемая система исчисления.
    ЗАМЕЧАНИЕ: В контекстной помощи IDA сообщается, что
    'radix' может принимать значения
    2, 8, 10, 16
    .
    Однако это
    стандартная Си-функция, и она может принимать и другие
    значения, например, 3 или 11. Точнее, все кроме 0 и 1, а так же
    не более 24, при которых, независимо от аргумента, функция
    возвращает пустую строку.
    Return
    ==return пояснения
    !=”” Сегментный адрес в строковом представлении
    ==”” Ошибка
    Пример: auto a; for (a=0;a<50;a++)
    Message ("%x, %s \n", a, ltoa(a,a));
    0,
    1,
    2, 10 3, 10 4, 10 5, 10 6, 10 7, 10 8, 10 9, 10 a, 10 b, 10 c, 10 d, 10 e, 10 f, 10 10, 10 11, 10 12, 10 13, 10 14, 10 15, 10 16, 10 17, 10 18, 10 19, 10 1a, 10 1b, 10 1c, 10 1d, 10 1e, 10 1f, 10 20, 10 21, 10 22, 10 23, 10 24, 10 25, 26, 27, 28, 29, 2a, 2b,
    2c, 2d, 2e, 2f, 30, 31,
    long atol (char str);
    Функция преобразует строковое десятичное значение в длинное целое.
    Постфикс 'h' игнорирует, а, встретив префикс 'x', возвращает нулевое значение. операнд Пояснение srt Строка, заканчивающаяся нулем
    Return
    ==return пояснения длинное целое
    ==0 Ошибка
    Пример:
    Message ("%x \n", atol ("16")
    );
    10
    РАЗНОЕ

    419
    char Compile (char filename);
    Очень полезная функция, компилирующая в память указанные файлы (скрипты
    IDA). Все функции, объявленные в них, будут глобальными и доступными всем остальным скриптам вплоть до завершения сеанса работы с IDA.
    Обычно так главный модуль скрипта подключает все остальные необходимые ему функции, находящиеся во внешних файлах. Обратите внимание, что 'Compile' только компилирует, но не запускает функцию 'main()'. Если модуль требует инициализации, то 'main' придется вызвать вручную. Однако в компилируемом файле не должно содержаться функции, совпадающей по имени с текущей (то есть вызвавшей ‘Compile’). Иначе поведение дизассемблера окажется непредсказуемым. В остальных случаях совпадение имен откомпилированных функций приводит лишь к их замещению.
    Заметим, что системные функции таким образом перекрыть не удастся и выдастся сообщение об ошибке. Любопытно, что 'Compile' возвращает не код ошибки, а осмысленную символьную строку. В случае успеха операции - пустую.
    Пример: demo.idc: static MyFunc()
    {
    Message("Hello, Sailor! \n");
    } compl.idc static main()
    {
    Compile("demo.idc");
    MyFunc();
    }
    Загрузим и запустим на выполнение 'compl.idc' На экране появиться 'Hello,
    Sailor!'. Нетрудно убедиться, что функция 'MyFunc' доступна и с консоли и с остальных скриптов.
    Заметим, что IDA сложным образом манипулирует с понятием текущего каталога, поэтому если приведенный пример не сработает, попробуйте указать полный путь к файлу 'demo.idc'
    void Exit (long code);
    Функция осуществляет выход из IDA в операционную систему, сохраняя все последние изменения и закрывая базу.
    Выполнение скрипта при этом прерывается. Закрытие активных файлов не гарантируется.
    Операнд назначение code' код завершения процесса

    420
    long Exec (char command);
    Функция позволяет выполнить команду операционной системы, не выходя из
    IDA.
    Операнд Пояснение command
    Команда операционной системы (как правило командного интерпретатора command.com)
    Эта команда расширяет возможности скриптов. Можно, например, удалять временные файлы, или склеивать их командой 'copy' и делать многие другие вещи, в том числе писать вирусы и троянские компоненты. (Поэтому с присланными вам скриптами сомнительного происхождения следует вести себя крайне осторожно)
    Для запуска параллельного процесса предусмотрена команда 'start', например
    Exec("start command.com").
    В Windows приложение запуститься в соседнем окне.
    В этом случае функция возвращает не код завершения процесса (поскольку таковой еще не известен), а результат исполнения программы, использующейся операционной системой для запуска приложения. Для консольных программ, это как правило ‘conagent’
    Крайне рекомендуется проверять все скрипты, полученные из чужих рук на наличие этой команды.
    Пример использования:
    Exec (“command.com /c del *.tmp”);
    1   ...   31   32   33   34   35   36   37   38   39


    написать администратору сайта