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

  • МАРКИРОВКА ПОЗИЦИЙ ДЛЯ БЫСТРОГО ПЕРЕМЕЩЕНИЯ МЕТОДЫ

  • ГЕНЕРАЦИЯ ВЫХОДНЫХ фАЙЛОВ int GenerateFile(long type, long file_handle, long ea1, long ea2, long flags);

  • ФАЙЛОВЫЙ ВВОД – ВЫВОД

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


    Скачать 2.86 Mb.
    НазваниеОписание функций встроенного языка
    Анкорobraz_mihlenia_-_dizassembler_IDA
    Дата29.09.2022
    Размер2.86 Mb.
    Формат файлаpdf
    Имя файлаobraz_mihlenia_-_dizassembler_IDA.pdf
    ТипСправочник
    #704305
    страница31 из 39
    1   ...   27   28   29   30   31   32   33   34   ...   39

    void Wait ();
    Функция ожидает конца авто анализа, после чего возвращает управление.
    Большинство скриптов не могут работать параллельно с фоновым дизассемблером по тем очевидным причинам, что ожидают полностью готовый к употреблению текст, а не динамически и непредсказуемо изменяющийся.
    Авто анализ происходит при загрузке нового файла, а так же при выполнении некоторых операций с исследуемым текстом. В интерактивном режиме можно дождаться окончания авто анализа визуально, но в пакетном так не получится.
    Для этого и служит эта функция. Хороший пример ее использования можно найти в файле 'analys.idc', поставляемом вместе с IDA.
    long AddHotkey(char hotkey, char idcfunc);
    Функция задает новую комбинацию клавиш для вызова функции IDA, определенной пользователем. Это очень удобное средство для интеграции своих скриптов в интерфейсную оболочку IDA.
    Операнд назначение
    Hotkey Требуемая комбинация клавиш.
    Записывается в виде символьной строки. Например, "Alt - A". Могут так же использоваться "Ctrl", "Shift", "Enter" а так же их комбинации. idcfunc Символьное имя функции. Например, 'MyFunc'.

    329
    В файле idc.idc содержатся следующие определения констант, связанных с возвращением значением этой функцией.
    Определение константа назначение
    IDCHK_OK
    0 успешное завершение
    IDCHK_ARG
    -1 неверные аргументы
    IDCHK_KEY
    -2 ошибка в синтаксисе горячей клавиши
    IDCHK_MAX
    -3 задано слишком много горячих клавиш.
    Создадим и откомпилируем для примера следующий файл: static MyFunc()
    {
    Message("Hello, IDA! \n");
    }
    Введем с консоли 'AddHotkey("ALT-A","MyFunc");
    '. Если теперь нажать 'Alt-A'
    , то на экране появиться приветствие ‘
    Hello, IDA!
    ’.
    Заметим, что перекрывать существующие клавиатурные комбинации можно совершенно безболезненно, за исключением того, что они автоматически не удаляются и ‘кушают’ при этом немного ресурсов, да и число "горячих клавиш" ограничено.
    Поэтому ненужные в этом момент комбинации рекомендуется предварительно удалять функцией 'DelHotkey'.
    success DelHotkey(char hotkey);
    Функция удаляет заданные пользователем "горячие клавиши". При попытке удаления системной или несуществующей комбинации функция возвратит ошибку.
    Операнд ‘hotkey’ был рассмотрен в описании функции AddHotKey.
    Пример использования:
    DelHotkey (“Alt-A”);
    Операнд назначение
    Hotkey Требуемая комбинация клавиш.
    Записывается в виде символьной строки. Например, "Alt - A". Могут так же использоваться "Ctrl", "Shift", "Enter" а так же их комбинации.
    ==return Пояснения
    ==1
    Успешное завершение
    Return
    ==0
    Ошибка
    МАРКИРОВКА ПОЗИЦИЙ ДЛЯ БЫСТРОГО ПЕРЕМЕЩЕНИЯ
    МЕТОДЫ
    Функция
    Назначение

    330
    void MarkPosition(long ea,long lnnum,long x,long y,long slot,char comment);
    Добавляет элемент в список быстрых переходов long GetMarkedPos(long slot);
    Возвращает линейный адрес закладки char GetMarkComment(long slot);
    Возвращает комментарий к закладке
    IDA поддерживает возможность быстрого перемещения между отдельными фрагментами дизассемблируемого текста с сохранением позиции курсора и относительного положения текста в окне.
    Для запоминания текущей позиции необходимо нажать , а для вызова списка всех запомненных ранее позиций . При этом возникнет следующего вида диалоговое окно:
    IDA позволяет формировать содержание этого списка не только интерактивно, но и с помощью функций встроенного языка. Это может быть удобно в тех случаях, когда скрипт в результате анализа возвращает требующие внимания со стороны пользователя линейные адреса. Чаще всего их просто выводят в окно сообщений, но это плохое решение. Гораздо удобнее вывести их в список быстрых переходов.
    void MarkPosition(long ea,long lnnum,long x,long y,long slot,char comment);
    Функция добавляет новый элемент в список быстрых переходов. Каждый элемент характеризуется следующим набором атрибутов.

    331
    Прежде всего, это линейный адрес строки, в которой расположен курсор.
    Поскольку, часто по одному и тому же адресу расположено несколько строк, то атрибут
    ‘lnnum’ указывает на требуемую строку, считая от нуля.
    Позиция курсора по горизонтали, начиная от левого края окна, задается атрибутом
    ‘x’, а ‘y’ по вертикали, считая от верхней границы окна. Поскольку курсор жестко связан с выбранной строкой, то IDA прокручивает текст в окне дизассемблера на требуемую величину.
    Положение элемента в списке определяется атрибутом Slot. Он может принимать любые значения в интервале от 1 до 20. Элементы не обязательно должны следовать друг за другом. Однако IDA не уничтожает пустые элементы в списке и поэтому задача их упорядочивания ложится на плечи разработчиков скрипта. Ситуация осложняется тем, что существует только один глобальный список, разделяемый одновременно как пользователем, так и всеми скриптами. Прежде, чем заносить новый элемент рекомендуется проверить, что требуемый слот свободен. Если указать слот, выходящий за допустимые границы, то IDA выведет интерактивный диалог для его выбора.
    Рассмотрим это подробнее на следующем примере:
    ╔══[ ]══════════════════════ IDA view-A ════════════════════2═[ ]═╗
    ║seg000:0122 ↑ pop dx ║
    ║seg000:0123 │ pop cx ║
    ║seg000:0124 │ pop bx ║
    ║seg000:0125 │ pop ax ║
    ║seg000:0126 │ retn ║
    ║seg000:0126 sub_0_DD │ endp ║
    ║seg000:0126
    Y

    ║seg000:
    0127
    │ ┬ ║
    ║seg000:0127 ; ____________│_│ S U B R O U T I N E _______________║
    ║seg000:0127 │ │ ║
    ║←─────────────
    X
    ──────────→↓
    Lnnum

    ║seg000:0127 sub_0_127 █ proc near ; CODE XREF: ║
    ║seg000:0127 call sub_0_DD ║
    ║seg000:012A retn ║
    ║seg000:012A sub_0_127 endp ║
    ║seg000:012A ║
    ║seg000:012B ║
    ║seg000:012B ; _______________ S U B R O U T I N E _______________║
    ║seg000:012B ║
    ║seg000:012B ║
    ║seg000:012B sub_0_12B proc near ; CODE XREF: ║
    ║seg000:012B push ax ║
    ║seg000:012C push si ║
    ║seg000:012D push di ║
    ╚══ 0001012C: sub_0_12B+1 ════════════════════════════════════════╝
    MarkPosition(0x10127, 4, 26, 12,1, “MyMark”);
    Допустимо существование двух и более объектов по одному и тому же линейному адресу, поскольку IDA идентифицирует их по номеру слота.
    Операнд Пояснения ea
    Линейный адрес начала строки lnnum
    Номер линии, располагающейся по тому же адресу начиная с нуля

    332
    X
    Горизонтальное положение курсора относительно левой границы окна
    Y
    Вертикальное положение курсора относительно верхней границы окна
    ==slot
    Пояснения
    ==1-20 Номер слота slot
    0 | >20 Интерактивный выбор номера слота
    Comment Комментарий к закладке
    long GetMarkedPos(long slot);
    Функция возвращает линейный адрес закладки по указанному slot. Подробнее о закладках можно прочитать в описании функции SetMarkedPos.
    Например: auto a; for
    (a=1;a<21;a++) if (GetMarkedPos(a)!=-1) Message(“0x%X \n”, GetMarkedPos(a));
    0x1005A
    0x10037 0x100A7 0x10392
    Обратите внимание, что следующий код не является корректным: auto a,x; a=0;

    333
    while
    ((x=GetMarkedPos(a++)!=-1)
    Message(“0x%X \n”, x);
    Закладки не обязаны следовать одна за другой, и могут разделяться пустыми слотами. В этом случае приведенный выше код дойдет лишь до первой такой «дырки».
    Операнд Пояснения
    ==slot
    Пояснения
    ==1-20
    Номер слота slot
    0 | >20
    Интерактивный выбор номера слота
    ==return
    Пояснения
    !=BADADDR
    Линейный адрес закладки
    Return
    ==BADADDR
    Ошибка
    char GetMarkComment(long slot);
    Функция возвращает комментарий к закладке, расположенной по указанному slot.
    Подробнее о закладках можно прочитать в описании функции SetMarkedPos.
    Например: auto a; for
    (a=1;a<21;a++) if (GetMarkComment(a)!=-1)
    Message(“%s \n”, GetMarkComment (a));
    _ZwFilter
    MyMark1
    WinALK aOpenFile
    Обратите внимание, что следующий код не является корректным: auto a,x; a=0; while ((x=GetMarkComment (a++)!=-1)
    Message(“%s \n”, x);
    Закладки не обязаны следовать одна за другой, и могут разделяться пустыми слотами. В этом случае приведенный выше код дойдет лишь до первой такой «дырки».

    334
    Операнд Пояснения
    ==slot
    Пояснения
    ==1-20
    Номер слота
    Slot
    0 | >20
    Интерактивный выбор номера слота
    ==return
    Пояснения
    !=””
    Комментарий к закладке
    Return
    ==””
    Ошибка
    ГЕНЕРАЦИЯ ВЫХОДНЫХ фАЙЛОВ
    int GenerateFile(long type, long file_handle, long ea1, long ea2, long flags);
    Функция генерирует выходной файл. Аналогичена по действию команде меню
    «

    File\Produce output file».
    Типичный пример использования приведен в файле Analyst.idc, поставляемым вместе с IDA.
    Допустимы следующие типы отчетов:
    Определение
    Тип файла отчета
    OFILE_MAP файл с отладочной информацией
    OFILE_EXE exe файл
    OFILE_IDC база IDA в виде IDC файла
    OFILE_LST полный файл отчета
    OFILE_ASM готовый к ассемблированию файл
    OFILE_DIF файл различий (более известный как crk)
    MAP-файл записывается в стандарте Borland и выглядит приблизительно следующим образом:
    Start Stop Length Name Class
    00000H 032E9H 032EAH seg000 CODE
    Address Publics by Value
    0000:0002 MyLabelName
    0000:0206 aScreen_log
    0000:03EA aDeifxcblst
    0000:22C0 start
    0000:2970 aOtkrivaemFail
    0000:297F aMyfile
    0000:2980 aYfile
    0000:298F aCalc
    Program entry point at 0000:22C0
    Он обычно используется для облегчения отладки программ. В коде становится легче ориентироваться по символьным меткам, переменным и функциям. Например, вместо абсолютного адреса для точки останова можно указывать его имя. Говорящие названия улучшают восприятие кода и не дают запутаться и повторно возвращаться к уже проанализированным фрагментам.
    Указанный формат поддерживают Borland Turbo Debuger, Periscope, а так же другие отладчики. Популярный Soft-Ice имеет в стандартной поставке конвертор, преобразующий такие файлы к своему собственному формату.

    335
    Некоторые отладчики не поддерживают сегментацию, а другие имеют ограничение на количество имен, поэтому генерацией файла можно управлять. Для этого определены следующие значения флага ‘flag’: определение пояснения
    GENFLG_MAPSEGS включать в файл карту сегментов
    GENFLG_MAPNAME включать «dummy» имена.
    «Dummy» имена представляют собой автоматически генерируемые IDA имена, используемые для определения меток, процедур и данных. Они выглядят в виде sub_, loc_, off_, seg_ и так далее. Обычно с целью не захламления листинга они не включаются в файл.
    EXE файл генерируется после того, как программа была изменена функциями
    PatchByte или PatchWord. Эти функции не изменяют оригинального файла, а только содержимое базы IDA, и что бы изменения возымели действия необходимо сгенерировать новый файл.
    К сожалению IDA поддерживает очень ограниченный список форматов. Вот это и все, что можно получить на выходе:
    1. MS DOS .exe
    2. MS DOS .com
    3. MS DOS .drv
    4. MS DOS .sys
    5. general binary
    6. Intel Hex Object Format
    7. MOS Technology Hex Object Format
    При этом exe файл генерируется заново. Он содержит ту же таблицу перемещаемых элементов (то есть ее невозможно изменить), а все неиспользуемые структуры заполняются нулями. Следует иметь ввиду, что некоторые программы чувствительны к таким изменениям и откажут в работе.
    К сожалению, не поддерживаются PE и другие win32 файлы. В этом случае (а так же когда exe файл чувствителен к неиспользуемым полям, – например, в свободное пространство заголовка иногда может быть помещен оверлей) можно сохранить различия в DIF файле и затем любой из поддерживающих его многочисленных утилит модифицировать оригинальный файл.
    IDA позволяет сохранять базу в виде текстового IDC файла. Это обеспечивает ее переносимость между различными версиями. Дело в том, что основной рабочий формат
    IDB в любой момент может измениться и база перестанет загружаться в новые версии. Для преодоления этой проблемы и был введен текстовой формат.
    Заметим, что это далеко не вся база и часть информации оказывается необратимо утерянной, например, отсутствует виртуальная память и для анализа вновь потребуется исходный файл, кроме того, загружаться IDC файл будет гораздо медленнее IDB, поскольку потребуется вновь все заново дизассемблировать. Поэтому применять данный формат в качестве рабочего совершенно бессмысленно.
    Но что же представляет из себя IDC файл? Как нетрудно догадаться по его расширению это обыкновенный скрипт! static Segments(void)
    {
    SegCreate(0x10000,0x132ea,0x1000,0,1,2);
    SegRename(0x10000,"seg000");
    SegClass (0x10000,"CODE");
    SetSegmentType(0x10000,2);
    }

    336
    И его можно безболезненно редактировать в отличие от бинарного IDB формата.
    Например, если IDA что-то неправильно дизассемблирует, то положение будет нетрудно исправить, отредактировав нужным образом скрипт.
    LST представляет собой копию дизассемблированного файла, в том виде, в каком он отображается на экране IDA. Выглядит он приблизительно так: seg000:0100 loc_0_100: seg000:0100 cmp byte ptr [bx+si], 0 seg000:0103 jz loc_0_108 seg000:0105 inc bx seg000:0106 jmp short loc_0_100
    Разумеется, он не пригоден для последующего ассемблирования и может использоваться только в качестве «твердой копии экрана». В демонстрационной версии генерация LST файла не поддерживается.
    ASM файл – это дизассемблированный файл полностью готовый к ассемблированию. Выглядит он следующим образом: p586n
    ; --------------------------------------------------------------------
    ; Segment type: Pure code seg000 segment byte public 'CODE' use16 assume cs:seg000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing,
    ; _______________ S U B R O U T I N E ________________________________ sub_0_0 proc near ; CODE XREF: sub_0_22DD+1E_p push ax push bx push cx push dx mov ax, 3D02h
    В демонстрационных версиях вывод дизассемблированного текста в ASM файл не поддерживается.
    DIF хранит в себе результаты сравнения оригинального и модифицированного функциями PatchByte и PatchWord файлов. Для некоторых форматов IDA позволяет генерировать исполняемый (или бинарный) файл, с учетом изменений.
    Однако в большинстве случаев этих возможностей оказывается недостаточно
    (например, не поддерживаются win32 форматы) и тогда приходится прибегать к сохранению всех изменений в отдельном файле.
    Формат его показан ниже:
    This difference file is created by The Interactive Disassembler xsafe-iv.exe
    00002390: 0C 11
    В нем нетрудно распознать типичный crk файл, который поддерживается многими утилитами (например, cra386) или модифицировать исходный файл вручную. Несложно написать скрипт на IDA-си, который будет выполнять такую работу автоматически.
    Для генерации любого типа файлов требуется задать виртуальный адрес начала и конца области. Если требуется вывести файл целиком, то в качестве адреса начала

    337
    можно задать 0, а в качестве конца константу BADADDR или –1.
    Функция GenerateFile не работает с именами файлов, она требует дескриптора уже открытого на запись файла. В упрощенном виде ее вызов может выглядеть так: auto a; a=fopen("myfile.ext","wt");
    GenerateFile (OFILE_ASM, a, 0, -1,0); fclose (a);
    Поскольку только в исключительно редких случаях требуется модификация только что сгенерированного файла, то полезно будет создать макрос или функцию, включающую в себя приведенный выше текст. Это упросит ее вызов и позволит программисту не отвлекаться на посторонние мелочи. операнд
    Пояснения type
    Тип генерируемого файла file_habdle
    Дескриптор открытого файла ea1
    Линейный адрес начала области для отображения в файле ea2
    Линейный адрес конца области для отображения в файле flags
    Флаги, управляющие, генерацией файла
    ФАЙЛОВЫЙ ВВОД – ВЫВОД
    IDA обладает развитым файловым вводом \ выводом, что открывает поистине неограниченные возможности. Можно самостоятельно загружать файлы любых форматов, можно создать отчеты и листинги любых видов. Можно распаковывать или модифицировать исполняемые файлы. Но даже при желании работать с принтером, или, например, модемом!
    Все это богатство возможностей реализуется относительно небольшим набором стандартных функций Си. Работа с файлами в IDA - Си ничем не отличается от
    «классического» Си. За тем, может быть, исключением, что ввиду отсутствия массивов в их общепринятом понимании, используется посимвольный, а не блочный обмен.
    long fopen (char file,char mode);
    Функция открывает файл и возвращает его обработчик в случае успешного завершения этой операции.
    Прототип функции полностью совпадает с аналогичной функцией в стандартной библиотеке Си. Действительно, реализация этой функции в IDA только передает управление библиотечной функции qfopen(char *,char *) без какой – либо дополнительной обработки аргументов.
    Необходимые атрибуты доступа задаются флагом mode в виде простой символьной строки. Их возможные значения будут показаны ниже.
    Атрибут Назначение w
    Открывает файл для записи. Если файл не существует, то он автоматически создается. Содержимое любого непустого файла будет уничтожено начиная с текущей позиции (по умолчанию с начала файла). r Открывает файл для чтения. Если указанный файл не существует,

    338
    то функция возвратит ошибку (NULL) a
    Открывает файл для записи и перемещает его указатель в конец, (то есть фактически открывает файл для до записи). Если указанный файл не существует, то он будет автоматически создан. r+
    Открытие файла на запись и чтение. Если файл не существует, то функция возвратит ошибку w+
    Открытие файла на запись и чтение. Если файл не существует, то он будет автоматически создан. Содержимое уже существующего файла будет уничтожено a+
    Открывает файл на чтение и дозапись в конец. Если файл не существует, то он автоматически будет создан
    Тип файла Пояснения t Открыть файл, как текстовой. В этом режиме символ CTRL-Z (ASCII
    27) трактуется, как конец файла. Так же по-особому транслируется символ переноса ‘\n’. Компилятор превращает его в код 0xA. При записи же его в текстовой файл функция на самом деле поместит комбинацию 0xD 0xA – интерпретируемую сервисами MS-DOS и некоторыми элементами управления Windows, как перенос на следующую строку.
    Часто с текстовыми файлами удобнее работать, открывая их как бинарные (смотри ниже) b Открыть файл как бинарный. В этом режиме все символы транслируются AS IS, без каких либо изменений.
    Функцию необходимо вызвать обязательно с указанием атрибута доступа и типа файла, иначе она завершиться с ошибкой.
    Если файл по каким-то причинам открыть не удалось, то функция возвратит ноль, в противном случае дескриптор открытого файла.
    Примеры использования:
    Del file.dem
    Message(“0x%X
    \n”,fopen(“file.dem”,”wb”);
    1 dir file.dem file.dem 0 11.11.99 13:33 file.dem
    Message(“0x%X \n”,fopen(“Long File Name”,”wb”);
    1 dir longfi1
    LONGFI1 0 11.11.99 15:06 Long File Name
    Message(“0x%X \n”,fopen(“myfile”,”r+b”);
    0
    Обратите внимание, что IDA возвращает один и тот же обработчик при открытии различных файлов, хотя прежние файлы не были явно закрыты. Это говорит о том, что они закрываются автоматически, после того как скрипт завершит свою работу.
    Часто забывают, что в Windows сохранилась поддержка имен устройств, идущая еще со времен CP\M. Поэтому, что бы вывести данные на печать достаточно открыть на

    339
    запись устройство “PRN” и направить в него необходимые данные.
    Например: writestr(fopen(“PRN”,”wt”),”Hello,Printer!”);
    Необходимо лишь учитывать, что эта печать идет в обход менеджера печати и, кроме того, так нельзя получить доступ к сетевому принтеру. Но в большинстве случаев и этих возможностей окажется достаточно.
    Точно так же можно читать данные с консоли или выводить их на нее. Конечно, при первой же перерисовке окна сообщений они будут стерты, но это наоборот, скорее достоинство, чем недостаток. Действительно, зачем загромождать окно сообщений?
    Операнд
    Пояснения
    File
    Имя файла (при необходимости с полным или частичным путем).
    Обе версии IDA (консольная и GUI) поддерживает длинные файлы. mode
    Атрибуты доступа и типа файла.
    Завершение Пояснения
    Успешное Дескриптор открытого файла (!=0)
    Return
    Ошибка ==0
    Закрытие всех открытых файлов гарантируется только при корректном выходе из
    IDA. И хотя, несмотря, на то, что операционная система гарантированно закроет все файлы, порожденные любым процессом (в том числе и IDA) при его завершении, может потеряться часть данных, которая в этом момент находилась во внутренних буферах IDA и еще не была записана на диск.
    1   ...   27   28   29   30   31   32   33   34   ...   39


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