Итак есть простая программа написанная в Arduino IDE плата Yun, камень atmega32u4 , она посылает на хардварный и софтварный UART данные. IDE её компилирует и складывает с hex файлом загрузчика (bootloader)
И вот решил я все это поизучать да заодно, с radare побаловаться на том что понимаю(ну хоть немного).
Смотрим что нам надизассемблировал radare скармливаем ему
r2 -a avr full.hex
и получаем что то непонятное
| 0x00000004 3030 cpi r19, 0x00
| 0x00000006 3030 cpi r19, 0x00
| 0x00000008 3030 cpi r19, 0x00
| 0x0000000a 4339 cpi r20, 0x93
| 0x0000000c 3439 cpi r19, 0x94
| 0x0000000e 3830 cpi r19, 0x08
т.е. явно не похоже на лажу, т.к. если посмотреть то же через objdump
avr-objdump -m avr -D full.hex
1d0: 8b e6 ldi r24, 0x6B ; 107
1d2: 80 93 e8 00 sts 0x00E8, r24
1d6: f9 cf rjmp .-14 ; 0x1ca
1d8: 80 91 5c 01 lds r24, 0x015C
1dc: 81 11 cpse r24, r1
1de: 0d c0 rjmp .+26 ; 0x1fa
1e0: 82 e0 ldi r24, 0x02 ; 2
1e2: 80 93 58 01 sts 0x0158, r24
1e6: 84 e0 ldi r24, 0x04 ; 4
1e8: 80 93 59 01 sts 0x0159, r24
1ec: 10 92 5b 01 sts 0x015B, r1
1f0: 10 92 5a 01 sts 0x015A, r1
И что самое забавное если менять битность вручную (r2 -a avr -b 8)дизассемблирование не меняется. При компиляции программы arduino IDE б от неё можно получить elf файл(программы без бутлоадера)
И там можно встретить такие прекрасные строки
||||||| 0x000000ac 080b sbc r16, r24
||||||| 0x000000ae 0002 muls r16, r16
||||||| 0x000000b0 0202 muls r16, r18
||||||| 0x000000b2 0100 invalid
Как может быть invalid , avr уже вдоль и поперек изучен.
архив c hex программы и hex программа + bootloader
Вопрос 1 : С какой версиии radare сломался? Пробовал git, 1.0 , 0.96. Находил пример в сети с реверсом avr.
Вопрос 2 : Как правильно писать скрипты постобработки дизассемблера. Т.е. знаю что такой то адрес это обращение к PORTB или UDRH и хочу заменить в выводе 0x1a на его имя.