реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Desassembler, Дизассемблирование hex под AVR
Sugar
сообщение Mar 11 2005, 12:10
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 24-12-04
Из: Украина
Пользователь №: 1 657



Господа, не подумайте что хочу заняться пиратсовом, оровать чужие идеи и т.д.
Ради спортивного интереса?
Попробовал IDA и AVRStudio.
Впечатления хорошие, пробовал так, прошил кристалл, (программа loader), считал hex, дизассемблировал IDA, получил asm.
Вопрос такой, а можно этот asm переконвертировать в c.
ведь распространены всего пару компиляторов:IAR, WinAVR, CodeVision, ImageCraft.
Они же из с делают asm, могут ли они делать обратную операцию, из asm - С.
Go to the top of the page
 
+Quote Post
xyzzy
сообщение Apr 10 2005, 08:30
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 95
Регистрация: 10-04-05
Пользователь №: 4 003



Цитата(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


--------------------
--xyzzy
Go to the top of the page
 
+Quote Post
Sugar
сообщение Apr 11 2005, 06:17
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 24-12-04
Из: Украина
Пользователь №: 1 657



Спасибо, ссілки интересніе, я не думал что это так сложноsmile.gif
Go to the top of the page
 
+Quote Post
GeorgyBey
сообщение Apr 11 2005, 08:59
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 21-12-04
Из: Киев
Пользователь №: 1 593



К цели (бинарный машинный код, заливаемый во флэш) ведет теоретитески неограниченное число путей - программ на ОДНОМ из языков, в данном случае ассэмблер. По этому ОДНОЗНАЧНОГО дизассемблирования ИСХОДНОГО текста программы принципиально не может быть. От языков более высокого уровня к ассэмблеру - аналогично. По этому возможно только нечто усредненно-приближенное, дающее ТАКОЙ ЖЕ машинный код. biggrin.gif


--------------------
На "нет" и "нах" :)
Go to the top of the page
 
+Quote Post
bbg
сообщение Apr 11 2005, 09:59
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-06-04
Пользователь №: 179



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


Попросите Ильфака Гуильфанова (автор IDAPro) прикрутить соотв. сигнатуры,
хотя вряд ли он согласится :-).
А однозначно восстановить по асму с на автомате - нету такой тулзы.
Даже если компилилось без оптимизаций..
Go to the top of the page
 
+Quote Post
gcc-user
сообщение Apr 11 2005, 12:06
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 29
Регистрация: 21-09-04
Пользователь №: 691



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


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

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

Более того, существуют програмки (обфускаторами называются), которые из C текстов делают тоже C-текст, но "нечитаемый". Так вот, имеь обфусцированный C-текст почти то же, что и иметь asm-текст. Автоматические преобразователи сгенерят C-текст, в котором разбираться ничуть не легче, чем в asm-е. Так что, только ручками, ручками и головой. Иногда бывает проще написать проект заново, чем разбираться по объектному коду.
Go to the top of the page
 
+Quote Post
M_A
сообщение Apr 11 2005, 12:49
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 27-12-04
Из: г. Иркутск
Пользователь №: 1 689



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

То есть если это усредненно приближенное снова экспортировать в НЕХ и залить в железо, будет работать как первоначальный вариант?
Go to the top of the page
 
+Quote Post
Andrey_Sudnov
сообщение Apr 12 2005, 07:33
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361



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

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

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

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

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

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

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

Я вам советую потренироваться диззасемблировать вручную (в смысле с помощью IDA, но без тех средств, которые вы ищите). Во первых это полезно (поможет вам в дальнейшем при вылавливании тяжелых глюков у ваших программ). Во вторых врядли необходимо полная декомпиляция всего файла. Обычно необходимо найди участок кода, в котором выполняется интересуемое действие, например проверка защиты, или реализован какой-то протокол, хотя в этом случае изучаемый участок будет больше. Очень скоро вы обнаружите, что при хорошей автоматизации и организации, вы очень просто читаете машинные листинги и способны держать в голове назначение и текущее значение нескольких регистров и т.д. Короче это всего лишь дело опыта. А без труда, как известно, не выташишь и рыбку и пруда. И всякие там средства будут вам не нужны.
Go to the top of the page
 
+Quote Post
GeorgyBey
сообщение Apr 12 2005, 09:38
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 21-12-04
Из: Киев
Пользователь №: 1 593



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

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


Именно smile.gif , для того он дизассемблер и создан. Он (диз..ер) СОЗДАЕТ ассемблерный код, который после компиляции будет идентичен исследуемому.
То-есть, "типа сбегает за куском мяса, похожему на перекрученный на фарш", но никак не будет "склеивать" мясо из фарша. tongue.gif


--------------------
На "нет" и "нах" :)
Go to the top of the page
 
+Quote Post
vvs157
сообщение Apr 19 2005, 21:49
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(Sugar @ Mar 11 2005, 15:10)
Вопрос такой, а можно этот asm переконвертировать в c.
ведь распространены всего пару компиляторов:IAR, WinAVR, CodeVision, ImageCraft.

*


Вопрос: для чего? Для анализа алгоритма или для того, чтобы вставить кусок кода в другую С-программу? Если 1-е - то это абсолютно вредное занятие. Вы намного скорее разберетесь в ASM тексте, чем в том, что выдал Вам ASM->C (при условии, что реверсируемый код был писан именно на ASMe). Проверено неоднократно на разных платформах (I51, Z80, MOS6502, 68HC11, IA32) на собственном опыте, много чего приходилось реверсить. Если второе - то можно, но нет смысла, так как в С программу Вы всегда можете вставить ASM кусок.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Apr 20 2005, 08:40
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



К сожалению, а может быть и к счастью, проблема дезассемблирования на сегодня не решена даже теоретически. и уж тем более, если автор не хочет чтобы его код был вскрыт, нет ничего проще, чем определит внутри кода структуру данных, которые могут трактоваться как код, и к тому же, содержать данные, трактуемые, как команды перехода. Вот тут, даже ручками не пройдешь.
Go to the top of the page
 
+Quote Post
bbg
сообщение Apr 20 2005, 08:47
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-06-04
Пользователь №: 179



Цитата(Sergio66 @ Apr 20 2005, 11:40)
нет ничего проще, чем определит внутри кода структуру данных, которые могут трактоваться как код, и к тому же, содержать данные, трактуемые, как команды перехода. Вот тут, даже ручками не пройдешь.
*


Пройдешь-пройдешь, если правильно заточены. Одни мои очень
хорошие знакомые, взяв ящик пива и запустив ИДУ с полезными макросами
как-то за ночь расковыряли Архикад (очень качественная защита)
и вырезали нахрен все обращения к донглу. Сорри, если оффтоп, АВР тут
не при чем..
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th July 2025 - 04:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016