Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Kao dio sastanka 0x0A DC7831 DEF CON Nižnji Novgorod 16. februara predstavili smo izvještaj o osnovnim principima emulacije binarnog koda i vlastitom razvoju - emulatoru hardverske platforme Copycat.

U ovom članku ćemo opisati kako pokrenuti firmver uređaja u emulatoru, demonstrirati interakciju s programom za otklanjanje pogrešaka i izvesti kratku dinamičku analizu firmvera.

prapovijest

Davno u dalekoj galaksiji

Prije nekoliko godina u našoj laboratoriji se pojavila potreba da se ispita firmver uređaja. Firmver je komprimiran i raspakiran pomoću bootloadera. On je to uradio na veoma komplikovan način, pomerajući podatke u memoriji nekoliko puta. I sam firmver je tada aktivno stupio u interakciju s perifernim uređajima. I sve to na MIPS jezgru.

Iz objektivnih razloga, dostupni emulatori nam nisu odgovarali, ali smo ipak htjeli pokrenuti kod. Tada smo odlučili da napravimo sopstveni emulator, koji bi uradio minimum i omogućio nam da raspakujemo glavni firmver. Probali smo i uspjelo je. Pomislili smo, šta ako dodamo periferne uređaje da bi se izvršio i glavni firmver. Nije mnogo boljelo - a i uspjelo je. Ponovo smo razmislili i odlučili napraviti punopravni emulator.

Rezultat je bio emulator kompjuterskih sistema Copycat.

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru
Zašto Kopycat?

Postoji igra riječi.

  1. copycat (engleski, imenica [ˈkɒpɪkæt]) - imitator, imitator
  2. mačka (engleski, imenica [ˈkæt]) - mačka, mačka - omiljena životinja jednog od kreatora projekta
  3. Slovo “K” je iz programskog jezika Kotlin

Copycat

Prilikom kreiranja emulatora postavljeni su vrlo konkretni ciljevi:

  • mogućnost brzog kreiranja novih perifernih uređaja, modula, procesorskih jezgara;
  • mogućnost sastavljanja virtuelnog uređaja iz različitih modula;
  • mogućnost učitavanja bilo kojih binarnih podataka (firmvera) u memoriju virtuelnog uređaja;
  • mogućnost rada sa snimcima (snimci stanja sistema);
  • mogućnost interakcije s emulatorom putem ugrađenog debuggera;
  • lijep moderan jezik za razvoj.

Kao rezultat toga, Kotlin je izabran za implementaciju, arhitektura magistrale (ovo je kada moduli komuniciraju jedni s drugima preko virtuelnih sabirnica podataka), JSON kao format opisa uređaja i GDB RSP kao protokol za interakciju sa debagerom.

Razvoj traje nešto više od dvije godine i aktivno je u toku. Tokom ovog vremena implementirana su procesorska jezgra MIPS, x86, V850ES, ARM i PowerPC.

Projekat raste i vrijeme je da ga predstavimo široj javnosti. Kasnije ćemo napraviti detaljan opis projekta, ali za sada ćemo se fokusirati na korištenje Kopycata.

Za najnestrpljivije se može preuzeti promo verzija emulatora link.

Rhino u emulatoru

Podsjetimo, ranije je za konferenciju SMARTRHINO-2018 kreiran testni uređaj „Nosorog“ za podučavanje vještina obrnutog inženjeringa. Proces statičke analize firmvera opisan je u ovaj članak.

Sada pokušajmo dodati "zvučnike" i pokrenuti firmver u emulatoru.

Trebaće nam:
1) Java 1.8
2) Python i modul jep da koristite Python unutar emulatora. Možete napraviti WHL modul Jep za Windows preuzmite ovdje.

Za Windows:
1) com0com
2) MISASTA

Za Linux:
1) socat

Možete koristiti Eclipse, IDA Pro ili radare2 kao GDB klijent.

Как это работает?

Da biste izvršili firmware u emulatoru, potrebno je "sastaviti" virtuelni uređaj, koji je analog stvarnog uređaja.

Pravi uređaj („nosorog“) može se prikazati na blok dijagramu:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Emulator ima modularnu strukturu i konačni virtuelni uređaj se može opisati u JSON datoteci.

JSON 105 redova

{
  "top": true,

  // Plugin name should be the same as file name (or full path from library start)
  "plugin": "rhino",

  // Directory where plugin places
  "library": "user",

  // Plugin parameters (constructor parameters if jar-plugin version)
  "params": [
    { "name": "tty_dbg", "type": "String"},
    { "name": "tty_bt", "type": "String"},
    { "name": "firmware", "type": "String", "default": "NUL"}
  ],

  // Plugin outer ports
  "ports": [  ],

  // Plugin internal buses
  "buses": [
    { "name": "mem", "size": "BUS30" },
    { "name": "nand", "size": "4" },
    { "name": "gpio", "size": "BUS32" }
  ],

  // Plugin internal components
  "modules": [
    {
      "name": "u1_stm32",
      "plugin": "STM32F042",
      "library": "mcu",
      "params": {
        "firmware:String": "params.firmware"
      }
    },
    {
      "name": "usart_debug",
      "plugin": "UartSerialTerminal",
      "library": "terminals",
      "params": {
        "tty": "params.tty_dbg"
      }
    },
    {
      "name": "term_bt",
      "plugin": "UartSerialTerminal",
      "library": "terminals",
      "params": {
        "tty": "params.tty_bt"
      }
    },
    {
      "name": "bluetooth",
      "plugin": "BT",
      "library": "mcu"
    },

    { "name": "led_0",  "plugin": "LED", "library": "mcu" },
    { "name": "led_1",  "plugin": "LED", "library": "mcu" },
    { "name": "led_2",  "plugin": "LED", "library": "mcu" },
    { "name": "led_3",  "plugin": "LED", "library": "mcu" },
    { "name": "led_4",  "plugin": "LED", "library": "mcu" },
    { "name": "led_5",  "plugin": "LED", "library": "mcu" },
    { "name": "led_6",  "plugin": "LED", "library": "mcu" },
    { "name": "led_7",  "plugin": "LED", "library": "mcu" },
    { "name": "led_8",  "plugin": "LED", "library": "mcu" },
    { "name": "led_9",  "plugin": "LED", "library": "mcu" },
    { "name": "led_10", "plugin": "LED", "library": "mcu" },
    { "name": "led_11", "plugin": "LED", "library": "mcu" },
    { "name": "led_12", "plugin": "LED", "library": "mcu" },
    { "name": "led_13", "plugin": "LED", "library": "mcu" },
    { "name": "led_14", "plugin": "LED", "library": "mcu" },
    { "name": "led_15", "plugin": "LED", "library": "mcu" }
  ],

  // Plugin connection between components
  "connections": [
    [ "u1_stm32.ports.usart1_m", "usart_debug.ports.term_s"],
    [ "u1_stm32.ports.usart1_s", "usart_debug.ports.term_m"],

    [ "u1_stm32.ports.usart2_m", "bluetooth.ports.usart_m"],
    [ "u1_stm32.ports.usart2_s", "bluetooth.ports.usart_s"],

    [ "bluetooth.ports.bt_s", "term_bt.ports.term_m"],
    [ "bluetooth.ports.bt_m", "term_bt.ports.term_s"],

    [ "led_0.ports.pin",  "u1_stm32.buses.pin_output_a", "0x00"],
    [ "led_1.ports.pin",  "u1_stm32.buses.pin_output_a", "0x01"],
    [ "led_2.ports.pin",  "u1_stm32.buses.pin_output_a", "0x02"],
    [ "led_3.ports.pin",  "u1_stm32.buses.pin_output_a", "0x03"],
    [ "led_4.ports.pin",  "u1_stm32.buses.pin_output_a", "0x04"],
    [ "led_5.ports.pin",  "u1_stm32.buses.pin_output_a", "0x05"],
    [ "led_6.ports.pin",  "u1_stm32.buses.pin_output_a", "0x06"],
    [ "led_7.ports.pin",  "u1_stm32.buses.pin_output_a", "0x07"],
    [ "led_8.ports.pin",  "u1_stm32.buses.pin_output_a", "0x08"],
    [ "led_9.ports.pin",  "u1_stm32.buses.pin_output_a", "0x09"],
    [ "led_10.ports.pin", "u1_stm32.buses.pin_output_a", "0x0A"],
    [ "led_11.ports.pin", "u1_stm32.buses.pin_output_a", "0x0B"],
    [ "led_12.ports.pin", "u1_stm32.buses.pin_output_a", "0x0C"],
    [ "led_13.ports.pin", "u1_stm32.buses.pin_output_a", "0x0D"],
    [ "led_14.ports.pin", "u1_stm32.buses.pin_output_a", "0x0E"],
    [ "led_15.ports.pin", "u1_stm32.buses.pin_output_a", "0x0F"]
  ]
}

Obratite pažnju na parametar firmware U poglavlju params je naziv datoteke koja se može učitati u virtuelni uređaj kao firmver.

Virtuelni uređaj i njegova interakcija sa glavnim operativnim sistemom mogu se predstaviti sledećim dijagramom:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Trenutna probna instanca emulatora uključuje interakciju sa COM portovima glavnog OS (debug UART i UART za Bluetooth modul). To mogu biti stvarni portovi na koje su povezani uređaji ili virtualni COM portovi (za to vam je samo potrebno com0com/socat).

Trenutno postoje dva glavna načina za interakciju s emulatorom izvana:

  • GDB RSP protokol (prema tome, alati koji podržavaju ovaj protokol su Eclipse / IDA / radare2);
  • interna komandna linija emulatora (Argparse ili Python).

Virtuelni COM portovi

Da biste ostvarili interakciju sa UART-om virtuelnog uređaja na lokalnom računaru preko terminala, potrebno je da kreirate par pridruženih virtuelnih COM portova. U našem slučaju, jedan port koristi emulator, a drugi terminalski program (PuTTY ili screen):

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Korištenje com0com

Virtuelni COM portovi se konfigurišu pomoću uslužnog programa za podešavanje iz kompleta com0com (verzija konzole - C:Programske datoteke (x86)com0comsetups.exe, ili GUI verzija - C:Programske datoteke (x86)com0comsetupg.exe):

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Označite kućice omogući prekoračenje bafera za sve kreirane virtuelne portove, inače će emulator čekati odgovor od COM porta.

Koristeći socat

Na UNIX sistemima, virtuelne COM portove automatski kreira emulator koristeći socat uslužni program; da biste to uradili, samo navedite prefiks u nazivu porta kada pokrećete emulator socat:.

Interni interfejs komandne linije (Argparse ili Python)

Pošto je Kopycat konzolna aplikacija, emulator pruža dvije opcije interfejsa komandne linije za interakciju sa svojim objektima i varijablama: Argparse i Python.

Argparse je CLI ugrađen u Kopycat i uvijek je dostupan svima.

Alternativni CLI je Python interpreter. Da biste ga koristili, morate instalirati Jep Python modul i konfigurirati emulator za rad sa Pythonom (koristit će se Python interpreter instaliran na glavnom sistemu korisnika).

Instaliranje Python modula Jep

Pod Linuxom Jep se može instalirati putem pip-a:

pip install jep

Da biste instalirali Jep na Windows, prvo morate instalirati Windows SDK i odgovarajući Microsoft Visual Studio. Malo smo vam olakšali i WHL gradi JEP za trenutne verzije Pythona za Windows, tako da se modul može instalirati iz datoteke:

pip install jep-3.8.2-cp27-cp27m-win_amd64.whl

Da biste provjerili instalaciju Jep-a, morate pokrenuti na komandnoj liniji:

python -c "import jep"

Kao odgovor treba primiti sljedeću poruku:

ImportError: Jep is not supported in standalone Python, it must be embedded in Java.

U batch fajlu emulatora za vaš sistem (copycat.bat - za Windows, copycat - za Linux) na listu parametara DEFAULT_JVM_OPTS dodajte dodatni parametar Djava.library.path — mora sadržavati putanju do instaliranog Jep modula.

Rezultat za Windows bi trebao biti ovakav:

set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"

Pokretanje Kopycata

Emulator je konzolna JVM aplikacija. Pokretanje se vrši preko skripte komandne linije operativnog sistema (sh/cmd).

Naredba za pokretanje pod Windowsom:

binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28

Naredba za pokretanje pod Linuxom pomoću socat uslužnog programa:

./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28

  • -g 23646 — TCP port koji će biti otvoren za pristup GDB serveru;
  • -n rhino — naziv glavnog modula sistema (sklopljenog uređaja);
  • -l user — naziv biblioteke za traženje glavnog modula;
  • -y library — put za traženje modula uključenih u uređaj;
  • firmwarerhino_pass.bin — putanja do datoteke firmvera;
  • COM26 i COM28 su virtuelni COM portovi.

Kao rezultat, prikazat će se prompt Python > (ili Argparse >):

18:07:59 INFO [eFactoryBuilder.create ]: Module top successfully created as top
18:07:59 INFO [ Module.initializeAndRes]: Setup core to top.u1_stm32.cortexm0.arm for top
18:07:59 INFO [ Module.initializeAndRes]: Setup debugger to top.u1_stm32.dbg for top
18:07:59 WARN [ Module.initializeAndRes]: Tracer wasn't found in top...
18:07:59 INFO [ Module.initializeAndRes]: Initializing ports and buses...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Some ports has warning use printModulesPortsWarnings to see it...
18:07:59 FINE [ ARMv6CPU.reset ]: Set entry point address to 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Module top is successfully initialized and reset as a top cell!
18:07:59 INFO [ Kopycat.open ]: Starting virtualization of board top[rhino] with arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: Set new debugger module top.u1_stm32.dbg for GDB_SERVER(port=23946,alive=true)
Python >

Interakcija sa IDA Pro

Da bismo pojednostavili testiranje, koristimo Rhino firmware kao izvorni fajl za analizu u IDA u obliku ELF fajl (tamo se pohranjuju meta informacije).

Također možete koristiti glavni firmver bez meta informacija.

Nakon pokretanja Kopycata u IDA Pro, u meniju Debugger idite na stavku “Prebaci program za otklanjanje grešaka…"I izaberi"Remote GDB debugger". Zatim podesite vezu: meni Debugger - opcije obrade…

Postavite vrijednosti:

  • Aplikacija - bilo koja vrijednost
  • Ime hosta: 127.0.0.1 (ili IP adresa udaljene mašine na kojoj je pokrenut Kopycat)
  • Luka: 23946

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Sada dugme za otklanjanje grešaka postaje dostupno (taster F9):

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Kliknite na njega da biste se povezali s modulom za otklanjanje grešaka u emulatoru. IDA prelazi u mod za otklanjanje grešaka, postaju dostupni dodatni prozori: informacije o registrima, o steku.

Sada možemo koristiti sve standardne karakteristike debuggera:

  • izvršavanje instrukcija korak po korak (Uđite и Zakorači — tasteri F7 i F8, respektivno);
  • pokretanje i pauziranje izvršenja;
  • kreiranje tačaka prekida i za kod i za podatke (tipka F2).

Povezivanje na debuger ne znači pokretanje koda firmvera. Trenutna pozicija izvršenja mora biti adresa 0x08006A74 — početak funkcije Reset_Handler. Ako skrolujete prema dolje po listi, možete vidjeti poziv funkcije glavni. Možete postaviti kursor na ovu liniju (adresa 0x08006ABE) i izvršite operaciju Pokreni do kursora (taster F4).

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Zatim možete pritisnuti F7 da uđete u funkciju glavni.

Ako pokrenete naredbu Nastavite proces (taster F9), tada će se prozor “Molimo pričekati” pojaviti s jednim dugmetom Suspend:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Kada pritisnete Suspend izvršenje koda firmvera je suspendovano i može se nastaviti sa iste adrese u kodu na kojoj je prekinuto.

Ako nastavite s izvršavanjem koda, vidjet ćete sljedeće linije u terminalima povezanim na virtuelne COM portove:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Prisutnost linije "zaobilaženje stanja" ukazuje na to da je virtuelni Bluetooth modul prešao na način primanja podataka sa COM porta korisnika.

Sada u Bluetooth terminal (COM29 na slici) možete unositi komande u skladu sa Rhino protokolom. Na primjer, naredba “MEOW” će vratiti niz “mur-mur” na Bluetooth terminal:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Ne oponašajte me u potpunosti

Kada pravite emulator, možete odabrati nivo detalja/emulacije određenog uređaja. Na primjer, Bluetooth modul se može emulirati na različite načine:

  • uređaj je u potpunosti emuliran s punim skupom naredbi;
  • AT komande se emuliraju, a tok podataka se prima sa COM porta glavnog sistema;
  • virtuelni uređaj omogućava potpuno preusmjeravanje podataka na pravi uređaj;
  • kao jednostavan stub koji uvijek vraća "OK".

Trenutna verzija emulatora koristi drugi pristup - virtuelni Bluetooth modul vrši konfiguraciju, nakon čega se prebacuje na način "proxying" podataka sa COM porta glavnog sistema na UART port emulatora.

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Razmotrimo mogućnost jednostavne instrumentacije koda u slučaju da neki dio periferije nije implementiran. Na primjer, ako tajmer odgovoran za kontrolu prijenosa podataka u DMA nije kreiran (provjera se vrši u funkciji ws2812b_waitnalazi se na adresi 0x08006840), tada će firmver uvijek čekati da se zastavica resetuje zauzetonalazi se na adresi 0x200004C4koji pokazuje zauzetost DMA linije podataka:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Ovu situaciju možemo zaobići ručnim resetiranjem zastavice zauzeto odmah nakon instaliranja. U IDA Pro, možete kreirati Python funkciju i pozvati je u tački prekida i staviti samu tačku prekida u kod nakon što upišete vrijednost 1 u zastavicu zauzeto.

Rukovalac tačke prekida

Prvo, napravimo Python funkciju u IDA-i. Meni Fajl - komanda skripte...

Dodajte novi isječak na listu s lijeve strane, dajte mu ime (na primjer, CPM),
U tekstualno polje sa desne strane unesite kod funkcije:

def skip_dma():
    print "Skipping wait ws2812..."
    value = Byte(0x200004C4)
    if value == 1:
        PatchDbgByte(0x200004C4, 0)
return False

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Nakon toga pritisnemo trčanje i zatvorite prozor skripte.

Sada idemo na kod na 0x0800688A, postavite tačku prekida (tipka F2), uredite je (kontekstni meni Uredi tačku prekida...), ne zaboravite postaviti tip skripte na Python:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru
Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Ako je trenutna vrijednost zastavice zauzeto jednako 1, tada biste trebali izvršiti funkciju skip_dma u redu skripte:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Ako pokrenete firmver za izvršenje, aktiviranje koda za rukovanje tačkom prekida može se vidjeti u prozoru IDA izlaz po liniji Skipping wait ws2812.... Sada firmver neće čekati da se zastavica resetuje zauzeto.

Interakcija sa emulatorom

Malo je vjerovatno da će emulacija zarad oponašanja izazvati oduševljenje i radost. Mnogo je zanimljivije ako emulator pomaže istraživaču da vidi podatke u memoriji ili uspostavi interakciju niti.

Pokazaćemo vam kako da dinamički uspostavite interakciju između RTOS zadataka. Prvo biste trebali pauzirati izvršenje koda ako je pokrenut. Ako odete na funkciju bluetooth_task_entry u granu za obradu komande “LED” (adresa 0x080057B8), tada možete vidjeti šta se prvo kreira, a zatim šalje u sistemski red ledControlQueueHandle neka poruka.

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Trebali biste postaviti tačku prekida za pristup varijabli ledControlQueueHandlenalazi se na adresi 0x20000624 i nastavite s izvršavanjem koda:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Kao rezultat, zaustavljanje će se prvo dogoditi na adresi 0x080057CA prije pozivanja funkcije osMailAlloc, zatim na adresi 0x08005806 prije pozivanja funkcije osMailPut, pa nakon nekog vremena - na adresu 0x08005BD4 (prije pozivanja funkcije osMailGet), koji pripada funkciji leds_task_entry (LED-zadatak), odnosno zadaci su se prebacili, i sada je LED-zadatak dobio kontrolu.

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Na ovaj jednostavan način možete ustanoviti kako RTOS zadaci međusobno djeluju.

Naravno, u stvarnosti, interakcija zadataka može biti složenija, ali korištenjem emulatora praćenje ove interakcije postaje manje naporno.

ovdje Možete pogledati kratak video pokretanja emulatora i interakcije sa IDA Pro.

Pokreni sa Radare2

Ne možete zanemariti tako univerzalni alat kao što je Radare2.

Za povezivanje s emulatorom pomoću r2, naredba bi izgledala ovako:

radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf

Lansiranje dostupno sada (dc) i pauzirajte izvršenje (Ctrl+C).

Nažalost, trenutno r2 ima problema pri radu sa hardverskim gdb serverom i rasporedom memorije; zbog toga tačke prekida i koraci ne rade (naredba ds). Nadamo se da će to uskoro biti popravljeno.

Trčanje sa Eclipseom

Jedna od opcija za korištenje emulatora je otklanjanje grešaka u firmveru uređaja koji se razvija. Radi jasnoće, koristit ćemo i Rhino firmware. Možete preuzeti izvore firmvera odavde.

Koristićemo Eclipse iz skupa kao IDE System Workbench za STM32.

Da bi emulator učitao firmver direktno kompajliran u Eclipseu, morate dodati parametar firmware=null na naredbu za pokretanje emulatora:

binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28

Postavljanje konfiguracije za otklanjanje grešaka

U Eclipseu izaberite meni Pokreni - otklanjanje grešaka konfiguracija... U prozoru koji se otvori, u odjeljku GDB otklanjanje grešaka u hardveru morate dodati novu konfiguraciju, a zatim na kartici “Main” navesti trenutni projekat i aplikaciju za otklanjanje grešaka:

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Na kartici “Debugger” morate navesti GDB naredbu:
${openstm32_compiler_path}arm-none-eabi-gdb

I također unesite parametre za povezivanje na GDB server (host i port):

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Na kartici "Pokretanje" morate navesti sljedeće parametre:

  • omogući potvrdni okvir Učitaj sliku (tako da se sastavljena slika firmvera učitava u emulator);
  • omogući potvrdni okvir Učitavanje simbola;
  • dodajte naredbu za pokretanje: set $pc = *0x08000004 (podesite PC registar na vrijednost iz memorije na adresi 0x08000004 - adresa je tamo pohranjena ResetHandler).

Obrati pažnju, ako ne želite da preuzmete datoteku firmvera sa Eclipse-a, onda opcije Učitaj sliku и Pokreni komande nema potrebe naznačiti.

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Nakon što kliknete na Otklanjanje grešaka, možete raditi u načinu otklanjanja grešaka:

  • korak po korak izvršavanje koda
    Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru
  • interakcija sa tačkama prekida
    Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

primjedba. Eclipse ima, hmm... neke čudne stvari... i moraš živjeti s njima. Na primjer, ako se prilikom pokretanja debugger-a pojavi poruka “Nema dostupnog izvora za “0x0″”, onda izvršite naredbu korak (F5)

Nosorog unutar mačke - pokrenite firmver u Kopycat emulatoru

Umjesto zaključka

Emulacija izvornog koda je vrlo zanimljiva stvar. Postaje moguće da programer uređaja otkloni greške u firmveru bez pravog uređaja. Za istraživača je to prilika da provede dinamičku analizu koda, što nije uvijek moguće čak ni sa uređajem.

Želimo pružiti stručnjacima alat koji je zgodan, umjereno jednostavan i koji ne zahtijeva puno truda i vremena za postavljanje i pokretanje.

Napišite u komentarima svoje iskustvo korištenja hardverskih emulatora. Pozivamo vas na diskusiju i rado ćemo odgovoriti na pitanja.

Samo registrovani korisnici mogu učestvovati u anketi. Prijavite semolim.

Za šta koristiš emulator?

  • Razvijam (debug) firmver

  • Istražujem firmver

  • Pokrećem igrice (Dendi, Sega, PSP)

  • još nešto (napišite u komentarima)

Glasalo je 7 korisnika. 2 korisnika je bila uzdržana.

Koji softver koristite za emulaciju izvornog koda?

  • QEMU

  • Unicorn motor

  • Proteus

  • još nešto (napišite u komentarima)

Glasalo je 6 korisnika. 2 korisnika je bila uzdržana.

Šta biste željeli poboljšati u emulatoru koji koristite?

  • Želim brzinu

  • Želim jednostavnost podešavanja/pokretanja

  • Želim više opcija za interakciju sa emulatorom (API, kuke)

  • Zadovoljan sam sa svime

  • još nešto (napišite u komentarima)

Glasalo je 8 korisnika. 1 korisnik je bio uzdržan.

izvor: www.habr.com

Dodajte komentar