Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Desassembler
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Sugar
Господа, не подумайте что хочу заняться пиратсовом, оровать чужие идеи и т.д.
Ради спортивного интереса?
Попробовал IDA и AVRStudio.
Впечатления хорошие, пробовал так, прошил кристалл, (программа loader), считал hex, дизассемблировал IDA, получил asm.
Вопрос такой, а можно этот asm переконвертировать в c.
ведь распространены всего пару компиляторов:IAR, WinAVR, CodeVision, ImageCraft.
Они же из с делают asm, могут ли они делать обратную операцию, из asm - С.
xyzzy
Цитата(Sugar @ Mar 11 2005, 05:10)
Господа, не подумайте что хочу заняться пиратсовом, оровать чужие идеи и т.д.
Ради спортивного интереса?
Попробовал IDA и AVRStudio.
Впечатления хорошие, пробовал так, прошил кристалл, (программа loader), считал hex, дизассемблировал IDA, получил asm.
Вопрос такой, а можно этот asm переконвертировать в c.
ведь распространены всего пару компиляторов:IAR, WinAVR, CodeVision, ImageCraft.
Они же из с делают asm, могут ли они делать обратную операцию, из asm - С.
*


Если руками, то, в принципе можно при достаточном терпении восстановить оригинальный алгоритм. Но чаще проще просто взять оригинальный ассемблерный код.

Автоматическое декомпилирование - тема не одной докторской диссертации и пока практическое применение декомпиляторов весьма ограничено. Для явы есть несколько програм, но их задача полегче. Есть кое-что для i386, а вот с экзотическими процессорами (типа АВР biggrin.gif ) будет сложнее.

Если интересно, вот ссылки на два проекта по теме (и диссертации, тоже)

* REC(reverse engineering compiler) http://www.backerstreet.com/rec/rec.htm
* DCC http://www.itee.uq.edu.au/~cristina/dcc.html

--xyzzy
Sugar
Спасибо, ссілки интересніе, я не думал что это так сложноsmile.gif
GeorgyBey
К цели (бинарный машинный код, заливаемый во флэш) ведет теоретитески неограниченное число путей - программ на ОДНОМ из языков, в данном случае ассэмблер. По этому ОДНОЗНАЧНОГО дизассемблирования ИСХОДНОГО текста программы принципиально не может быть. От языков более высокого уровня к ассэмблеру - аналогично. По этому возможно только нечто усредненно-приближенное, дающее ТАКОЙ ЖЕ машинный код. biggrin.gif
bbg
Цитата(Sugar @ Mar 11 2005, 15:10)
Вопрос такой, а можно этот asm переконвертировать в c.
ведь распространены всего пару компиляторов:IAR, WinAVR, CodeVision, ImageCraft.
Они же из с делают asm, могут ли они делать обратную операцию, из asm - С.


Попросите Ильфака Гуильфанова (автор IDAPro) прикрутить соотв. сигнатуры,
хотя вряд ли он согласится :-).
А однозначно восстановить по асму с на автомате - нету такой тулзы.
Даже если компилилось без оптимизаций..
gcc-user
Цитата(Sugar @ Mar 11 2005, 15:10)
Вопрос такой, а можно этот asm переконвертировать в c.
ведь распространены всего пару компиляторов:IAR, WinAVR, CodeVision, ImageCraft.
Они же из с делают asm, могут ли они делать обратную операцию, из asm - С.
*


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

Как говорится "фарш невозможно прокрутить назад" ( © не мой ).

Более того, существуют програмки (обфускаторами называются), которые из C текстов делают тоже C-текст, но "нечитаемый". Так вот, имеь обфусцированный C-текст почти то же, что и иметь asm-текст. Автоматические преобразователи сгенерят C-текст, в котором разбираться ничуть не легче, чем в asm-е. Так что, только ручками, ручками и головой. Иногда бывает проще написать проект заново, чем разбираться по объектному коду.
M_A
Цитата(GeorgyBey @ Apr 11 2005, 08:59)
К цели (бинарный машинный код, заливаемый во флэш) ведет теоретитески неограниченное число путей - программ на ОДНОМ из языков, в данном случае ассэмблер. По этому ОДНОЗНАЧНОГО дизассемблирования ИСХОДНОГО текста программы принципиально не может быть. От языков более высокого уровня к ассэмблеру - аналогично. По этому возможно только нечто усредненно-приближенное, дающее ТАКОЙ ЖЕ машинный код. biggrin.gif
*

То есть если это усредненно приближенное снова экспортировать в НЕХ и залить в железо, будет работать как первоначальный вариант?
Andrey_Sudnov
Видел еще на добром старом ZX Spectrum защиту интересную (правда уже на IBM PC в эмуляторе рассматривал). Смотю на дизасемблерный листинг, с виду мусор полный - несколько раз записывется в одини и те же регистры, команды циклов с переходами вперед, какие то константы с потолка, переходы на второй байт команды, которая только что исполнялась и т.д. В итоге через несколько тысяч таких команд в конце блока образуется нормальный цикл, который проходит по всей этой цепочке и преобразует ее в нормальный код, на который потом и передается управление.

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

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

Другое дело, что самом деле существует не так уж много алгоритмических конструкций, и машину можно научить распозновать их. Очень легко машине отслеживать поток данных, т.е. указав начальный и конечный адрес получить на выходе алгоритма все входные данные, все выходные и все побочные эфекты (изменяющиеся в процессе) этого участка кода. Существуют даже перекомпиляторы из одного машинного кода в другой, например http://fabrice.bellard.free.fr/qemu/

Мне самому очень интересен этот вопрос. Нашел очень много информации в различных источниках. Что интересно в СССР в 70-80 годах на академическом уровне активно развивалась теория схем программ. В библиотеке очень много книг об этом.

Современное развитие эта тема имеет в построении интерпретаторов, таких как Java, Perl и т.д. В западных источниках очень много публикаций по этому вопросу.

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

Я вам советую потренироваться диззасемблировать вручную (в смысле с помощью IDA, но без тех средств, которые вы ищите). Во первых это полезно (поможет вам в дальнейшем при вылавливании тяжелых глюков у ваших программ). Во вторых врядли необходимо полная декомпиляция всего файла. Обычно необходимо найди участок кода, в котором выполняется интересуемое действие, например проверка защиты, или реализован какой-то протокол, хотя в этом случае изучаемый участок будет больше. Очень скоро вы обнаружите, что при хорошей автоматизации и организации, вы очень просто читаете машинные листинги и способны держать в голове назначение и текущее значение нескольких регистров и т.д. Короче это всего лишь дело опыта. А без труда, как известно, не выташишь и рыбку и пруда. И всякие там средства будут вам не нужны.
GeorgyBey
Цитата(M_A @ Apr 11 2005, 15:49)
Цитата(GeorgyBey @ Apr 11 2005, 08:59)
К цели (бинарный машинный код, заливаемый во флэш) ведет теоретитески неограниченное число путей - программ на ОДНОМ из языков, в данном случае ассэмблер. По этому ОДНОЗНАЧНОГО дизассемблирования ИСХОДНОГО текста программы принципиально не может быть. От языков более высокого уровня к ассэмблеру - аналогично. По этому возможно только нечто усредненно-приближенное, дающее ТАКОЙ ЖЕ машинный код. biggrin.gif
*

То есть если это усредненно приближенное снова экспортировать в НЕХ и залить в железо, будет работать как первоначальный вариант?
*


Именно smile.gif , для того он дизассемблер и создан. Он (диз..ер) СОЗДАЕТ ассемблерный код, который после компиляции будет идентичен исследуемому.
То-есть, "типа сбегает за куском мяса, похожему на перекрученный на фарш", но никак не будет "склеивать" мясо из фарша. tongue.gif
vvs157
Цитата(Sugar @ Mar 11 2005, 15:10)
Вопрос такой, а можно этот asm переконвертировать в c.
ведь распространены всего пару компиляторов:IAR, WinAVR, CodeVision, ImageCraft.

*


Вопрос: для чего? Для анализа алгоритма или для того, чтобы вставить кусок кода в другую С-программу? Если 1-е - то это абсолютно вредное занятие. Вы намного скорее разберетесь в ASM тексте, чем в том, что выдал Вам ASM->C (при условии, что реверсируемый код был писан именно на ASMe). Проверено неоднократно на разных платформах (I51, Z80, MOS6502, 68HC11, IA32) на собственном опыте, много чего приходилось реверсить. Если второе - то можно, но нет смысла, так как в С программу Вы всегда можете вставить ASM кусок.
Sergio66
К сожалению, а может быть и к счастью, проблема дезассемблирования на сегодня не решена даже теоретически. и уж тем более, если автор не хочет чтобы его код был вскрыт, нет ничего проще, чем определит внутри кода структуру данных, которые могут трактоваться как код, и к тому же, содержать данные, трактуемые, как команды перехода. Вот тут, даже ручками не пройдешь.
bbg
Цитата(Sergio66 @ Apr 20 2005, 11:40)
нет ничего проще, чем определит внутри кода структуру данных, которые могут трактоваться как код, и к тому же, содержать данные, трактуемые, как команды перехода. Вот тут, даже ручками не пройдешь.
*


Пройдешь-пройдешь, если правильно заточены. Одни мои очень
хорошие знакомые, взяв ящик пива и запустив ИДУ с полезными макросами
как-то за ночь расковыряли Архикад (очень качественная защита)
и вырезали нахрен все обращения к донглу. Сорри, если оффтоп, АВР тут
не при чем..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.