Если кому интересно по поводу сабжа, буду рад вашему участию в данном проекте. Требования которые я выдвинул: 1. Должна быть выходная структура описывающая машинную инструкцию 2. В структуре доложно быть указан адрес следующей машинной инструкции, если это можно вычислить: К примеру call $-4 прыгает не следующую команду, а на 5-й байт этой инструкции 3. Поддержка 32-bit mode, после того как будет оттестировано для этого режима ввести поддержку 64-bit mode Пишите, а если увидели какой баг или есть предложения, да вообще критика буду рад! ЗЫ: Не смотря на то что свободный движков много, мне почему то ни один не понравился
когда приступишь к 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 так, что должен компирироваться под любую платформу и еще вопрос, а какой практический интерес твоего проекта, кроме упражнения мозгов, скучно работать толька за идею
SmikeX Мне нужен движок, почему: 1. Решение задачи об очистки конкретного участка кода от лапши 2. Обфускация 3. Созвание конвертера из x86-64 в пи-код Виртуальной машины 4. В случае возникновения бага в движке дизасма мне не придется ждать, когда у разработчика появится время, я сам себе хозяин! зы: Самый главный нюанс, мне не смогут сказать, что я должен заплатить за что либо! Даже если среда, то можно будет взять халявный компиллер и откомпиллить им!
Мне интересно. Но уверен, что проект в том виде, в котором он есть сейчас, развиваться не будет. Максимум, что с подобным подходом и тех. заданием может выйти, это 1 человек пишет, остальные смотрят что у него получилось, и говорят иногда откуда у него руки растут. Я сам трижды писал дизассемблер. И когда уже получал почти отлаженный движок оказывалось что он мне не нравится . На практике, это уже не написание дизасмлера в стиле copy-paste. Кстати это часть того, чем я в свободное время занимаюсь. (типа Advanced Dataflow & ControlFlow. Слежение вплоть до битов, анализ изменяемых и используемых флагов и др.)
Хорошо, начнем основы, а именно о совокупности в проекте дизассемблера описывающей свойства опкодов, как ты это видишь? Просто у разный движков разные таблицы,разные подходы
Я считаю, что для общего случая можно сделатъ БД с описанием всех свойств, форматов, кодов команд, а далее уже будет кодогенерация. Подобную работу очень легко распараллелить.
_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
Единственное, что я предлагаю разрабатывать совместно - базу данных в формате парадокс (у меня были наработки), которая может быть использована для кодогенерации. Алгоритмы разбора постбайтов и подобные, это не сложно и не представляет интереса.
Советую вопросы о вкусах и моде оставить, иначе эта ветка превратится в болтологию. Один мой учитель говорил что базу данных лучше создавать в том формате, который знаешь лучше всего. А конвертация совместимых форматов-не проблема.
Ну, в таком виде, как ты привел, он мне тоже не особо нравится Смысл там в том, что в таблицах я не указываю такие признаки, как наличие или отсутствие определенных бит в опкоде. Инструкции у меня разбиты на группы по сходному формату и в таблице записано соответствие каждого опкода определенной группе. Таким образом, попав в обработчик группы, например, xxxx xxxdw : mod r/m, уже нет необходимости проверять по флагам: есть, скажем, бит W в инструкции или нет. Остается только считать его значение.
Еще раз, я предлагаю не способ дизассембелирования, а метод написания дизассемблера, и если тебе хочется чтоб у тебя была таблица с форматами, пожалуйста, просто у тебя будет другой select.
А есть ли дизассемблер какой-нибудь с открытым кодом? Ну или какая-нибудь табличка опкодов - хорошо организованная чтобы несложно было ее применять? У меня задача попробовать посторить граф исполнения код(по крайней мере попытаться), так что особо заморачиваться с организацией таблиц опкодв и разбором бинарника не охота....
Можно обратить внимание на linice. У меня возникла безумная идея сделать отладчик для linux (вроде Olly), вот и начал смотреть как linice дизассемблит.
EvilsInterrupt А почему на Си. Должна быть выходная структура описывающая машинную инструкцию Если универсально, то лучше не структура, а класс. Во всяком случае где-то такое встречал - очень изящно получается, но уже не помню где. Тлько вот Си (++) принципиально не интерисуюсь.
Мой первый пост от 2006-08-29 12:49:27, господа за это время трабла определенно: либо решается либо отпадает из-за ненадобности. У меня она решилась настолько, насколько мне это было нужно! К тому же, класс - это совсем то, что требуется для решения этой задачи. Классы помогают, не загубить проект, большой проект, сильно помогают повысить модульность программы. Но я же программил для себя, а не для кого-нить, вот и делал так как мне надо. )