Сейчас на форуме: vsv1, Rio, site-pro, -Sanchez- (+6 невидимых)

 eXeL@B —› Софт, инструменты —› Пишу интерактивный дизассемблер. Как обрабатывать пересекающиеся инструкции ?
Посл.ответ Сообщение

Ранг: 0.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 декабря 2012 03:23
· Личное сообщение · #1

Здравствуйте уважаемые коллеги !

Ваяю свой интерактивный дизассемблер. Дизассемблируемый код хранится в собственной БД, где каждому байту соответствует набор некоторых свойств, в том числе там хранится признак начала и конца инструкции. При дизассемблировании кода для процессора с переменной длиной инструкций (например x86) может возникнуть нештатная ситуация, когда середина одной инструкции является началом другой. Причем пересекающихся инструкций на таком участке может быть несколько. Возникает вопрос - как отображать подобные участки кода ? К примеру, IDA не умеет обрабатывать такие случаи и создаёт инструкцию определенную при первом проходе анализатора, а в точке перехода на середину инструкции будет команда типа jmp loc_12345+1.

Возникают вопросы :

1) Насколько важно, чтобы дизассемблер умел анализировать подобные исключения ?
2) Как лучше представить такую информацию в листинге ? Ведь фактически это два разных кода, выполняющих разные инструкции, но закодированные хитрым образом в одном участке программы.

Заранее спасибо за любые мнения.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 11 декабря 2012 08:55
· Личное сообщение · #2

andreyv ну как по мне тут 2 проблемы. 1ая это действительно детект таких инструкций, кто сказал что сам jmp loc_12345+1, не является много вариантной инструкцией?. ну и 2ая это на глаз определять что инструкция составная, ИМХО достаточно какнибудь разукрашивать ее, не так как основной код, с возмжностью если надо, посмотреть откуда на нее идут джампы и что это за инструкции спрятаны

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 11 декабря 2012 10:03
· Личное сообщение · #3

andreyv
Можно добавить типа комментария, в котором отображать альтернативные варианты (для всех возможных положений).
Можно открывать по правой клавише мыши окошко с альтернативными вариантами.
Или, скажем, по нажатию на клавишу '+' менять содержимое (адрес+инструкция).
Еще как-нибудь - зависит от интерфейса, который ты выберешь.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 11 декабря 2012 10:49
· Личное сообщение · #4

andreyv пишет:
Возникают вопросы :

1) неважно
2) никак, это может быть а) обфускация, которую надо снимать и замусореных инструкций может быть тонна, б) это может быть оффсет на код или данные, либо смещения внутри внутренних данных, и это уже никак не понять только разбирая код это видно

кончайте заниматся ерундой, уже IDA есть, и помнится уже да делфи кто то начал писать... и тихо



Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 11 декабря 2012 12:07
· Личное сообщение · #5

Ну вот уже и отговаривать начали, а я почти закончил (((



Ранг: 0.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 декабря 2012 14:05 · Поправил: andreyv
· Личное сообщение · #6

Спасибо за ответы.

reversecode, каждый своей ерундой занимается, и разве плохо когда существует не один продукт ? Обфускацию безусловно нужно снимать, но это ведь не причина, чтобы дизассемблер не умел работать с пересекающимися инструкциями. Пусть бы даже и вручную, но дать возможность пользователю отделить мух от котлет.


crypto, про комментарии думал, но как-то не очень симпатично получается. Ведь комментарии привязаны к конкретному адресу и конкретной инструкции. Да и действительно, если пересечений много, листинг замусорится конкретно. А интерфейс я оставляю на самый последний этап разработки, как модуль - чтобы можно было любой запилить.

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




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 11 декабря 2012 14:31
· Личное сообщение · #7

andreyv пишет:
разве плохо когда существует не один продукт ?

вы уже +100500 который создает продукт который врядли продержится хотя бы месяц,
и как минимум < 30% что он вообще будет закончен

andreyv пишет:
Обфускацию безусловно нужно снимать, но это ведь не причина, чтобы дизассемблер не умел работать с пересекающимися инструкциями. Пусть бы даже и вручную, но дать возможность пользователю отделить мух от котлет.

запустите IDA, там это тоже можно снимать вручную - тоесть интерактивно или автоматом с помощю других питон плагинов



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 11 декабря 2012 14:48
· Личное сообщение · #8

reversecode да че вы на человека накинулись, каждый др..чит как он хочит. Это лучше чем вирусню на ВБ писать. andreyv удачи в разработке, даже если она не будет иметь конечного продукта, самому тебе от этого будет опыт и польза

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 0.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 декабря 2012 15:15
· Личное сообщение · #9

VodoleY, спасибо на добром слове !

reversecode, не подскажете, как в IDA это посмотреть ? Какой плагин качать и к какой версии IDAы ?



Ранг: 6.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2012 16:01
· Личное сообщение · #10

Тоже не понимаю таких людей.Смысл изобретать велосипед,думаете будет лучше чем WinDASM или IDA?
Более разумно разработать программу для деморфинга обфусцированного кода или виртуальной машины, хотя я думаю тут нужны такие познания каких у автора нет



Ранг: 0.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 декабря 2012 16:33
· Личное сообщение · #11

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



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 11 декабря 2012 16:50
· Личное сообщение · #12

andreyv Глянь ЛС. есть пару вопросов.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 11 декабря 2012 23:59
· Личное сообщение · #13

andreyv пишет:
не подскажете, как в IDA это посмотреть ? Какой плагин качать и к какой версии IDAы ?

Вручную - понятно как, пересоздавать руками инструкции в иде. Плагинов никто не даст. Потому что это ноухау. Но обычно при разборе простых обфускации пишут IDC/питоновый скрипт, который заменяет бесполезные инструкции на nop, по шаблону. Ида патчить код позволяет. Если что-то сложное то пишут плагин для анализа графа выполнения и вычленения бесполезных блоков.

Но посыл у reversecode в целом правильный: направьте свою энергию на расширение возможностей иды, и достигните бОльших результатов, чем если будет изобретать дизассемблер с нуля.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 0.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 декабря 2012 02:23
· Личное сообщение · #14

Hexxx, когда часть инструкций бесполезная, тут все понятно. А встречаются ли такие варианты, что обе перекрывающиеся ветки кода оказываются значимыми и ни одну из них нельзя откинуть ?

А энергии у меня много и куда направить её и помимо программирования хватает. Спасибо за совет.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 декабря 2012 02:43
· Личное сообщение · #15

andreyv пишет:
Какой плагин качать и к какой версии IDAы ?

optimice

andreyv пишет:
встречаются ли такие варианты, что обе перекрывающиеся ветки кода оказываются значимыми и ни одну из них нельзя откинуть ?

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



Ранг: 36.1 (посетитель), 11thx
Активность: 0.020
Статус: Участник

Создано: 24 января 2013 05:59
· Личное сообщение · #16

andreyv пишет:
1) Насколько важно, чтобы дизассемблер умел анализировать подобные исключения ?

зависит от того, какие цели преследует твоя программа по анализу бинарного кода и данных.
если просмотрщик типа hiew, то дизассемблируй на здоровье. Но например, при декомпиляции это уже нонсенс , так как стандартные компиляторы такой код не генерируют. Нужно такие ситуации оставлять для ручного анализа.
andreyv пишет:
2) Как лучше представить такую информацию в листинге ? Ведь фактически это два разных кода, выполняющих разные инструкции, но закодированные хитрым образом в одном участке программы.

По моему, дизассемблеру нужно представлять такой код в виде данных и внести в список проблем первичного анализа. Дальнейшее структурирование такого кода должно осуществляться на уровне, компетентном для анализа таких инструкций.(например, ида довольно таки долгое время не умела отделять мух от котлет при анализе кодовой секции дельфи программ, так как не использовала информацию об rtti ).


 eXeL@B —› Софт, инструменты —› Пишу интерактивный дизассемблер. Как обрабатывать пересекающиеся инструкции ?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати