Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/50: Рейтинг темы: голосов - 50, средняя оценка - 4.82
ushor
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 23
1

Код после дизассемблирования..

02.12.2012, 15:46. Просмотров 9309. Ответов 19
Метки нет (Все метки)

Попалась в руки игрушка одна, сделана на AVR, управляет 4-мя моторчиками.
Вытащил из МК прошивку (удивительно, но биты защиты не стояли), дизассемблировал, сижу разбираюсь.. Какие-то куски понятны, но в целом - каша какая-то :(

Вот в начале кода есть такое :
Код
L0000:
rjmp   __stort   ; L002C
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L005B
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
rjmp   L0000
;   -----------   jump on tost line
movw   r24,r4
movw   r24,r4
mulsu   r18,r16
movw   r30,r8
cpc   r4,r12
.word   0x0014   ; pc=0x0018(0x0030)
.word   0x0064   ; pc=0x0019(0x0032)
.word   0x0064   ; pc=0x001A(0x0034)
subi   r20,k34
sbci   r21,k14
sbci   r20,kB3
sbci   r20,kE5
.word   0x0044   ; pc=0x001F(0x003E)
subi   r20,k38
sbci   r21,k14
sbci   r20,kB3
sbci   r20,kE5
.word   0x0044   ; pc=0x0024(0x0048)
.word   0x0009   ; pc=0x0025(0x004A)
.word   0x0060   ; pc=0x0026(0x004C)
.word   0x0036   ; pc=0x0027(0x004E)
.word   0x0009   ; pc=0x0028(0x0050)
muls   r16,r20
.word   0x0040   ; pc=0x002A(0x0054)
nop
Правильно понимаю, что ключевым словом .word тут в память программ записаны константы?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2012, 15:46
Ответы с готовыми решениями:

Программы для дизассемблирования AVR
Интересуют бесплатные или дешёвые программы для дисассемблирования прошивок микроконтроллеров avr.

Как получить строки после дизассемблирования?
При дизассемблировании Delphi в Dede в методе TForm20.Button1Click * Possible String Reference...

Дизассемблирования ill2cpp
Доброго времени суток, возникла такая проблема, жесткий диск полетел, а на нем остались исходники,...

Защита от дизассемблирования
Привет, Какие меры можно предпринять по защите от дизассемблирования программы на c++ ? пишу под...

Программа дизассемблирования
Нам дали такое задание: "симулировать" дизассемблер, то есть пользователь вводит двоичный код, а на...

19
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
02.12.2012, 16:10 2
Какой AVR и какой дизассемблер использовался?
Все, что после последнего rjmp 0000 - это похоже на какие-то константы в памяти flash, либо мусор.
0
ushor
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 23
02.12.2012, 16:39 3
Цитата Сообщение от domis
Какой AVR и какой дизассемблер использовался?
Все, что после последнего rjmp 0000 - это похоже на какие-то константы в памяти flash, либо мусор.
ATMiko8, использовался ReAVR350.
0
MrYurom
0 / 0 / 0
Регистрация: 25.01.2012
Сообщений: 492
02.12.2012, 16:54 4
Может, стартовый адрес неправильный?
Надо раскручивать, начиная с вектора сброса.
0
02.12.2012, 16:54
С_Ч
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 53
02.12.2012, 17:07 5
Вначале это таблица прерываний. Программа начинается с 0x002С.
0
Midvid
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
02.12.2012, 17:10 6
Цитата Сообщение от ushor
Правильно понимаю, что ключевым словом .word тут в память программ записаны константы?
Очень похоже на то. Я думаю, что дизассемблер не обнаружил соответствия между кодами команд AVR и всеми этими .wordами и решил что это это просто некоторые пользовательские константы.
0
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
02.12.2012, 17:13 7
Попробуй avrdasm105.
ReAVR350 и не гуглится даже.
0
С_Ч
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 53
02.12.2012, 17:21 8
Если это код с нулевого адреса, то поставь начало дизассемблирования на адрес первого перехода (0x002С). Возможно, что пустые места в прошивке заполнены какими-то цифирками. Вот у тебя и путается дизассемблер.
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
02.12.2012, 17:23 9
иду попробуйте, она не должна сильно путаться.
0
ushor
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 23
02.12.2012, 17:24 10
Цитата Сообщение от domis
Попробуй avrdasm105.
ReAVR350 и не гуглится даже.
у меня на входе HEX-файл, AVRDASM его превращает в совсем уж непонятную кашу..
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
02.12.2012, 17:24 11
Цитата Сообщение от Midvyd
Цитата Сообщение от ushor
Правильно понимаю, что ключевым словом .word тут в память программ записаны константы?
Очень похоже на то. Я думаю, что дизассемблер не обнаружил соответствия между кодами команд AVR и всеми этими .wordами и решил что это это просто некоторые пользовательские константы.
Так еще часто бывает при срыве слежения за кодом операции. Когда, например, дизассемблер принял константу за команду, или наоборот. Некоторое время идет непонятный мусор, потом все опять нормализуется.

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

Например, часто попадаются неявные переходы (иногда сделанные специально для затруднения дизассемблирования). Когда где - то адрес перехода сохраняется в регистре или переменной, потом совершенно в другом месте - загружается в программный счетчик, а то и пересылается через стек (можно заметить по непарным PUSH и POP или RET без предварительного вызова этого куска).

В общем, листинг программы на ассемблере, и листинг, выдаваемый дизассемблером - редко когда совпадают. Чаще приходится додумывать и расшифровывать самому, снабжая обильными комментариями, пока не забыл...
0
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
02.12.2012, 17:30 12
HEX файл сначала нужно перевести в BIN файл с помощью HEXTOBIN, а потом применять avrdasm.
Если считываешь программатором, то сразу его в BIN и сохрани, если есть такое.
0
ushor
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 23
02.12.2012, 17:55 13
Цитата Сообщение от domis
HEX файл сначала нужно перевести в BIN файл с помощью HEXTOBIN, а потом применять avrdasm.
Если считываешь программатором, то сразу его в BIN и сохрани, если есть такое.
Да, теперь все получилось.

Код
00000000: C02B                rjmp    00000058
00000002: CFFE                rjmp    00000000
00000004: CFFD                rjmp    00000000
00000006: CFFC                rjmp    00000000
00000008: CFFB                rjmp    00000000
0000000A: CFFA                rjmp    00000000
0000000C: C054                rjmp    000000B6
0000000E: CFF8                rjmp    00000000
00000010: CFF7                rjmp    00000000
00000012: CFF6                rjmp    00000000
00000014: CFF5                rjmp    00000000
00000016: CFF4                rjmp    00000000
00000018: CFF3                rjmp    00000000
0000001A: CFF2                rjmp    00000000
0000001C: CFF1                rjmp    00000000
0000001E: CFF0                rjmp    00000000
00000020: CFEF                rjmp    00000000
00000022: CFEE                rjmp    00000000
00000024: CFED                rjmp    00000000
00000026: 01C2                movw    r24,r4
00000028: 01C2                movw    r24,r4
0000002A: 0320                mulsu   r18,r16
0000002C: 01F4                movw    r30,r8
0000002E: 044C                cpc     r4,r12
00000030: 0014                ???
00000032: 0064                ???
00000034: 0064                ???
00000036: 5344                subi    r20,#52
00000038: 4154                sbci    r21,#20
0000003A: 4B43                sbci    r20,#179
0000003C: 4E45                sbci    r20,#229
0000003E: 0044                ???
00000040: 5348                subi    r20,#56
00000042: 4154                sbci    r21,#20
00000044: 4B43                sbci    r20,#179
00000046: 4E45                sbci    r20,#229
00000048: 0044                ???
0000004A: 0009                ???
0000004C: 0060                ???
0000004E: 0036                ???
00000050: 0009                ???
00000052: 028C                muls    r24,r28
00000054: 0040                ???
00000056: 0000                nop
Те места, которые ReAVR определил как константы, здесь идут как ??? - т.е. дизасм не понимает их, так получается..
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
02.12.2012, 18:15 14
А как насчёт выложить файл(ы) может и мы попробуем достать ....
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.12.2012, 18:22 15
Цитата Сообщение от Ymk
иду попробуйте, она не должна сильно путаться.
Дествительно, для дизассемблирования IDA PRO вещь незаменимая. Приложите HEX в ZIP, прогоню через него, приложу листинг.
0
С_Ч
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 53
02.12.2012, 18:26 16
Цитата Сообщение от ushor
Да, теперь все получилось.

Код:
00000000: C02B rjmp 00000058
00000002: CFFE rjmp 00000000
00000004: CFFD rjmp 00000000
00000006: CFFC rjmp 00000000
00000008: CFFB rjmp 00000000
0000000A: CFFA rjmp 00000000
0000000C: C054 rjmp 000000B6
0000000E: CFF8 rjmp 00000000
00000010: CFF7 rjmp 00000000
00000012: CFF6 rjmp 00000000
00000014: CFF5 rjmp 00000000
00000016: CFF4 rjmp 00000000
00000018: CFF3 rjmp 00000000
0000001A: CFF2 rjmp 00000000
0000001C: CFF1 rjmp 00000000
0000001E: CFF0 rjmp 00000000
00000020: CFEF rjmp 00000000
00000022: CFEE rjmp 00000000
00000024: CFED rjmp 00000000
00000026: 01C2 movw r24,r4
00000028: 01C2 movw r24,r4
0000002A: 0320 mulsu r18,r16
0000002C: 01F4 movw r30,r8
0000002E: 044C cpc r4,r12
00000030: 0014 ???
00000032: 0064 ???
00000034: 0064 ???
00000036: 5344 subi r20,#52
00000038: 4154 sbci r21,#20
0000003A: 4B43 sbci r20,#179
0000003C: 4E45 sbci r20,#229
0000003E: 0044 ???
00000040: 5348 subi r20,#56
00000042: 4154 sbci r21,#20
00000044: 4B43 sbci r20,#179
00000046: 4E45 sbci r20,#229
00000048: 0044 ???
0000004A: 0009 ???
0000004C: 0060 ???
0000004E: 0036 ???
00000050: 0009 ???
00000052: 028C muls r24,r28
00000054: 0040 ???
00000056: 0000 nop

Те места, которые ReAVR определил как константы, здесь идут как ??? - т.е. дизасм не понимает их, так получается..
Пока что я не вижу что получилсь. У тебя по стартовому адресу переход на 0x58. Значит у тебя программа начинается с 0x58. Вот оттуда и начинай дизассемблировать. Далее по адресу 0xB6 у тебя подпрограмма прерывания от таймера. Если ты начнешь дизассемблировать с этого адреса, то ищи конец прерывания по команде reti и ты найдешь подпрограмму прерывания. Но там может быть засада, если выход из подпрограммы в нескольких местах, то будет несколько reti. То что ты привел в кодах, может быть все что угодно, в т.ч. и таблица констант, но это не начало основной программы. Вот так потихоньку и начинай раскручивать. Вообщем нелегкое это дело.
0
ushor
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 23
02.12.2012, 18:44 17
HEX-файл приаттачил..

Спасибо всем за консультации и советы :)

[4.94 Кб]
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.12.2012, 19:14 18
Вот посмотрите вывод дизассемблера IDA PRO 6.1, на мой взляд читается и анализируется легче.

[8.47 Кб]
0
ushor
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 23
02.12.2012, 19:28 19
Цитата Сообщение от omokost
Вот посмотрите вывод дизассемблера IDA PRO 6.1, на мой взляд читается и анализируется легче.
Спасибо! Буду ковырять дальше..
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
02.12.2012, 19:54 20
а анализировать лучше прямо в иде. там и граф видно, а не лапшу... и меткам можно осмысленные имена давать и куча всего еще полезного (можно куски кода даже сворачивать и писать коммент/псевдокод, что они делают, чтобы было видно сам алгоритм).
0
02.12.2012, 19:54
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2012, 19:54

Возможности дизассемблирования .NET приложений
Доброго времени суток! Насколько мне известно, существует такой тип программ как "обфускаторы",...

Как защитить программу от дизассемблирования?
Можете подсказать, как можно реализовать хоть какуб-нибудь более-менее простую защиту от...

Каков результат дизассемблирования и ассемблирования в IDA Pro?
Здравствуй уважаемый Mighty All! Вопрос простой: Если взять какую-нибудь программу без...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.