Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.85.33] |
|
Сообщ.
#1
,
|
|
|
Нужно в программу ввести функцию перевода из асм кода (с мнемокодами) в бинарную запись и наоборот. Может кто подсказать куда двигаться?
|
Сообщ.
#2
,
|
|
|
Видимо в сторону www.intel.com, если нужно в x86
|
Сообщ.
#3
,
|
|
|
Вообще то это разные задачи. Если с ассемблированием все просто, то обратная операция посложнее. Аттачу очень простой дизассемблер, он нагляден и показывает основной принцип распознавания опкодов. Хотя есть и другой подход, в котором сначала распознается группа, а уж затем уточняется формат опкода, что более компактно, но менее производительно.
Прикреплённый файлDISASM.ZIP (41.22 Кбайт, скачиваний: 1011) |
Сообщ.
#4
,
|
|
|
Цитата AndNot @ Если с ассемблированием все просто, то обратная операция посложнее Мне почему-то показалось наоборот |
Сообщ.
#5
,
|
|
|
Да ну? И в чем здесь могут быть проблемы?
|
Сообщ.
#6
,
|
|
|
а ассемблирование это просто процесс подстановки опкодов вместо мнемогодов, так?
|
Сообщ.
#7
,
|
|
|
kalexi, почти так. Все опкоды делятся на 16-ть групп (от 0 до 15). Номер группы узнаешь по старшим четырем битам. Так вот, все команды в группе имеют одинаковый формат. Например сравни кодирование команд ADD и OR, принадлежащих к 0-й группе. Просто выпиши на листок их фомат, в двоичном виде и сразу заметишь общий принцип и собственно различия. Кстати, в дизасме, что я привел, команды уже разделены по группам, вот по ним и ориентируйся. Только еще нужно учитывать различные префиксы, байт sib, если присутствует. Ну и конечно адресацию (биты mod, r/m, reg), но для нее тоже можно таблицы составить, или взять из манов интела, там они уже есть.
|
Сообщ.
#8
,
|
|
|
kalexi
Дока про дизассемблер (точнее по его написанию) http://www.wasm.ru/comment.php?docid=16 |
Сообщ.
#9
,
|
|
|
Цитата AndNot @ Да ну? И в чем здесь могут быть проблемы? С разгребанием чего-там-юзер-накорябал В частности, парсинг вещей типа mov rax,[rbx+rcx*(a+b)-c] и подобных. Короче, вычисление констант на этапе препроцессинга. В исходнике может быть все что угодно, а в бинарнике - строго определенные байты. Которые от 0 до 255 В пользу этой мысли также говорит то, что дизасм (включая 64 бита и всякую фигню типа SSE) я нашкрябал, а вот асм... ps черт, архив великоват получается, хотел приклеить свою поделку |
Сообщ.
#10
,
|
|
|
Vic3Dexe, разгребание текста - это уже не к ассемблеру относится. А архив можно и на части разбить Интересно будет взглянуть.
|
Сообщ.
#11
,
|
|
|
Цитата AndNot @ разгребание текста - это уже не к ассемблеру относится Ну а ассемблер без этого смысла не имеет, как мне кажется Кроме того, в 64-битном режиме настает По дизасму - писан дельфой 6, в принципе и младшие его должны открывать, ничего особенного там нет. Поскольку для вывода используется RichEdit, на больших файлах (>2..3 M) начинаются тормоза. Победить это возможно только заменой RichEdit на что-то более вменяемое, но руки не доходят. В процессе написания пришлось идти на всякие ухищрения для скорости, поэтому при дизассемблинге создаются разные врЕменные файлы, не пугаться .txt файлы в корне жЫзненны - там шаблоны выходных строк для разных адресаций. Прилагается архив номер раз Прикреплённый файлdisasm.part1.rar (195.31 Кбайт, скачиваний: 1418) |
Сообщ.
#12
,
|
|
|
..и архив номер два
Добавлено Да, за кривизну/неэффективность кода ногами не бить - сам знаю Просто писалось для себя, ибо в срочном порядке нужен был 64-битный дизасм, а на его эффективность и красивость было положить Прикреплённый файлdisasm.part2.rar (72.17 Кбайт, скачиваний: 615) |
Сообщ.
#13
,
|
|
|
А есть переводчики? Мне нужно перевести машинный код в C++, может подскажите что-то по єтому поводу?
|
Сообщ.
#14
,
|
|
|
Есть. Например, в дизассемблере IDA есть примочка Hex-Rays, наверное самая продвинутая в этой области. Только вот результат не очень - слишком много неизвестных составляющих в коде, где и человек то ногу сломит, а тупая программа тем более. Потому, все эти "переводчики" интересны с познавательской точки зрения, но бесполезны с практической. Если кода немного, то проще вручную перевести.
|