Набор статей и руководств по дизассемблеру IDA

             

Конвертор inst.pl


Как Вы уже могли догадаться, я не руками формирую файл x86data.c. Эту идею я позаимствовал из Nasma - создаётся файл с данными, в удобном для обращения с ним формате, а уже из него генерируется файл на C. Для подобных манипуляций предназначен script на любимом мною Perlе inst.pl.

Он запускается примерно так:

perl inst.pl [параметры командной строки]

где параметры могут быть следующими:

  • -c file

    Проверить файл заголовков на наличие ошибок. В настоящее время реализованы только две проверки - на наличие дублирующихся itype, а также поиск пропущенных itype. Отчёт помещается в file.

  • -d file

    Задаёт имя файла данных. Имя по умолчанию - data

  • -i file

    Задаёт имя файла заголовков. Имя по умолчанию - x86.h

  • -n file

    Генерирует файл-шаблон file для дальнейшего заполнения его данными.

  • -o file



    Устанавливает имя выходного файла. Имя по умолчанию - x86data.c. Если выходной файл уже существует - программа сообщает об этом и завершает исполнение, существующий файл не модифицируется.

  • -s

    Игнорировать инструкции из файла заголовков, помеченные комментариями с тремя вопросительными знаками.

  • -?

    Показывает краткую инструкцию по использованию программы...

  • Эта замечательная программа сильно сокращает время создания файла с данными. Она автоматизирует проверку файла заголовков, может сгенерировать файл шаблон для дальнейшего заполнения его данными, и самое главное - она сама генерирует файл с данными, при этом проверяя его правильность и производя оптимизацию по размеру - структуры с одинаковыми данными представлены в выходном файле только один раз, используются несколько указателей на эти структуры. В случае же, если я (или кто-либо ещё) захочет добавить ещё какие-либо характеристики к каждой инструкции, script можно легко переписать для включения в него необходимой функциональности.

    Формат входного файла для inst.pl:

    # комментарии [имя инструкции] keyword: data ...

    [имя инструкции] - это название инструкции, взятое из файла заголовков. Я не использую численных значений (хотя это было бы быстрее в обработке) по той причине, что Вам всё равно нужно будет для каждого численного значения находить мнемоническое имя из файла заголовков. Когда inst.pl запускается с ключом -n, она генерирует файл, в котором будут прописаны в таком виде мнемоники всех инструкций из файла заголовков.


    keyword: data - характеристики инструкции. В настоящее время программа понимает следующие keyword:


    • cflags

      Изменяемые инструкцией флаги. Можно указывать как большими, так и маленькими буквами.


    • rflags

      Флаги, от которых зависит результат выполнения инструкции. Можно указывать как большими, так и маленькими буквами.


    • uflags

      Флаги, состояние которых не определено после выполнения инструкции. Можно указывать как большими, так и маленькими буквами.


    • regs

      Самое главное (собственно, ради чего и была написана библиотека) - регистры, изменяемые инструкцией. Можно указывать как большими, так и маленькими буквами.


    • op

      Битовая маска операндов, изменяемых инструкцией. Для операнда 1 используется первый бит, для операнда 2 - второй, и т.д.


    • type

      Тип инструкции (FPU, MMX и т.д.). Можно указывать как большими, так и маленькими буквами.


    • from

      Указывает тип процессора, начиная с которого инструкция распознаётся. Можно указывать как большими, так и маленькими буквами.


    • fcflags

      Флаги FPU, изменяемые инструкцией. В настоящее время не помещаются в выходной файл. Можно указывать как большими, так и маленькими буквами.


    • fuflags

      Флаги FPU, состояние которых не определено после выполнения инструкции. В настоящее время не помещаются в выходной файл. Можно указывать как большими, так и маленькими буквами.


    • Для cflags,rflags,uflags & regs производится проверка на наличие дублирующих данных (в случае их обнаружения они просто игнорируются). Каждый keyword должен присутствовать для одной инструкции не более одного раза.


      Содержание раздела