Архитектура дизассемблера - требования, реализация, сопровождение.

Тема в разделе "WASM.A&O", создана пользователем EvilsInterrupt, 19 дек 2006.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Всем здравствуйте.

    Вобщем прошло с того момента как я задался вопросом: "как же написать дизассемблер?".

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

    Я бы хотел спросить, тех кто уже писал свой дизассемблер, о том на какой именно архитек-
    туре они остановились и почему?

    Требования которые я выдвинул к дизассемблеру таковы:

    1. Легкость сопровождение исходного кода.
    - Код был настолько должен быть понятным, что внесение изменений в него не должно вызывать
    никаких трудностей, как для автора, так и для другого человека
    2. Легкость изменения инструкций и формата комманд процессора
    - Так как может возникнуть потребность изменить с i386 на другой процессор, к примеру ARM
    или какой нить другой
    3. Обязана быть выходная структура
    - Касательно процессора i386 в ней могут находиться, флаги распознанных префиксов, опкод,
    регистры, идмнемоники ( т.к. мнемоника может иметь множество хекс-значений и надо знать смысл
    этой команды), смещени, непосредственные данные

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

    Спасибо за внимание
     
  2. v_mirgorodsky

    v_mirgorodsky New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    53
    Может быть - несколько регрессивный вопрос, но зачем писать свой дизассемблер? Если вспомнить IDA, то он писался несколько лет, прежде чем стал что-то реальное/полезное собой представлять. Есть желание повторить этот путь?

    Теперь собственно по сути вопроса. Самым "правильным" подходом к решению такой задачи, IMHO, было бы создание упрощенного эмулятора выбранного процессора. Такой эмулятор мог бы фактически "выполнять" инструкции дизассемблируемого куска бинарных данных, выкладывая результаты своей работы в некий буфер. Таким образом, для x86 семейства задача сводится к построению дерева разбора всего набора инструкций выбранного процессора. При наличии удобоваримого варианта описания дерева, новый процессор можно было бы подключить просто создав еще один файл правил для парсера. Команды парсера могли бы выглядеть следующим образом: проанализируй биты с 0 по n входного потока даных, полученное значение используй как индекс в таблице переходов на следующее правило и так далее. В листьях дерева должны будут находиться дизассемблированные инструкции.
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    v_mirgorodsky
    Меня бы полностью устроила IDA, но я не могу воткнуть ее в свои проекты, возникает куча проблем(нет исходного кода, а имею ли я юридически на это право? и др.)

    До сих пор я использую движок от Ms-Rem, все бы хорошо, но исходный код уж жутко не понятный! :dntknw:

    Для чего нужно? В ридми к своему детищу Ms-Rem все кратко и верно описал, думаю мне его не переплюнуть по пояснению на фига нужен движок дизасма и потому я и не буду пытаться это делать.

    У меня в моей домашней практике, возникают задачи:
    1. Анализ исходного кода, про анализировать, как то или иное чудо творит винда(помогает WinDBG)
    2. Замена одной машинной команды на ряд других(Здесь помогает cadt плюсь свои мысли)
    3. Хранить лог результата выполнение того или иного куска кода(OllyDebug и скрипты)

    есть и другие задачи, но мне лень писать их, да и сформулировать тоже надо уметь :)

    по поводу, ваших мыслей, я вас не совсем правильно понял. Могли бы вы раскрыть свои мысли по подробней?
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    здесь смотрел:

    http://www.winasm.net/forum/index.php?showtopic=1287

    http://www.winasm.net/index.php?ind=downloads&op=entry_view&iden=143

    ?
     
  5. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    EvilsInterrupt
    Есть статья: "Using Code Normalization for Fighting Self-Mutating Malware".
    Раздел "3 Normalization Techniques".
    Подраздел "Instructions meta-representation"

    ИМХО у настоящего и полезного дизасмлера должна быть именно такая структура. Но я такие видел тока в теории. Кстати у Cifuentes тоже были такие идеи, и еще, ИМХО тока на таком движке можно реализовать настоящую кросс-дизассемблерность. Вобщем я свое ИМХО высказал. Пока и удачи!

    ЗЫ:
    http://portal.acm.org/ много че полезного надыбал, уже два дня там зависаю насчет новейших идей в реверсинге :)
     
  6. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    Я тоже писал свой. Только за отсутствием математических знаний, не строил какие то сложные модели, основывал все на банальных if else, и понял насколько не удобно вот так "в лоб" отслеживать состояния системы. Багов куча была - просто потому, что я не выработал четкой линии поведения своей модели в ответ на входные данные(То есть ту же информацию об Imm операнде я мог по разному обрабатывать, в зависимости от того, есть ли еще операнды, и прочее..., в разных местах кода информация сохранялась по своему).

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

    Фактически, после проекта я понял как я делать больше никогда не буду))

    А так, вообще - была выходная структура, которая просто заполнялась по мере анализа.
    Сначала определялся префикс, потом по таблице опкодов бралась возможная инфа об операндах, Mod\RM... Дальше, если был mod\rm анализировалось наличие sib и так далее.
     
  7. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    вдобавок, глючный. Из того, что пробовал, подошел только PVDasm h**p://pvdasm.reverse-engineering.net Исходник на С, относительно прост, корректно работал с моими наборами файлов (в отличие от cadt).
     
  8. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    ,

    Аргументируешь?
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.328
    вот некоторые ошибки декодирования. Это не все, а только то, что обнаружилось в первые, так сказать, часы знакомства :)

    Не помню из какой это версии cadt, возможно уже их пофиксили.

     
  10. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Я писал об этом на крэклабе. Ms-rem ответил в духе : "сам дурак". После этого я скачал свежий билд - ничего не изменилось. Больше не интересовался. На память, не декодировался ни один опкод связанный с регистром CRx.
     
  11. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    gazlan
    Мне он тоже не понравился, нет выходной структуры, а мне надо анализировать код, а не текст получать(для этого есть IDA).
     
  12. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Гм. Сам не пользовался, но если не нужен исходный код, только результат, то есть еще DLL от Vanja Fuckar. Сайт не помню. Народ хвалит.
     
  13. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    Я для своего проекта использую OllyDASM. Он может дизассемблировать и ассемблировать команды, сбоев за год использования пока не было, за исключением неправильной обработки 2х префиксов, но это легко фиксится.
     
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Чего мне не нравится в движке Ms-Rem:
    На примере простой команды.
    1. к примеру есть машинная команда, полученная после mov eax,ebx для 32-режима.
    2. И есть команда после mov ax,bx для 32-режима

    Сейчас п.1 != п.2
    Но, Если перед п.2 поставить переобределение размера размера операнда, а есть такой префикс, то становится факт п.1 = п.2

    Движок недает уловить одинаковые команды, путем идентификации размера, да я не спорю что можно посмотреть на наличие префикса, но куда проще было бы иметь идентификатор чем смотреть, а есть ли префикс. Чем проще? : Код при применении идентификтора размера операнда становится компактней и меньше по размеру!

    зы:
    Хоть кажется это и мелочью, но при анализе кода в автоматическом режиме уж очень становится острым вопрос сведение равнозначных команд в какую либо систему, чтобы на оснавании системы признаков строить код.


    Спасибо за Внимание, может я в чем-то и не прав. Удачи вам и жду нравоучений :)