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

Jak skopiować kod maszynowy z mikrokontrolera ATmega8 za pomocą WinAVR?

Kubbaz 01 Mar 2006 10:17 2923 10
REKLAMA
  • #1 2360848
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Witam

    Mam pytanie dotyczące możliwości "skopiowania" kodu maszynowego z mikrokontrolera. Stosuje najzwyklejszy programator - przewody:D i program WinAVR. Jak łatwo zauważyć, podczas kompilacji czy raczej wgrywania pliku *.hex do procka następuje VERYFIKACJA bajtów - czyli komputer komunikuje sie z mikrokontrolerem i sprawdza jego poprawnośc w działaniu kodu.

    Więc czy nie dało by sie napisać jakiegoś pliku *.bat (jak to jest w przypadku pliku do programowania mikrokontrolera), który "ściągałby" kod z niego i zapysywałna HDD ??

    Tak wygląda plik do wgrywania kody do procka:
    -->aprogramuj.bat:

    REM Plik procedury programowania ATMega8

    avrdude -p m8 -c bsd -e -U flash:w:led.hex



    Pozdrawiam. Kubbaz.
  • REKLAMA
  • #2 2361073
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    Tenk kod maszynowy to właśnie plik hex, dwa bajty to jedna instrukcja. Jeśli chcesz odczytać taki kod z procka, wystarczy odczytać zawartość flasza mikroprocesora i jeśli nie jest zabezpieczony przed odczytem, to otrzymasz w pliku hex (czy bin) właśnie kod maszynowy.

    Pliki bin troche łatwiej "czytać" ;)

    I jeszcze jedno, weryfikacja to nie sprawdzanie poprawności kodu, tylko sprawdzanie poprawności jego kopii we flaszu, można wpisać kompletne bzdury i weryfikacja zostanie zakończona sukcesem, jeśli to co zapisane we flaszu (flash - typ pamięci, przeznaczonej na program procesora) jest identyczne z plikiem wgrywanym
  • REKLAMA
  • REKLAMA
  • #4 2361686
    psiemek
    Poziom 21  
    Posty: 560
    Pomógł: 23
    Ocena: 42
    Jeżeli nie jest zabezpieczony to normalnie bierzesz odczyt flasha i zapisuje ci go do pliku. Jeżeli jest zabezpieczony przez fusebity to teoretycznie się nie da :-)
  • #6 2362575
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Nie trzeba tego robić WinAvr'em. Są inne programy obsługujące programatory, które odczytają program z uC za jednym kliknięciem (o ile program w uC nie został zabezpieczony przed odczytem). Polecam np. Pony Prog lub programator w Bascomie.
  • REKLAMA
  • #8 2363928
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    heh...dzięki za podpowiedź....w sumie mogłem sie domyślić:

    -> avrdude -p m8 -c bsd -e -U flash:w:led.hex - w jak "write" - czyli zapis na mikrokontrolerze,

    -> avrdude -p m8 -c bsd -e -U flash:r:led.hex - r jak "read" - czyli odczyt z mikrokontrolera,

    lecz niestety coś nie działa, a mianowicie:

    napisany przeze mnie kod w C wygląda tak:

    #include <avr/io.h>
    #include <private.h>
    
    short int x,y,i,j;
    
    int main (void) 
    {
             for (;;){  
    	 	for (y=0;y<10;y++)
    			{
    				PB2_ON;
    				delay_ms(100);
    				PB2_OFF;
    				delay_ms(100);
    			}
    	 
    		for (i=0;i<25;i++)
    			{
    				x=x-10;
    				PB1_ON;
    				delay_ms(250+x);
    				PB1_OFF;
    				delay_ms(250+x);
    			}
    		for (j=0;j<25;j++)
    			{
    				x=x+10;
    				PB1_ON;
    				delay_ms(250+x);
    				PB1_OFF;
    				delay_ms(250+x);
    			}}
    return 0;
    }
    


    I wszystko działa cacy.

    Powstały w wyniku kompilacji plik *.hex wygląda tak:

    :1000000012C02BC02AC029C028C027C026C025C0C6
    :1000100024C023C022C021C020C01FC01EC01DC0DC
    :100020001CC01BC01AC011241FBECFE5D4E0DEBF28
    :10003000CDBF10E0A0E6B0E0E2EFF1E002C0059035
    :100040000D92A036B107D9F710E0A0E6B0E001C0EC
    :100050001D92A836B107E1F740C0D2CFDC01CB0139
    :100060000396A11DB11DBC01CD0125E030E040E0AB
    :1000700050E09DD0DA01C90101C001970097E9F76E
    :100080000895CF93DF93009749F0EC0167EE73E09A
    :1000900080E090E0E3DFA8952197C1F7DF91CF9151
    :1000A0000895CF93DF93009739F0EC0187EE93E04A
    :1000B000E8DFA8952197D1F7DF91CF910895CF93ED
    :1000C000DF93009739F0EC018EE190E0EADFA8952C
    :1000D0002197D1F7DF91CF910895CFE5D4E0DEBF2E
    :1000E000CDBF1092670010926600BA9AC29A84E659
    :1000F00090E0C7DFBA9AC29884E690E0C2DF8091B0
    :100100006600909167000196909367008093660067
    :100110000A975CF31092650010926400809162006F
    :10012000909163000A979093630080936200B99A5C
    :10013000C19A86509F4FA5DFB99AC19880916200FD
    :100140009091630086509F4F9CDF80916400909156
    :100150006500019690936500809364004997F4F2DE
    :100160001092610010926000809162009091630093
    :100170000A969093630080936200B99AC19A865060
    :100180009F4F7FDFB99AC198809162009091630080
    :1001900086509F4F76DF80916000909161000196BC
    :1001A00090936100809360004997F4F29ACFA1E2A6
    :1001B0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FE1
    :1001C000FF1FA217B307E407F50720F0A21BB30B2C
    :1001D000E40BF50B661F771F881F991F1A9469F7A8
    :1001E00060957095809590959B01AC01BD01CF0104
    :0201F000089570
    :00000001FF


    Wszystkie utworzone pliki podczas kompilacji usuwam z folderu (łącznie z plikiem *.hex) i ...

    Teraz więc próbuje zrobić zrzut kodu z mikrokontrolera za pomocą pliku *.bat i....brak efektu.....plik utworzony (*.hex) jest pusty i kontroler przestaje pracować. Czasami jak kombinowałem nie usuwać dobrego pliku *.hex to plik był nadpisywany lecz tylko ostatnia linijka kodu maszynowego...:| a i to nie zawsze.

    Dodam że wszystko robiłem podczas pracy mikrokontrtolera..czyżby to przez to ?? wydaje mi się, że chyba nie...

    co poradzicie ??
    Moderowany przez Light-I:

    Kod ujęto w tagi [code][/code].

  • #9 2363935
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    Wywał '-e' z komendy odczytującej
  • #10 2365724
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    po wywaleniu '-e' z komendy odczytującej zostało:

    avrdude -p m8 -c bsd -U flash:r:led.hex

    i dalej nic... :/ -> co prawda w porównaniu do poprzedniej próby mikrokontroler nie przestaje wykonywać programu, ale utworzony plik led.hex jest kompletnie pusty.......

    ????

Podsumowanie tematu

✨ Dyskusja dotyczy możliwości odczytu kodu maszynowego (plików *.hex) z mikrokontrolera ATmega8 przy użyciu programatora i narzędzi WinAVR. Wyjaśniono, że kod maszynowy to zawartość pamięci flash mikrokontrolera, którą można odczytać, o ile nie jest zabezpieczona fusebitami przed odczytem. Weryfikacja podczas programowania polega na porównaniu zapisanego kodu z plikiem źródłowym, a nie na sprawdzaniu poprawności działania programu. Do odczytu flasha można użyć narzędzia avrdude z odpowiednią komendą, np. `avrdude -p m8 -c bsd -U flash:r:plik.hex`. Zalecano usunięcie opcji `-e` podczas odczytu, ponieważ kasuje ona pamięć. Alternatywnie wskazano programy takie jak Pony Prog lub Bascom, które oferują prostszy interfejs do odczytu pamięci mikrokontrolera. Po testach potwierdzono, że odczyt kodu z mikrokontrolera ATmega8 działa poprawnie, jeśli nie jest on zabezpieczony przed odczytem.
Wygenerowane przez model językowy.
REKLAMA