Начал разрабатывать свой дизассемблер

Тема в разделе "WASM.PROJECTS", создана пользователем EvilsInterrupt, 29 авг 2006.

  1. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Если кому интересно по поводу сабжа, буду рад вашему участию в данном проекте.

    Требования которые я выдвинул:
    1. Должна быть выходная структура описывающая машинную инструкцию
    2. В структуре доложно быть указан адрес следующей машинной инструкции, если это можно вычислить:
    К примеру call $-4 прыгает не следующую команду, а на 5-й байт этой инструкции
    3. Поддержка 32-bit mode, после того как будет оттестировано для этого режима ввести поддержку 64-bit mode

    Пишите, а если увидели какой баг или есть предложения, да вообще критика буду рад!

    ЗЫ:
    Не смотря на то что свободный движков много, мне почему то ни один не понравился
     
  2. SmikeX

    SmikeX New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2003
    Сообщения:
    20
    когда приступишь к AMD64 дай знать, может быть и проучаствую в зависимости от наличия
    свободного времени, а так дизассемблер 80x86 16 и 32-bit modes уже пройденный этап
    см здесь
    http://xedit.smike.ru/disasm.htm
    http://www.ircdb.org/disasmdll.htm
    http://www.ircdb.org/disassembler.jpg
    изначально дизассемблер не был самостоятельной задачей и код самого дизассемблера был написан в
    ANSI C так, что должен компирироваться под любую платформу

    и еще вопрос, а какой практический интерес твоего проекта, кроме упражнения мозгов,
    скучно работать толька за идею
     
  3. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    SmikeX
    Мне нужен движок, почему:
    1. Решение задачи об очистки конкретного участка кода от лапши
    2. Обфускация
    3. Созвание конвертера из x86-64 в пи-код Виртуальной машины
    4. В случае возникновения бага в движке дизасма мне не придется ждать, когда у разработчика появится время, я сам себе хозяин!

    зы:
    Самый главный нюанс, мне не смогут сказать, что я должен заплатить за что либо! Даже если среда, то можно будет взять халявный компиллер и откомпиллить им!
     
  4. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Мне интересно.

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

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

    На практике, это уже не написание дизасмлера в стиле copy-paste. Кстати это часть того, чем я в свободное время занимаюсь. (типа Advanced Dataflow & ControlFlow. Слежение вплоть до битов, анализ изменяемых и используемых флагов и др.)
     
  5. EvilsInterrupt

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

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

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Я считаю, что для общего случая можно сделатъ БД с описанием всех свойств, форматов, кодов команд, а далее уже будет кодогенерация.
    Подобную работу очень легко распараллелить.
     
  7. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    _Serega_
    1.
    Я бы предложил пуступить также как поступил Ms-Rem в своем движке.

    пример:

    #define b_d 0x1
    #define b_w 0x1 << 0x1
    #define b_s 0x1 << 0x2
    #define b_reg 0x1 << 0x3

    BYTE Options[256] = {
    b_d | b_w,
    b_reg,
    b_s
    }

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

    2.
    Интересный способ применил rmn но мне не нравится, ибо код будет не наглядным! Как он поступил:

    #define c1 0x1 // xxxx xxxxx
    #define c2 0x2 // xxxx xxxdw : mod r/m
    #define c3 0x3 // xxxx tttn : imm8

    etc
     
  8. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Единственное, что я предлагаю разрабатывать совместно - базу данных в формате парадокс (у меня были наработки), которая может быть использована для кодогенерации. Алгоритмы разбора постбайтов и подобные, это не сложно и не представляет интереса.
     
  9. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Ну и на фига породокс?
    Лучше уж XML, сколько угодно вложенность, модно! )))
     
  10. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Советую вопросы о вкусах и моде оставить, иначе эта ветка превратится в болтологию. Один мой учитель говорил что базу данных лучше создавать в том формате, который знаешь лучше всего.
    А конвертация совместимых форматов-не проблема.
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Ну, в таком виде, как ты привел, он мне тоже не особо нравится :)
    Смысл там в том, что в таблицах я не указываю такие признаки, как наличие или отсутствие определенных бит в опкоде.
    Инструкции у меня разбиты на группы по сходному формату и в таблице записано соответствие каждого опкода определенной группе. Таким образом, попав в обработчик группы, например, xxxx xxxdw : mod r/m, уже нет необходимости проверять по флагам: есть, скажем, бит W в инструкции или нет. Остается только считать его значение.
     
  12. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Еще раз, я предлагаю не способ дизассембелирования, а метод написания дизассемблера, и если тебе хочется чтоб у тебя была таблица с форматами, пожалуйста, просто у тебя будет другой select.
     
  13. Leksey

    Leksey New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    33
    А есть ли дизассемблер какой-нибудь с открытым кодом? Ну или какая-нибудь табличка опкодов - хорошо организованная чтобы несложно было ее применять?

    У меня задача попробовать посторить граф исполнения код(по крайней мере попытаться), так что особо заморачиваться с организацией таблиц опкодв и разбором бинарника не охота....
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    полно. гугл выдаст дофига всего)
     
  15. STiven_Dedal

    STiven_Dedal New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2005
    Сообщения:
    5
    Можно обратить внимание на linice.
    У меня возникла безумная идея сделать отладчик для linux (вроде Olly), вот и начал смотреть как linice дизассемблит.
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    gdb уже не рулит чтоли? =\
     
  17. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    EvilsInterrupt
    А почему на Си.
    Должна быть выходная структура описывающая машинную инструкцию
    Если универсально, то лучше не структура, а класс. Во всяком случае где-то такое встречал - очень изящно получается, но уже не помню где. Тлько вот Си (++) принципиально не интерисуюсь.
     
  18. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Мой первый пост от 2006-08-29 12:49:27, господа за это время трабла определенно: либо решается либо отпадает из-за ненадобности. У меня она решилась настолько, насколько мне это было нужно!

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