logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konwersja plików HEX do Asemblera AVR za pomocą AVR Studio 4

Terminator85 11 Lut 2012 15:40 3633 6
REKLAMA
  • #1 10529147
    Terminator85
    Poziom 10  
    Dzień Dobry!

    Chciałbym przedstawić prosty sposób przetłumaczenia plików Hex dla mikrokontrolerów AVR na język asemblera w AVR Studio 4. Wskazówki zostały przedstawione w dołączonym pliku pdf poniżej. Jest to artykuł przeze mnie opracowany i mam nadzieję, że wielu osobom szukającym takiego rozwiązania pomoże.

    Pozdrawiam wszyskich:)
  • REKLAMA
  • #2 10530500
    INTOUCH
    Poziom 30  
    Świetnie, tylko skąd wiadomo, że dany HEX jest skompilowany pod właściwy AVR?
  • REKLAMA
  • #3 10531140
    Terminator85
    Poziom 10  
    Dobre pytanie, niestety jest tu potrzebna znajomość konkretnego modelu mikrokontrolera AVR, dla którego został wygenerowny plik HEX podczas kompilacji. Są jednak sytuacje, w których udaje się odczytać z mikrokontrolera zawartość wgranego kodu do pliku HEX, nawet gdy jest on zabezpieczony, a tym samym znamy wtedy jego model. Zdarzają się czasami też sytuacje, że posiadamy schemat jakiegoś układu z konkretnym mikrokontrolerem AVR z dołączonym tylko plikiem HEX i instrukcją jego wgrania, jednak chcielibyśmy również posiadać do niego napisany kod. Niestety, wtedy pozostają nam tylko dwie wiadome informacje, a mianowicie model użytego mikrokontrolera w układzie oraz plik Hex dostarczony dla niego. Takim sytuacjom służy między innymi opisany przeze mnie sposób konwertowania z HEX do Asemblera. Podane wyżej przykłady sytuacji, w których można użyć omówiony sposób, niestety nie należą do najgrzeczniejszych i kulturalnych, tak więc nie należy z nich korzystać z powodu łamania praw autorskich, mając to na uwadze i w świadomości.
  • #4 10531341
    INTOUCH
    Poziom 30  
    Jeśli mikrokontroler zabezpieczony jest przed odczytem to same głupoty odczytasz.
  • REKLAMA
  • #5 10531646
    kamyczek
    Poziom 38  
    INTOUCH napisał:
    Jeśli mikrokontroler zabezpieczony jest przed odczytem to same głupoty odczytasz.


    Konwencjonalny programator nie odczyta zawartości to fakt, jednak istnieją metody odczytania zawartości takiego mikrokontrolera . Tak czy inaczej jest to dobra metoda analizy i poprawiania programów napisanych w językach wysokiego poziomu . Można też w taki sposób uczyć się asemblera ...
  • REKLAMA
  • #6 10561425
    elektrofil
    Poziom 17  
    Witam.
    ok, mam zdeassemblowany kawałek kodu w avr-studio.
    Akurat, że studio to potrafi ja wiedziałem wcześniej, teraz mam pytanie: a jak ten kod poprawić?

    nie prościej pracować na czymś takim?
    
    
             .cseg
             .org	0
    
    avr0000:  rjmp   avr0013      ; 0000 C012              0000   '................'
              rjmp   avr0019      ; 0001 C017              0002   '................'
              rjmp   avr0019      ; 0002 C016              0004   '................'
              rjmp   avr0019      ; 0003 C015              0006   '................'
              rjmp   avr0019      ; 0004 C014              0008   '................'
              rjmp   avr0019      ; 0005 C013              000A   '................'
              rjmp   avr0019      ; 0006 C012              000C   '................'
              rjmp   avr0019      ; 0007 C011              000E   '................'
              rjmp   avr0019      ; 0008 C010              0010   '................'
              rjmp   avr0019      ; 0009 C00F              0012   '................'
              rjmp   avr0019      ; 000A C00E              0014   '................'
              rjmp   avr0019      ; 000B C00D              0016   '................'
              rjmp   avr0019      ; 000C C00C              0018   '...............$'
              rjmp   avr0019      ; 000D C00B              001A   '.............$..'
              rjmp   avr0019      ; 000E C00A              001C   '...........$....'
              rjmp   avr0019      ; 000F C009              001E   '.........$......'
              rjmp   avr0019      ; 0010 C008              0020   '.......$........'
              rjmp   avr0019      ; 0011 C007              0022   '.....$..........'
              rjmp   avr0019      ; 0012 C006              0024   '...$............'
    avr0013:  clr    r1           ; 0013 2411              0026   '.$..............'
              out    SREG, r1     ; 0014 BE1F              0028   '................'
              ldi    YL, 0xDF     ; 0015 EDCF              002A   '................'
              out    SPL, YL      ; 0016 BFCD              002C   '................'
              rcall  avr001A      ; 0017 D002              002E   '................'
              rjmp   avr001D      ; 0018 C004              0030   '................'
    avr0019:  rjmp   avr0000      ; 0019 CFE6              0032   '................'
    avr001A:  ldi    r24, 0x00    ; 001A E080              0034   '................'
              ldi    r25, 0x00    ; 001B E090              0036   '................'
              ret                 ; 001C 9508              0038   '................'
    avr001D:  cli                 ; 001D 94F8              003A   '................'
    avr001E:  rjmp   avr001E            ; 001E CFFF              003C   '................'
                                                           
             .exit                                         
                                                           
    


    Może szału nie ma, część nazw rejestrów trzeba poprawiać lecz można na takim kodzie coś zdziałać.
    Wczytuje się do avr studio, oczywiście jak ktoś miesza dane i kod będzie lekki chaos.

    Podam jeszcze drugą metodę, do której potrzebne jest tylko AVR-STUDIO

    są to tylko DWA polecenia w CMD (wiersz poleceń)

    avr-objcopy -I ihex -O elf32-avr "led.hex" "program.elf"

    a następnie:
    avr-objdump -D "program.elf" > "zrodlo.txt"

    efekt tego zabiegu jest następujący:
    
    program.elf:     file format elf32-avr
    
    
    Disassembly of section .sec1:
    
    00000000 <.sec1>:
       0:	12 c0       	rjmp	.+36     	;  0x26
       2:	17 c0       	rjmp	.+46     	;  0x32
       4:	16 c0       	rjmp	.+44     	;  0x32
       6:	15 c0       	rjmp	.+42     	;  0x32
       8:	14 c0       	rjmp	.+40     	;  0x32
       a:	13 c0       	rjmp	.+38     	;  0x32
       c:	12 c0       	rjmp	.+36     	;  0x32
       e:	11 c0       	rjmp	.+34     	;  0x32
      10:	10 c0       	rjmp	.+32     	;  0x32
      12:	0f c0       	rjmp	.+30     	;  0x32
      14:	0e c0       	rjmp	.+28     	;  0x32
      16:	0d c0       	rjmp	.+26     	;  0x32
      18:	0c c0       	rjmp	.+24     	;  0x32
      1a:	0b c0       	rjmp	.+22     	;  0x32
      1c:	0a c0       	rjmp	.+20     	;  0x32
      1e:	09 c0       	rjmp	.+18     	;  0x32
      20:	08 c0       	rjmp	.+16     	;  0x32
      22:	07 c0       	rjmp	.+14     	;  0x32
      24:	06 c0       	rjmp	.+12     	;  0x32
      26:	11 24       	eor	r1, r1
      28:	1f be       	out	0x3f, r1	; 63
      2a:	cf ed       	ldi	r28, 0xDF	; 223
      2c:	cd bf       	out	0x3d, r28	; 61
      2e:	02 d0       	rcall	.+4      	;  0x34
      30:	04 c0       	rjmp	.+8      	;  0x3a
      32:	e6 cf       	rjmp	.-52     	;  0x0
      34:	80 e0       	ldi	r24, 0x00	; 0
      36:	90 e0       	ldi	r25, 0x00	; 0
      38:	08 95       	ret
      3a:	f8 94       	cli
      3c:	ff cf       	rjmp	.-2      	;  0x3c
    

    Ten kod także można edytować (niestety trzeba go przepuścić np. przez arkusz kalkulacyjny aby pozbyć się pierwszych kolumn)jednak trzeba przeliczać skoki.
    Podsumowując: to jest konwersja do asm(pierwsza dobra, druga dla zdesperowanych) , a nie tylko podgląd w deassembler'ze.
    Pozdrawiam i życzę udanych deasemblacji.
  • #7 11147142
    Terminator85
    Poziom 10  
    Dziękuję za udzielone sugestie oraz porady. Mam nadzieję, że się one komuś przydadzą. Pozdrawiam wszystkich serdecznie:)
REKLAMA