Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Kot del srečanja 0x0A DC7831 DEF CON Nižni Novgorod 16. februarja smo predstavili poročilo o osnovnih principih emulacije binarne kode in lastnem razvoju - emulatorju strojne platforme. Copycat.

V tem članku bomo opisali, kako zagnati vdelano programsko opremo naprave v emulatorju, prikazati interakcijo z razhroščevalnikom in izvesti majhno dinamično analizo vdelane programske opreme.

prazgodovina

Pred davnimi časi v galaksiji daleč stran

Pred nekaj leti je bilo v našem laboratoriju treba raziskati vdelano programsko opremo naprave. Vdelana programska oprema je bila stisnjena in razpakirana z zagonskim nalagalnikom. To je naredil na zelo zapleten način, pri čemer je podatke v spominu večkrat prestavil. Sama vdelana programska oprema je nato aktivno sodelovala s perifernimi napravami. In vse to na jedru MIPS.

Iz objektivnih razlogov nam razpoložljivi emulatorji niso ustrezali, vendar smo vseeno želeli zagnati kodo. Potem smo se odločili narediti lasten emulator, ki bi naredil najmanj in nam omogočil razpakiranje glavne programske opreme. Poskusili smo in uspelo je. Pomislili smo, kaj če dodamo zunanje naprave, ki bodo izvajale tudi glavno programsko opremo. Ni zelo bolelo - in tudi uspelo je. Ponovno smo razmišljali in se odločili narediti popoln emulator.

Rezultat je bil emulator računalniških sistemov Copycat.

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat
Zakaj Kopycat?

Obstaja igra besed.

  1. posnemaj (angleško, samostalnik [ˈkɒpɪkæt]) - imitator, imitator
  2. mačka (angleško, samostalnik [ˈkæt]) - mačka, mačka - najljubša žival enega od ustvarjalcev projekta
  3. Črka "K" je iz programskega jezika Kotlin

Copycat

Pri ustvarjanju emulatorja so bili postavljeni zelo specifični cilji:

  • možnost hitrega ustvarjanja novih perifernih naprav, modulov, procesorskih jeder;
  • možnost sestavljanja virtualne naprave iz različnih modulov;
  • možnost nalaganja poljubnih binarnih podatkov (firmware) v pomnilnik virtualne naprave;
  • sposobnost dela s posnetki (posnetki stanja sistema);
  • možnost interakcije z emulatorjem prek vgrajenega razhroščevalnika;
  • lep sodoben jezik za razvoj.

Kot rezultat je bil izbran Kotlin za implementacijo, arhitekturo vodila (to je, ko moduli komunicirajo med seboj prek virtualnih podatkovnih vodil), JSON kot format opisa naprave in GDB RSP kot protokol za interakcijo z razhroščevalnikom.

Razvoj poteka že nekaj več kot dve leti in aktivno poteka. V tem času so bila implementirana procesorska jedra MIPS, x86, V850ES, ARM in PowerPC.

Projekt raste in čas je, da ga predstavimo širši javnosti. Podroben opis projekta bomo naredili kasneje, zaenkrat pa se bomo osredotočili na uporabo Kopycata.

Za najbolj nestrpne je na voljo promocijska različica emulatorja povezava.

Rhino v emulatorju

Spomnimo se, da je bila prej za konferenco SMARTRHINO-2018 ustvarjena testna naprava "Rhinoceros" za poučevanje veščin obratnega inženiringa. Postopek statične analize vdelane programske opreme je bil opisan v ta članek.

Zdaj pa poskusimo dodati "zvočnike" in zagnati vdelano programsko opremo v emulatorju.

Potrebovali bomo:
1) Java 1.8
2) Python in modul jep za uporabo Pythona znotraj emulatorja. Izdelate lahko WHL modul Jep za Windows prenesite tukaj.

Za Windows:
1) com0com
2) PuTTY

Za Linux:
1) socat

Kot odjemalca GDB lahko uporabite Eclipse, IDA Pro ali radare2.

Kako deluje?

Za izvedbo vdelane programske opreme v emulatorju je potrebno "sestaviti" virtualno napravo, ki je analog prave naprave.

Pravo napravo ("nosorog") lahko prikažemo v blokovnem diagramu:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Emulator ima modularno strukturo in končno virtualno napravo je mogoče opisati v datoteki JSON.

JSON 105 vrstic

{
  "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"]
  ]
}

Bodite pozorni na parameter firmware oddelek parametri je ime datoteke, ki jo je mogoče naložiti v virtualno napravo kot vdelano programsko opremo.

Navidezna naprava in njena interakcija z glavnim operacijskim sistemom je lahko predstavljena z naslednjim diagramom:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Trenutni testni primerek emulatorja vključuje interakcijo s COM vrati glavnega operacijskega sistema (odpravljanje napak UART in UART za modul Bluetooth). To so lahko resnična vrata, na katera so priključene naprave, ali navidezna vrata COM (za to potrebujete samo com0com/socat).

Trenutno obstajata dva glavna načina za interakcijo z emulatorjem od zunaj:

  • Protokol GDB RSP (v skladu s tem so orodja, ki podpirajo ta protokol, Eclipse / IDA / radare2);
  • notranja ukazna vrstica emulatorja (Argparse ali Python).

Virtualna vrata COM

Če želite komunicirati z UART virtualne naprave na lokalnem računalniku prek terminala, morate ustvariti par povezanih virtualnih vrat COM. V našem primeru ena vrata uporablja emulator, druga pa terminalski program (PuTTY ali zaslon):

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Uporaba com0com

Navidezna vrata COM so konfigurirana s pripomočkom za nastavitev iz kompleta com0com (konzolna različica - C:Programske datoteke (x86)com0comsetupс.exe, ali GUI različica - C:Programske datoteke (x86)com0comsetupg.exe):

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Označite polja omogoči prekoračitev medpomnilnika za vsa ustvarjena virtualna vrata, sicer bo emulator čakal na odgovor iz vrat COM.

Uporaba socat

V sistemih UNIX navidezna vrata COM samodejno ustvari emulator s pripomočkom socat; za to samo določite predpono v imenu vrat, ko zaženete emulator socat:.

Notranji vmesnik ukazne vrstice (Argparse ali Python)

Ker je Kopycat konzolna aplikacija, emulator ponuja dve možnosti vmesnika ukazne vrstice za interakcijo s svojimi objekti in spremenljivkami: Argparse in Python.

Argparse je CLI, vgrajen v Kopycat in je vedno na voljo vsem.

Alternativni CLI je tolmač Python. Če ga želite uporabljati, morate namestiti modul Jep Python in konfigurirati emulator za delo s Pythonom (uporabljen bo tolmač Python, nameščen v uporabnikovem glavnem sistemu).

Namestitev modula Python Jep

Pod Linuxom lahko Jep namestite prek pip:

pip install jep

Če želite namestiti Jep v sistem Windows, morate najprej namestiti Windows SDK in ustrezen Microsoft Visual Studio. Malo smo vam olajšali in WHL gradi JEP za trenutne različice Pythona za Windows, tako da je modul mogoče namestiti iz datoteke:

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

Če želite preveriti namestitev Jep, morate zagnati ukazno vrstico:

python -c "import jep"

V odgovor bi morali prejeti naslednje sporočilo:

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

V paketni datoteki emulatorja za vaš sistem (copycat.bat - za Windows, posnemalec - za Linux) na seznam parametrov DEFAULT_JVM_OPTS dodajte dodaten parameter Djava.library.path — vsebovati mora pot do nameščenega modula Jep.

Rezultat za Windows bi morala biti taka vrstica:

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

Zagon Kopycat

Emulator je konzolna aplikacija JVM. Zagon se izvede s skriptom ukazne vrstice operacijskega sistema (sh/cmd).

Ukaz za zagon v sistemu Windows:

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

Ukaz za zagon pod Linuxom s pripomočkom 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 — vrata TCP, ki bodo odprta za dostop do strežnika GDB;
  • -n rhino — ime glavnega sistemskega modula (sestavljena naprava);
  • -l user — ime knjižnice za iskanje glavnega modula;
  • -y library — pot za iskanje modulov, vključenih v napravo;
  • firmwarerhino_pass.bin — pot do datoteke vdelane programske opreme;
  • COM26 in COM28 sta virtualna vrata COM.

Posledično se prikaže poziv Python > (Ali 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 z IDA Pro

Za poenostavitev testiranja uporabljamo strojno programsko opremo Rhino kot izvorno datoteko za analizo v IDA v obliki datoteka ELF (tam so shranjene meta informacije).

Uporabite lahko tudi glavno vdelano programsko opremo brez meta informacij.

Ko zaženete Kopycat v IDA Pro, v meniju Debugger pojdite na element "Preklopi razhroščevalnik ..." in izberite "Oddaljeni razhroščevalnik GDB". Nato nastavite povezavo: meni Razhroščevalnik – Možnosti procesa…

Nastavite vrednosti:

  • Aplikacija - poljubna vrednost
  • Ime gostitelja: 127.0.0.1 (ali naslov IP oddaljenega računalnika, kjer se izvaja Kopycat)
  • Port: 23946

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Zdaj postane na voljo gumb za odpravljanje napak (tipka F9):

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Kliknite ga, da se povežete z modulom za odpravljanje napak v emulatorju. IDA preide v način odpravljanja napak, na voljo so dodatna okna: informacije o registrih, o skladu.

Zdaj lahko uporabljamo vse standardne funkcije razhroščevalnika:

  • izvedba navodil po korakih (Vstopite и Stopiti čez — tipki F7 oziroma F8);
  • zagon in premor izvajanja;
  • ustvarjanje prelomnih točk za kodo in podatke (tipka F2).

Povezava z razhroščevalnikom ne pomeni zagona kode vdelane programske opreme. Trenutni izvršilni položaj mora biti naslov 0x08006A74 — začetek delovanja Reset_Handler. Če se po seznamu pomaknete navzdol, lahko vidite klic funkcije Glavni. Kazalec lahko postavite na to vrstico (naslov 0x08006ABE) in izvedite operacijo Teči do kazalca (tipka F4).

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Nato lahko pritisnete F7 za vstop v funkcijo Glavni.

Če zaženete ukaz Nadaljujte s postopkom (tipka F9), potem se prikaže okno »Prosimo, počakajte« z enim samim gumbom Začasno prekine:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Ko pritisnete Začasno prekine izvajanje programske kode je prekinjeno in se lahko nadaljuje z istega naslova v kodi, kjer je bilo prekinjeno.

Če nadaljujete z izvajanjem kode, boste v terminalih, povezanih z virtualnimi vrati COM, videli naslednje vrstice:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Prisotnost vrstice »state bypass« pomeni, da je navidezni modul Bluetooth preklopil na način prejemanja podatkov iz uporabnikovih vrat COM.

Zdaj lahko v terminalu Bluetooth (na sliki COM29) vnašate ukaze v skladu s protokolom Rhino. Na primer, ukaz “MEOW” vrne niz “mur-mur” terminalu Bluetooth:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Posnemaj me ne popolnoma

Pri izdelavi emulatorja lahko izberete stopnjo podrobnosti/emulacije določene naprave. Na primer, modul Bluetooth je mogoče posnemati na različne načine:

  • naprava je v celoti emulirana s polnim naborom ukazov;
  • Ukazi AT se emulirajo, podatkovni tok pa se sprejme iz vrat COM glavnega sistema;
  • virtualna naprava omogoča popolno preusmeritev podatkov na realno napravo;
  • kot preprosta škrbina, ki vedno vrne "OK".

Trenutna različica emulatorja uporablja drugi pristop - navidezni modul Bluetooth izvede konfiguracijo, po kateri preklopi v način "posredovanja" podatkov iz vrat COM glavnega sistema v vrata UART emulatorja.

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Razmislimo o možnosti preproste instrumentacije kode v primeru, da kakšen del periferije ni implementiran. Na primer, če časovnik, odgovoren za nadzor prenosa podatkov v DMA, ni bil ustvarjen (preverjanje se izvede v funkciji ws2812b_počakajki se nahaja na 0x08006840), potem bo vdelana programska oprema vedno čakala na ponastavitev zastavice zasedenki se nahaja na 0x200004C4ki prikazuje zasedenost podatkovne linije DMA:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

To situacijo lahko rešimo z ročno ponastavitvijo zastavice zaseden takoj po namestitvi. V IDA Pro lahko ustvarite funkcijo Python in jo pokličete v prelomni točki ter postavite samo prekinitveno točko v kodo, potem ko zastavite vrednost 1 zaseden.

Obravnavalnik prelomnih točk

Najprej ustvarimo funkcijo Python v IDA. meni Datoteka - ukaz skripta ...

Na seznamu na levi dodajte nov delček in mu dajte ime (npr. BPT),
V besedilno polje na desni vnesite kodo funkcije:

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

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Po tem pritisnemo Run in zaprite okno skripta.

Zdaj pa pojdimo na kodo na 0x0800688A, nastavite prekinitveno točko (tipka F2), jo uredite (kontekstni meni Uredi prelomno točko ...), ne pozabite nastaviti vrste skripta na Python:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat
Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Če je trenutna vrednost zastavice zaseden je enako 1, potem bi morali izvesti funkcijo skip_dma v skriptni vrstici:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Če vdelano programsko opremo zaženete za izvajanje, je sprožitev kode za obravnavo prekinitvene točke vidna v oknu IDA izhod po vrstici Skipping wait ws2812.... Zdaj vdelana programska oprema ne bo čakala na ponastavitev zastavice zaseden.

Interakcija z emulatorjem

Posnemanje zaradi posnemanja verjetno ne bo povzročilo navdušenja in veselja. Veliko bolj zanimivo je, če emulator pomaga raziskovalcu videti podatke v pomnilniku ali vzpostaviti interakcijo niti.

Pokazali vam bomo, kako dinamično vzpostaviti interakcijo med nalogami RTOS. Najprej morate začasno ustaviti izvajanje kode, če se izvaja. Če greš na funkcijo bluetooth_task_entry na vejo obdelave ukaza “LED” (naslov 0x080057B8), potem lahko vidite, kaj je najprej ustvarjeno in nato poslano v sistemsko čakalno vrsto ledControlQueueHandle neko sporočilo.

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Za dostop do spremenljivke morate nastaviti prekinitveno točko ledControlQueueHandleki se nahaja na 0x20000624 in nadaljujte z izvajanjem kode:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Posledično se bo zaustavitev najprej zgodila na naslovu 0x080057CA preden pokličete funkcijo osMailAlloc, nato na naslovu 0x08005806 preden pokličete funkcijo osMailPut, nato čez nekaj časa - na naslov 0x08005BD4 (pred klicem funkcije osMailGet), ki pripada funkciji LEDs_task_entry (LED-naloga), to pomeni, da sta se nalogi zamenjali in zdaj je LED-naloga prejela nadzor.

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Na ta preprost način lahko ugotovite, kako naloge RTOS medsebojno delujejo.

Seveda je v resnici lahko interakcija nalog bolj zapletena, vendar z uporabo emulatorja sledenje tej interakciji postane manj naporno.

Tukaj Ogledate si lahko kratek videoposnetek zagona emulatorja in interakcije z IDA Pro.

Zagon z Radare2

Ne morete prezreti tako univerzalnega orodja, kot je Radare2.

Za povezavo z emulatorjem z uporabo r2 bi ukaz izgledal takole:

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

Zagon je zdaj na voljo (dc) in začasno ustavite izvajanje (Ctrl+C).

Na žalost ima trenutno r2 težave pri delu s strojnim strežnikom gdb in postavitvijo pomnilnika; zaradi tega prekinitvene točke in koraki ne delujejo (ukaz ds). Upamo, da bo to kmalu popravljeno.

Teče z Eclipse

Ena od možnosti za uporabo emulatorja je odpravljanje napak v vdelani programski opremi naprave, ki se razvija. Zaradi jasnosti bomo uporabili tudi vdelano programsko opremo Rhino. Lahko prenesete vire vdelane programske opreme zato.

Kot IDE bomo uporabili Eclipse iz nabora System Workbench za STM32.

Če želite, da emulator naloži vdelano programsko opremo, neposredno prevedeno v Eclipse, morate dodati parameter firmware=null na ukaz za zagon emulatorja:

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

Nastavitev konfiguracije za odpravljanje napak

V Eclipse izberite meni Zaženi - konfiguracije za odpravljanje napak ... V oknu, ki se odpre, v razdelku Odpravljanje napak strojne opreme GDB morate dodati novo konfiguracijo, nato pa na zavihku »Glavno« določite trenutni projekt in aplikacijo za odpravljanje napak:

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Na zavihku »Debugger« morate podati ukaz GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

Vnesite tudi parametre za povezavo s strežnikom GDB (gostitelj in vrata):

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Na zavihku »Zagon« morate določiti naslednje parametre:

  • omogoči potrditveno polje Naloži sliko (tako da se sestavljena slika vdelane programske opreme naloži v emulator);
  • omogoči potrditveno polje Naloži simbole;
  • dodaj ukaz za zagon: set $pc = *0x08000004 (nastavite PC register na vrednost iz pomnilnika na naslovu 0x08000004 - tam je shranjen naslov ResetHandler).

Обратите внимание, če ne želite prenesti datoteke vdelane programske opreme iz Eclipse, potem možnosti Naloži sliko и Zagon ukazov ni treba navesti.

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Ko kliknete Debug, lahko delate v načinu razhroščevalnika:

  • izvajanje kode po korakih
    Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat
  • interakcijo z prelomnimi točkami
    Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Obvestilo. Eclipse ima, hmm... nekaj posebnosti... in z njimi moraš živeti. Na primer, če se ob zagonu razhroščevalnika prikaže sporočilo »Ni vira na voljo za »0x0««, izvedite ukaz Step (F5)

Nosorog znotraj mačke - zaženite vdelano programsko opremo v emulatorju Kopycat

Namesto zaključka

Posnemanje izvorne kode je zelo zanimiva stvar. Razvijalec naprave lahko razhrošči vdelano programsko opremo brez prave naprave. Za raziskovalca je to priložnost za dinamično analizo kode, kar ni vedno mogoče niti z napravo.

Strokovnjakom želimo ponuditi orodje, ki je priročno, zmerno preprosto in ne zahteva veliko truda in časa za nastavitev in zagon.

V komentarjih napišite svoje izkušnje z uporabo emulatorjev strojne opreme. Vabimo vas k razpravi in ​​z veseljem odgovarjamo na vprašanja.

V anketi lahko sodelujejo samo registrirani uporabniki. Prijaviti se, prosim.

Za kaj uporabljaš emulator?

  • Razvijam (odpravljam napake) firmware

  • Raziskujem firmware

  • Zaganjam igre (Dendi, Sega, PSP)

  • še kaj (napiši v komentarje)

Glasovalo je 7 uporabnikov. 2 uporabnika sta se vzdržala.

Katero programsko opremo uporabljate za posnemanje izvorne kode?

  • QEMU

  • Samorog motor

  • Proteus

  • še kaj (napiši v komentarje)

Glasovalo je 6 uporabnikov. 2 uporabnika sta se vzdržala.

Kaj bi radi izboljšali v emulatorju, ki ga uporabljate?

  • Hočem hitrost

  • Želim enostavno nastavitev/zagon

  • Želim več možnosti za interakcijo z emulatorjem (API, kljuke)

  • Z vsem sem zadovoljen

  • še kaj (napiši v komentarje)

Glasovalo je 8 uporabnikov. 1 uporabnik se je vzdržal.

Vir: www.habr.com

Dodaj komentar