![]() |
eXeL@B —› Софт, инструменты —› Пишу интерактивный дизассемблер. Как обрабатывать пересекающиеся инструкции ? |
Посл.ответ | Сообщение |
|
Создано: 11 декабря 2012 03:23 · Личное сообщение · #1 Здравствуйте уважаемые коллеги ! Ваяю свой интерактивный дизассемблер. Дизассемблируемый код хранится в собственной БД, где каждому байту соответствует набор некоторых свойств, в том числе там хранится признак начала и конца инструкции. При дизассемблировании кода для процессора с переменной длиной инструкций (например x86) может возникнуть нештатная ситуация, когда середина одной инструкции является началом другой. Причем пересекающихся инструкций на таком участке может быть несколько. Возникает вопрос - как отображать подобные участки кода ? К примеру, IDA не умеет обрабатывать такие случаи и создаёт инструкцию определенную при первом проходе анализатора, а в точке перехода на середину инструкции будет команда типа jmp loc_12345+1. Возникают вопросы : 1) Насколько важно, чтобы дизассемблер умел анализировать подобные исключения ? 2) Как лучше представить такую информацию в листинге ? Ведь фактически это два разных кода, выполняющих разные инструкции, но закодированные хитрым образом в одном участке программы. Заранее спасибо за любые мнения. ![]() |
|
Создано: 11 декабря 2012 08:55 · Личное сообщение · #2 andreyv ну как по мне тут 2 проблемы. 1ая это действительно детект таких инструкций, кто сказал что сам jmp loc_12345+1, не является много вариантной инструкцией?. ну и 2ая это на глаз определять что инструкция составная, ИМХО достаточно какнибудь разукрашивать ее, не так как основной код, с возмжностью если надо, посмотреть откуда на нее идут джампы и что это за инструкции спрятаны ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 11 декабря 2012 10:03 · Личное сообщение · #3 andreyv Можно добавить типа комментария, в котором отображать альтернативные варианты (для всех возможных положений). Можно открывать по правой клавише мыши окошко с альтернативными вариантами. Или, скажем, по нажатию на клавишу '+' менять содержимое (адрес+инструкция). Еще как-нибудь - зависит от интерфейса, который ты выберешь. ![]() |
|
Создано: 11 декабря 2012 10:49 · Личное сообщение · #4 andreyv пишет: Возникают вопросы : 1) неважно 2) никак, это может быть а) обфускация, которую надо снимать и замусореных инструкций может быть тонна, б) это может быть оффсет на код или данные, либо смещения внутри внутренних данных, и это уже никак не понять только разбирая код это видно кончайте заниматся ерундой, уже IDA есть, и помнится уже да делфи кто то начал писать... и тихо ![]() |
|
Создано: 11 декабря 2012 12:07 · Личное сообщение · #5 |
|
Создано: 11 декабря 2012 14:05 · Поправил: andreyv · Личное сообщение · #6 Спасибо за ответы. reversecode, каждый своей ерундой занимается, и разве плохо когда существует не один продукт ? Обфускацию безусловно нужно снимать, но это ведь не причина, чтобы дизассемблер не умел работать с пересекающимися инструкциями. Пусть бы даже и вручную, но дать возможность пользователю отделить мух от котлет. crypto, про комментарии думал, но как-то не очень симпатично получается. Ведь комментарии привязаны к конкретному адресу и конкретной инструкции. Да и действительно, если пересечений много, листинг замусорится конкретно. А интерфейс я оставляю на самый последний этап разработки, как модуль - чтобы можно было любой запилить. В общем, я понял. Предусмотреть надо, а в листинг включать пометку, что код многовариантный с возможностью переключать эти варианты. В один листинг всё не впихнуть. ![]() |
|
Создано: 11 декабря 2012 14:31 · Личное сообщение · #7 andreyv пишет: разве плохо когда существует не один продукт ? вы уже +100500 который создает продукт который врядли продержится хотя бы месяц, и как минимум < 30% что он вообще будет закончен andreyv пишет: Обфускацию безусловно нужно снимать, но это ведь не причина, чтобы дизассемблер не умел работать с пересекающимися инструкциями. Пусть бы даже и вручную, но дать возможность пользователю отделить мух от котлет. запустите IDA, там это тоже можно снимать вручную - тоесть интерактивно или автоматом с помощю других питон плагинов ![]() |
|
Создано: 11 декабря 2012 14:48 · Личное сообщение · #8 reversecode да че вы на человека накинулись, каждый др..чит как он хочит. Это лучше чем вирусню на ВБ писать. andreyv удачи в разработке, даже если она не будет иметь конечного продукта, самому тебе от этого будет опыт и польза ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 11 декабря 2012 15:15 · Личное сообщение · #9 |
|
Создано: 11 декабря 2012 16:01 · Личное сообщение · #10 |
|
Создано: 11 декабря 2012 16:33 · Личное сообщение · #11 |
|
Создано: 11 декабря 2012 16:50 · Личное сообщение · #12 |
|
Создано: 11 декабря 2012 23:59 · Личное сообщение · #13 andreyv пишет: не подскажете, как в IDA это посмотреть ? Какой плагин качать и к какой версии IDAы ? Вручную - понятно как, пересоздавать руками инструкции в иде. Плагинов никто не даст. Потому что это ноухау. Но обычно при разборе простых обфускации пишут IDC/питоновый скрипт, который заменяет бесполезные инструкции на nop, по шаблону. Ида патчить код позволяет. Если что-то сложное то пишут плагин для анализа графа выполнения и вычленения бесполезных блоков. Но посыл у reversecode в целом правильный: направьте свою энергию на расширение возможностей иды, и достигните бОльших результатов, чем если будет изобретать дизассемблер с нуля. ----- Реверсивная инженерия - написание кода идентичного натуральному ![]() |
|
Создано: 12 декабря 2012 02:23 · Личное сообщение · #14 |
|
Создано: 12 декабря 2012 02:43 · Личное сообщение · #15 andreyv пишет: Какой плагин качать и к какой версии IDAы ? optimice andreyv пишет: встречаются ли такие варианты, что обе перекрывающиеся ветки кода оказываются значимыми и ни одну из них нельзя откинуть ? если не ошибаюсь это называется полиморфный код, и это совершенно другая задача. это не задача декомпиллера. ![]() |
|
Создано: 24 января 2013 05:59 · Личное сообщение · #16 andreyv пишет: 1) Насколько важно, чтобы дизассемблер умел анализировать подобные исключения ? зависит от того, какие цели преследует твоя программа по анализу бинарного кода и данных. если просмотрщик типа hiew, то дизассемблируй на здоровье. Но например, при декомпиляции это уже нонсенс , так как стандартные компиляторы такой код не генерируют. Нужно такие ситуации оставлять для ручного анализа. andreyv пишет: 2) Как лучше представить такую информацию в листинге ? Ведь фактически это два разных кода, выполняющих разные инструкции, но закодированные хитрым образом в одном участке программы. По моему, дизассемблеру нужно представлять такой код в виде данных и внести в список проблем первичного анализа. Дальнейшее структурирование такого кода должно осуществляться на уровне, компетентном для анализа таких инструкций.(например, ида довольно таки долгое время не умела отделять мух от котлет при анализе кодовой секции дельфи программ, так как не использовала информацию об rtti ). ![]() |
![]() |
eXeL@B —› Софт, инструменты —› Пишу интерактивный дизассемблер. Как обрабатывать пересекающиеся инструкции ? |