Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

U sklopu sastanka 0x0A DC7831 DEF CON Nižnji Novgorod 16. veljače predstavili smo reportažu o osnovnim principima emulacije binarnog koda i vlastiti razvoj - emulator hardverske platforme Kopiraj.

U ovom ćemo članku opisati kako pokrenuti firmware uređaja u emulatoru, demonstrirati interakciju s debuggerom i izvesti kratku dinamičku analizu firmwarea.

prapovijest

Davno u dalekoj galaksiji

Prije nekoliko godina u našem laboratoriju pojavila se potreba za istraživanjem firmware-a uređaja. Firmware je komprimiran i raspakiran bootloaderom. Učinio je to na vrlo kompliciran način, prebacujući podatke u memoriji nekoliko puta. I sam firmware tada je aktivno komunicirao s perifernim uređajima. I sve to na MIPS jezgri.

Iz objektivnih razloga nam dostupni emulatori nisu odgovarali, ali smo ipak htjeli pokrenuti kod. Zatim smo odlučili napraviti vlastiti emulator, koji bi učinio minimum i omogućio nam da raspakiramo glavni firmware. Probali smo i uspjelo je. Pomislili smo, što ako dodamo periferne uređaje za izvođenje glavnog firmvera. Nije jako boljelo - i uspjelo je. Ponovno smo razmislili i odlučili napraviti potpuni emulator.

Rezultat je bio emulator računalnih sustava Kopiraj.

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

Postoji igra riječi.

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

Kopiraj

Prilikom izrade emulatora postavljeni su vrlo specifični ciljevi:

  • mogućnost brzog stvaranja novih perifernih uređaja, modula, procesorskih jezgri;
  • mogućnost sastavljanja virtualnog uređaja iz različitih modula;
  • mogućnost učitavanja bilo kojih binarnih podataka (firmware) u memoriju virtualnog uređaja;
  • sposobnost rada sa snapshotovima (snimkama stanja sustava);
  • mogućnost interakcije s emulatorom putem ugrađenog programa za ispravljanje pogrešaka;
  • lijep moderan jezik za razvoj.

Kao rezultat toga, Kotlin je odabran za implementaciju, arhitekturu sabirnice (ovo je kada moduli međusobno komuniciraju putem virtualnih sabirnica podataka), JSON kao format opisa uređaja i GDB RSP kao protokol za interakciju s debuggerom.

Razvoj traje nešto više od dvije godine i aktivno traje. Tijekom tog vremena implementirane su procesorske jezgre MIPS, x86, V850ES, ARM i PowerPC.

Projekt 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 one najnestrpljivije, promo verziju emulatora možete preuzeti s link.

Rhino u emulatoru

Podsjetimo, ranije je za konferenciju SMARTRHINO-2018 stvoren testni uređaj "Rhinoceros" 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 firmware u emulatoru.

Trebat ćemo:
1) Java 1.8
2) Python i modul jep koristiti Python unutar emulatora. Možete izgraditi WHL modul Jep za Windows preuzmite ovdje.

Za Windows:
1) com0com
2) kit

Za Linux:
1) socat

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

Kako se to radi?

Da bi se izvršio firmware u emulatoru, potrebno je “sastaviti” virtualni uređaj, koji je analog stvarnog uređaja.

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

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Emulator ima modularnu strukturu, a konačni virtualni uređaj može se opisati u JSON datoteci.

JSON 105 redaka

{
  "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 odjeljak parametarima je naziv datoteke koja se može učitati u virtualni uređaj kao firmware.

Virtualni uređaj i njegova interakcija s glavnim operativnim sustavom mogu se prikazati sljedećim dijagramom:

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Trenutačna testna instanca emulatora uključuje interakciju s COM priključcima glavnog OS-a (debug UART i UART za Bluetooth modul). To mogu biti stvarni priključci na koje su uređaji spojeni ili virtualni COM priključci (za ovo trebate samo com0com/socat).

Trenutno postoje dva glavna načina interakcije s emulatorom izvana:

  • GDB RSP protokol (sukladno tome, alati koji podržavaju ovaj protokol su Eclipse / IDA / radare2);
  • interni naredbeni redak emulatora (Argparse ili Python).

Virtualni COM portovi

Kako biste komunicirali s UART-om virtualnog uređaja na lokalnom računalu putem terminala, morate stvoriti par povezanih virtualnih COM portova. U našem slučaju, jedan port koristi emulator, a drugi terminalski program (PuTTY ili screen):

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Korištenje com0com

Virtualni COM priključci konfiguriraju se pomoću uslužnog programa za postavljanje iz kompleta com0com (konzolna verzija - C:Programske datoteke (x86)com0comsetups.exe, ili GUI verzija - C:Programske datoteke (x86)com0comsetupg.exe):

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Označite kućice omogućiti prekoračenje međuspremnika za sve stvorene virtualne portove, inače će emulator čekati odgovor od COM porta.

Korištenje socat

Na UNIX sustavima virtualne COM portove automatski stvara emulator pomoću uslužnog programa socat; da biste to učinili, samo navedite prefiks u nazivu porta prilikom pokretanja emulatora socat:.

Interno sučelje naredbenog retka (Argparse ili Python)

Budući da je Kopycat konzolna aplikacija, emulator nudi dvije opcije sučelja naredbenog retka 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 s Pythonom (koristit će se Python interpreter instaliran na glavnom sustavu korisnika).

Instaliranje Python modula Jep

Pod Linuxom Jep se može instalirati putem pipa:

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 Jepa, morate pokrenuti na naredbenom retku:

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 paketnoj datoteci emulatora za vaš sustav (kopija.šišmiš - za Windows, kopija - za Linux) na popis parametara DEFAULT_JVM_OPTS dodajte dodatni parametar Djava.library.path — mora sadržavati put do instaliranog Jep modula.

Rezultat za Windows trebao bi biti ovakav redak:

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 provodi putem skripte naredbenog retka operativnog sustava (sh/cmd).

Naredba za pokretanje pod Windowsima:

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 uslužnog programa socat:

./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 poslužitelju;
  • -n rhino — naziv glavnog modula sustava (sastavljeni uređaj);
  • -l user — naziv knjižnice za traženje glavnog modula;
  • -y library — put za traženje modula uključenih u uređaj;
  • firmwarerhino_pass.bin — put do datoteke firmvera;
  • COM26 i COM28 su virtualni COM portovi.

Kao rezultat toga, prikazat će se upit 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 s IDA Pro

Kako bismo pojednostavili testiranje, koristimo firmware Rhino kao izvornu datoteku za analizu u IDA-i u obliku ELF datoteka (tamo su pohranjene meta informacije).

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

Nakon pokretanja Kopycata u IDA Pro, u izborniku Debugger idite na stavku "Promijeni program za otklanjanje pogrešaka..."I biraj"Udaljeni GDB program za ispravljanje pogrešaka". Zatim postavite vezu: izbornik Debugger - Opcije procesa…

Postavite vrijednosti:

  • Primjena - bilo koja vrijednost
  • Naziv glavnog računala: 127.0.0.1 (ili IP adresa udaljenog stroja na kojem je pokrenut Kopycat)
  • Luka: 23946

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Gumb za otklanjanje pogrešaka sada postaje dostupan (tipka F9):

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Pritisnite ga za povezivanje s modulom za ispravljanje pogrešaka u emulatoru. IDA prelazi u način otklanjanja pogrešaka, postaju dostupni dodatni prozori: informacije o registrima, o stogu.

Sada možemo koristiti sve standardne značajke programa za ispravljanje pogrešaka:

  • izvođenje uputa korak po korak (Zakoračiti u и Prijeđi preko — tipke F7 i F8);
  • pokretanje i pauziranje izvršenja;
  • stvaranje prijelomnih točaka za kod i podatke (tipka F2).

Povezivanje s programom za ispravljanje pogrešaka ne znači pokretanje koda firmvera. Trenutna pozicija izvršenja mora biti adresa 0x08006A74 — početak rada Reset_Handler. Ako se pomaknete niz popis, možete vidjeti poziv funkcije glavni. Možete postaviti kursor na ovu liniju (adresa 0x08006ABE) i izvršite operaciju Trčanje do kursora (tipka F4).

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Zatim možete pritisnuti F7 za ulazak u funkciju glavni.

Ako pokrenete naredbu Nastavi proces (tipka F9), zatim će se pojaviti prozor "Molimo pričekajte" s jednim gumbom Obustaviti:

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Kada pritisnete Obustaviti izvršenje firmware koda je obustavljeno i može se nastaviti s iste adrese u kodu na kojoj je prekinuto.

Ako nastavite s izvršavanjem koda, vidjet ćete sljedeće retke u terminalima spojenim na virtualne COM portove:

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Prisutnost linije "state bypass" označava da se virtualni Bluetooth modul prebacio na način primanja podataka s korisničkog COM priključka.

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

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Ugledaj se na mene ne u potpunosti

Prilikom izrade emulatora možete odabrati razinu detalja/emulacije određenog uređaja. Na primjer, Bluetooth modul može se emulirati na različite načine:

  • uređaj je u potpunosti emuliran s punim skupom naredbi;
  • AT naredbe se emuliraju, a tok podataka prima se iz COM porta glavnog sustava;
  • virtualni uređaj omogućuje potpuno preusmjeravanje podataka na pravi uređaj;
  • kao jednostavan završetak koji uvijek vraća "OK".

Trenutna verzija emulatora koristi drugi pristup - virtualni Bluetooth modul obavlja konfiguraciju, nakon čega se prebacuje u način rada "proxy" podataka s COM porta glavnog sustava na UART port emulatora.

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Razmotrimo mogućnost jednostavne instrumentacije koda u slučaju da neki dio periferije nije implementiran. Na primjer, ako mjerač vremena odgovoran za kontrolu prijenosa podataka u DMA nije kreiran (provjera se vrši u funkciji ws2812b_čekajnalazi se na 0x08006840), tada će firmware uvijek čekati da se zastavica poništi zauzetnalazi se na 0x200004C4koji pokazuje popunjenost DMA podatkovne linije:

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Ovu situaciju možemo riješiti ručnim poništavanjem zastavice zauzet odmah nakon instaliranja. U IDA Pro, možete stvoriti Python funkciju i pozvati je u prijelomnoj točki, a samu prijelomnu točku staviti u kod nakon što upišete vrijednost 1 u oznaku zauzet.

Rukovatelj prijelomnom točkom

Prvo, kreirajmo Python funkciju u IDA-i. Jelovnik Datoteka - naredba skripte...

Dodajte novi isječak na popis s lijeve strane, dajte mu naziv (na primjer, BPT),
U tekstualno polje s 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 firmware u Kopycat emulatoru

Nakon toga pritisnemo trčanje i zatvorite prozor skripte.

Sada idemo na kod na 0x0800688A, postavite prijelomnu točku (tipka F2), uredite je (kontekstni izbornik Uredi prijelomnu točku...), ne zaboravite postaviti vrstu skripte na Python:

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

Ako trenutna vrijednost zastavice zauzet jednako 1, tada biste trebali izvršiti funkciju preskoči_dma u retku skripte:

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Ako pokrenete firmver za izvođenje, možete vidjeti aktiviranje koda rukovatelja prijelomnom točkom u IDA prozoru Izlaz po redu Skipping wait ws2812.... Sada firmware neće čekati da se zastavica resetira zauzet.

Interakcija s emulatorom

Oponašanje radi oponašanja vjerojatno neće izazvati oduševljenje i radost. Puno je zanimljivije ako emulator pomaže istraživaču vidjeti podatke u memoriji ili uspostaviti interakciju niti.

Pokazat ćemo vam kako dinamički uspostaviti interakciju između RTOS zadataka. Prvo biste trebali pauzirati izvršavanje koda ako se izvodi. Ako idete na funkciju bluetooth_unos_zadatka u granu obrade naredbe “LED” (adresa 0x080057B8), tada možete vidjeti što je prvo kreirano, a zatim poslano u red čekanja sustava ledControlQueueHandle neku poruku.

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

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

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Kao rezultat toga, 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 poziva funkcije osMailGet), koja pripada funkciji led_unos_zadataka (LED-zadatak), odnosno zadaci su se zamijenili i sada je LED-zadatak dobio kontrolu.

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

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

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

ovdje Možete pogledati kratki video pokretanja emulatora i interakcije s IDA Pro.

Pokreni s Radare2

Ne možete zanemariti takav univerzalni alat kao Radare2.

Za spajanje na emulator koristeći r2, naredba bi izgledala ovako:

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

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

Nažalost, trenutno r2 ima problema pri radu s hardverskim gdb poslužiteljem i rasporedom memorije; zbog toga prijelomne točke i koraci ne rade (naredba ds). Nadamo se da će se to uskoro popraviti.

Trčanje uz Eclipse

Jedna od opcija za korištenje emulatora je debugiranje firmvera uređaja koji se razvija. Radi jasnoće, također ćemo koristiti Rhino firmware. Možete preuzeti izvore firmvera stoga.

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

Kako bi emulator mogao učitati firmware izravno kompiliran u Eclipse, trebate 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 pogrešaka

U Eclipse odaberite izbornik Pokreni - Debug Configurations... U prozoru koji se otvori, u odjeljku GDB Hardware Debugging trebate dodati novu konfiguraciju, a zatim na kartici "Glavno" navedite trenutni projekt i aplikaciju za otklanjanje pogrešaka:

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Na kartici "Debugger" trebate navesti GDB naredbu:
${openstm32_compiler_path}arm-none-eabi-gdb

Također unesite parametre za povezivanje s GDB poslužiteljem (host i port):

Nosorog unutar mačke - pokrenite firmware 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čitaj simbole;
  • dodaj naredbu za pokretanje: set $pc = *0x08000004 (postavite PC registar na vrijednost iz memorije na adresi 0x08000004 - adresa je tamo pohranjena ResetHandler).

Imajte na umu, ako ne želite preuzeti datoteku firmvera s Eclipsea, zatim opcije Učitaj sliku и Pokretanje naredbi nije potrebno naznačiti.

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Nakon što kliknete Debug, možete raditi u načinu rada za ispravljanje pogrešaka:

  • korak po korak izvršavanje koda
    Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru
  • u interakciji s prijelomnim točkama
    Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Primijetiti. Eclipse ima, hmm... neke mane... i morate živjeti s njima. Na primjer, ako se prilikom pokretanja programa za ispravljanje pogrešaka pojavi poruka "Nema dostupnog izvora za "0x0″", tada izvršite naredbu Step (F5)

Nosorog unutar mačke - pokrenite firmware u Kopycat emulatoru

Umjesto zaključka

Emulacija izvornog koda vrlo je zanimljiva stvar. Programeru uređaja postaje moguće otkloniti pogreške u firmveru bez pravog uređaja. Za istraživača je to prilika za provođenje dinamičke analize koda, što nije uvijek moguće čak ni s uređajem.

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

U komentarima napišite svoje iskustvo korištenja hardverskih emulatora. Pozivamo vas na raspravu i rado ćemo odgovoriti na pitanja.

U anketi mogu sudjelovati samo registrirani korisnici. Prijaviti se, molim.

Za što koristiš emulator?

  • Razvijam (ispravljam) firmware

  • Istražujem firmware

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

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

Glasovalo je 7 korisnika. Suzdržana su bila 2 korisnika.

Koji softver koristite za emulaciju izvornog koda?

  • QEMU

  • Jednorog motor

  • Protej

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

Glasovalo je 6 korisnika. Suzdržana su bila 2 korisnika.

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

  • Želim brzinu

  • Želim jednostavno postavljanje/pokretanje

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

  • Zadovoljan sam sa svime

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

Glasovalo je 8 korisnika. 1 korisnik je bio suzdržan.

Izvor: www.habr.com

Dodajte komentar