Всем привет. Я решил попробовать начать цикл статей по модернизации нашей с вами любимой IDA Pro.
В каждом из туториалов я попытаюсь раскрыть довольно таки сложную и мало изученную тему: написание различных модулей:
  • загрузчики;
  • плагины;
  • дебагер-плагины;
  • процессорные модули;
  • скрипты.

И, если процессорные модули, плагины и скрипты — тема все таки более менее раскрытая, то все остальное — практически полный мрак (в конце статьи я дам список литературы и проектов, где есть хоть что-то).

Итак, первая статья из цикла будет посвящена написанию плагина-отладчика, а точнее предварительной теории. В штатной поставке IDA SDK уже имеются исходники основных дебагеров (Windows, Linux, Mac). Но как быть, например, с Amiga, M68000?

Данная статья скорее будет посвящена скучной и не очень теории. Настоятельно рекомендуется с ней ознакомиться, т.к. многие моменты в дальнейшем могут быть непонятны именно из-за невозможности представить общую концепцию.

Для начала, определимся с тем, какие бывают плагины-отладчики.

Типы дебагер-плагинов


У плагинов-отладчиков для IDA бывает два основных типа:
  • локальный — исполняется на той же машине, на которой происходит процесс отладки;
  • удаленный (RPC) — исполняется удаленно. Придется дергать его локальным плагином.

Еще есть кое-какие другие, но они не будут рассмотрены в данных статьях (или будут?). Я опишу здесь только локальный отладчик, т.к. удаленный требует в два раза больше кода (клиент и сервер), и еще не достаточно хорошо мной изучен.

Составляющие дебагер-плагина


  • Собственно, IDA. Посылает команды, принимает и реагирует на сообщения от дебагера, отображает текущее состояние отладки;
  • Эмулятор нужного нам процессора или кода. Допустим, он умеет выполнять инструкции, сообщать о брейкпоинтах, приостанавливать и продолжать процесс эмуляции, стартовать и завершать процесс;
  • Ну и сам дебагер-плагин. Он должен взаимодействовать с эмулятором, посылать сообщения в IDA, читать текущее состояние регистров, памяти.

Итак, обо всех составляющих по порядку.

IDA — визуальный интерфейс


Собственно, сама IDA является переходником между интерфейсом пользователя и дебагером, посылая ему команды, и ожидая какой-либо реакции (сообщений). Команды могут быть такими:
  • Завершение обработки текущего события;
  • Начало / пауза / завершение процесса или потока;
  • Шаг (Step Into, Step Over, Step Until Return);
  • Установка / удаление бряков;
  • Чтение / запись памяти или регистров;

Дебагер-плагин


Задача плагина — реагировать на команды от IDA (см. выше), и посылать ей события следующих типов, сработавших в эмуляторе:
  • Старт / приостановка / присоединение / отсоединение от / завершение процесса;
  • Старт / завершение потока;
  • Брейкпоинт;
  • Шаг (Step Into, Step Over, Step Until Return);
  • Исключение.

Посылать сообщения нужно, чтобы IDA знала, что сейчас происходит, и отображала текущее состояние отладки. При наступлении, например, событий бряка или шага, должно отобразиться окно отладчика, с целью ожидания дальнейших действий от пользователя.

Эмулятор — всему голова


Каково назначение эмулятора? Конечно, выполнение инструкций. Еще он умеет хранить контекст. Иногда, держит информацию о брейкпоинтах (а бывает, что и нет — тогда приходится их реализовывать на уровне дебагера). Так же, бывает, что функции приостановки / продолжения исполнения сам эмулятор не имеет, и приходится ее как-то реализовывать. Одно радует — обычно исходники эмуляторов для многих платформ уже существуют, и, зачастую, их нужно только чуть-чуть модернизировать под нашу задачу.

Итак, эмулятор сообщает в дебагер о наступлении в себе событий:
  • Произошел запуск / завершение процесса или потока;
  • Сработал брейкпоинт;
  • Был выполнен шаг;
  • Сработало исключение.

События


Разберем событие Шага:
  1. Я нажимаю в IDA клавишу F7 (Step Into);
  2. В дебагер попадает команда завершения последнего наступавшего до этого события. Обычно дебагер в этом случае должен будет сказать эмулятору продолжить исполнение;
  3. Далее дебагер получает команду выполнения шага в потоке, реагирует на это выполнением одной инструкции эмулятора;
  4. Эмулятор сообщает обратно в дебагер о том, что событие STEP наступило, помещая его в очередь событий (об очереди событий читайте ниже);
  5. Дебагер достает из очереди событий отправленное событие, и сообщает о нем в IDA;
  6. IDA реагирует на наступившее событие. В данном случае, осознает, что шаг был выполнен, и показывает текущий адрес EIP, на который мы встали после выполнения шага;
  7. После того, как мы насмотрелись на окно IDA с состоянием регистров и прочего, и хотим что-то сделать дальше (например, другой шаг, нажимая F7), происходит снова цикл на первый пункт.

Очередь событий:
Такая штука, которая постоянно крутится в отдельном потоке дебагера, в ожидании наступления новых событий эмулятора. Получая новое событие, необходимо приостановить эмуляцию (т.к. шаг подразумевает фриз процесса), а затем передать событие в IDA. Когда IDA сообщит, что событие обработано, в дебагер придет команда завершения обработки текущего события.

Как видите, тема очень мутная, и, не очень простая. Но, это так кажется на первый взгляд. В следующей статье мы приступим собственно к написанию дебагер-плагина, заодно и разберемся, что да как.

— Список литературы и проектов:


  • The IDA Book — лучшая в своем роде книга по IDA Pro. Там есть практически все (ну, кроме как о дебагерах).
    MUST HAVE!;
  • deci3dbg — один из двух публичных дебагер-модулей.
    Отладчик для PS3;
  • idados — второй дебагер-модуль, хоть и жутко кривой (но автора можно простить, т.к. тема мало изучена и сейчас).
    Отладчик MS-DOS;
  • idados_dosbox — мой форк предыдущего проекта. Хотя бы собирается нормально, и не так бажит;
  • IDASDK\plugins\debugger — то, с чего все начинают. Сложно, непонятно.

Комментарии (11)


  1. farcaller
    13.07.2015 16:12
    +6

    текст несколько тяжело читается от странного обилия разных стилей форматированя. Может стоит убавить объем жирного текста с подчеркиванием?


    1. DrMefistO Автор
      13.07.2015 16:15

      Даже не знаю. Сделано это с целью указать, на то, кто именно и кому что посылает. Если уж очень режет глаза, я поубираю.


      1. farcaller
        13.07.2015 16:20
        +3

        В статье есть подчеркивания, жирный курсив, курсив обычный и с подчеркиванием, жирные подчеркнутые слова, просто жирные. Несколько много стилей для такого объема, не находите?


    1. DrMefistO Автор
      13.07.2015 16:18

      Починил. Спасибо.


      1. Dywar
        13.07.2015 21:48

        Мне такое оформление нравится, легко по тексту бегать, видно ключевые моменты в тексте и названия.


        1. pfemidi
          13.07.2015 23:20
          +2

          Лично у меня подчёркнутые слова ассоциируются со ссылками или аббревиатурами, на которые автоматом ставится мышка чтобы или посмотреть что это в случае аббревиатур, или сходить ссылке. А данном случае это оказывается «Иногда сигара — это просто сигара» © Зигмунд Фрейд, что несколько сбивает с толку. Так что я полностью согласен с farcaller что читать данный текст тяжеловато.


  1. REU
    13.07.2015 16:21
    +3

    > Итак, первая статья из цикла будет посвящена написанию плагина-отладчика.
    Ну так это первая статья и тут нет ничего кроме теориии о том как должно всё работать.


    1. DrMefistO Автор
      13.07.2015 16:24

      Исправил текст. Статья будет не единственная. Об этом и название говорит.


      1. REU
        13.07.2015 16:27
        +3

        Всё равно статья как-то ни о чем…


        1. DrMefistO Автор
          13.07.2015 16:27
          -2

          Потому что начало. Без нее будет сложно. Не спешите.


  1. pehat
    13.07.2015 16:25

    Ура, наконец-то можно будет не запускать Turbo Debugger в DOSBox'е!