Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Osana kokousta 0x0A DC7831 DEF CON Nizhny Novgorod 16. helmikuuta esitimme raportin binaarikoodiemuloinnin perusperiaatteista ja omasta kehityksestämme - laitteistoalustan emulaattorista Copycat.

Tässä artikkelissa kuvataan, kuinka laitteen laiteohjelmisto suoritetaan emulaattorissa, osoitetaan vuorovaikutus virheenkorjaajan kanssa ja suoritetaan laiteohjelmiston pieni dynaaminen analyysi.

esihistoria

Kauan sitten kaukana galaksissa

Pari vuotta sitten laboratoriossamme oli tarve tutkia laitteen laiteohjelmistoa. Laiteohjelmisto pakattiin ja purettiin käynnistyslataimella. Hän teki tämän hyvin monimutkaisella tavalla siirtäen tietoja muistissa useita kertoja. Ja itse laiteohjelmisto oli aktiivisesti vuorovaikutuksessa oheislaitteiden kanssa. Ja kaikki tämä MIPS-ytimellä.

Objektiivisista syistä saatavilla olevat emulaattorit eivät sopineet meille, mutta halusimme silti suorittaa koodin. Sitten päätimme tehdä oman emulaattorin, joka tekisi mahdollisimman vähän ja antaisi meille mahdollisuuden purkaa päälaiteohjelmiston. Kokeilimme ja se toimi. Ajattelimme, mitä jos lisäisimme oheislaitteet suorittamaan myös päälaiteohjelmiston. Se ei satuttanut paljon - ja se myös onnistui. Ajattelimme uudelleen ja päätimme tehdä täysimittaisen emulaattorin.

Tuloksena oli tietokonejärjestelmien emulaattori Copycat.

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa
Miksi Kopycat?

Sanoilla leikitään.

  1. apina (englanniksi, substantiivi [ˈkɒpɪkæt]) - jäljittelijä, jäljittelijä
  2. miten (englanniksi, substantiivi [ˈkæt]) - kissa, kissa - yhden projektin luojan suosikkieläin
  3. Kirjain “K” on Kotlin-ohjelmointikielestä

Copycat

Emulaattoria luotaessa asetettiin erittäin tarkat tavoitteet:

  • kyky luoda nopeasti uusia oheislaitteita, moduuleja, prosessoriytimiä;
  • kyky koota virtuaalinen laite eri moduuleista;
  • kyky ladata mitä tahansa binaaridataa (laiteohjelmisto) virtuaalisen laitteen muistiin;
  • kyky työskennellä tilannekuvien (järjestelmän tilan tilannekuvien) kanssa;
  • kyky olla vuorovaikutuksessa emulaattorin kanssa sisäänrakennetun debuggerin kautta;
  • mukava moderni kieli kehitystä varten.

Tuloksena Kotlin valittiin toteutukseen, väyläarkkitehtuuriksi (tämä on kun moduulit kommunikoivat keskenään virtuaalisten dataväylien kautta), JSON laitekuvausformaatiksi ja GDB RSP protokollaksi vuorovaikutukseen debuggerin kanssa.

Kehitystä on jatkunut hieman yli kaksi vuotta ja se jatkuu aktiivisesti. Tänä aikana MIPS-, x86-, V850ES-, ARM- ja PowerPC-prosessoriytimet otettiin käyttöön.

Projekti kasvaa ja on aika esitellä se suurelle yleisölle. Teemme projektista yksityiskohtaisen kuvauksen myöhemmin, mutta toistaiseksi keskitymme Kopycatin käyttöön.

Kärsimättömimmille voi ladata emulaattorin promoversion osoitteesta linkki.

Rhino emulaattorissa

Muistetaan, että aiemmin SMARTRHINO-2018 konferenssia varten luotiin testilaite ”Rhinoceros” käänteisen suunnittelun opettamiseen. Staattisen laiteohjelmiston analyysin prosessi kuvattiin kohdassa tässä artikkelissa.

Yritetään nyt lisätä "kaiuttimet" ja suorittaa laiteohjelmisto emulaattorissa.

Tarvitaan:
1) Java 1.8
2) Python ja moduuli jep Pythonin käyttämiseen emulaattorissa. Voit rakentaa WHL-moduulin Jep Windowsille Lataa tästä.

Windows:
1) com0com
2) PuTTY

Linuxille:
1) socat

Voit käyttää Eclipseä, IDA Prota tai radare2:ta GDB-asiakkaana.

Miten se toimii?

Laiteohjelmiston suorittamiseksi emulaattorissa on tarpeen "koota" virtuaalinen laite, joka on todellisen laitteen analogi.

Todellinen laite ("sarvikuono") voidaan näyttää lohkokaaviossa:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Emulaattorilla on modulaarinen rakenne ja lopullinen virtuaalilaite voidaan kuvata JSON-tiedostossa.

JSON 105 riviä

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

Kiinnitä huomiota parametriin firmware Luvussa params on tiedoston nimi, joka voidaan ladata virtuaalilaitteeseen laiteohjelmistona.

Virtuaalinen laite ja sen vuorovaikutus pääkäyttöjärjestelmän kanssa voidaan esittää seuraavalla kaaviolla:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Emulaattorin nykyinen testiesiintymä sisältää vuorovaikutuksen pääkäyttöjärjestelmän COM-porttien kanssa (Bluetooth-moduulin UART- ja UART-virheenkorjaus). Nämä voivat olla todellisia portteja, joihin laitteet on kytketty, tai virtuaalisia COM-portteja (tätä varten tarvitset vain com0com/socat).

Tällä hetkellä on kaksi päätapaa olla vuorovaikutuksessa emulaattorin kanssa ulkopuolelta:

  • GDB RSP-protokolla (vastaavasti tätä protokollaa tukevat työkalut ovat Eclipse / IDA / radare2);
  • sisäisen emulaattorin komentorivi (Argparse tai Python).

Virtuaaliset COM-portit

Jotta voit olla vuorovaikutuksessa paikallisen koneen virtuaalisen laitteen UART:n kanssa päätteen kautta, sinun on luotava pari siihen liittyviä virtuaalisia COM-portteja. Meidän tapauksessamme emulaattori käyttää yhtä porttia ja toista pääteohjelma (PuTTY tai näyttö):

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

com0comin käyttö

Virtuaaliset COM-portit määritetään com0com-sarjan asennusapuohjelmalla (konsoliversio - C:Program Files (x86)com0comsetupс.exe, tai GUI-versio - C:Program Files (x86)com0comsetupg.exe):

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Valitse ruudut ota puskurin ylitys käyttöön kaikille luoduille virtuaalisille porteille, muuten emulaattori odottaa vastausta COM-portista.

Käyttämällä socat

UNIX-järjestelmissä emulaattori luo automaattisesti virtuaaliset COM-portit socat-apuohjelmalla; tehdäksesi tämän, määritä vain portin nimen etuliite emulaattoria käynnistettäessä. socat:.

Sisäinen komentorivin käyttöliittymä (Argparse tai Python)

Koska Kopycat on konsolisovellus, emulaattori tarjoaa kaksi komentorivin käyttöliittymävaihtoehtoa vuorovaikutukseen sen objektien ja muuttujien kanssa: Argparse ja Python.

Argparse on Kopycatiin sisäänrakennettu CLI, joka on aina kaikkien saatavilla.

Vaihtoehtoinen CLI on Python-tulkki. Jotta voit käyttää sitä, sinun on asennettava Jep Python -moduuli ja määritettävä emulaattori toimimaan Pythonin kanssa (käytetään käyttäjän pääjärjestelmään asennettua Python-tulkkia).

Python-moduulin Jep asennus

Linuxissa Jep voidaan asentaa pip:n kautta:

pip install jep

Jos haluat asentaa Jep Windowsiin, sinun on ensin asennettava Windows SDK ja vastaava Microsoft Visual Studio. Olemme tehneet siitä hieman helpompaa sinulle ja WHL rakentaa JEP nykyisille Python for Windows -versioille, joten moduuli voidaan asentaa tiedostosta:

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

Jos haluat tarkistaa Jepin asennuksen, sinun on suoritettava komentorivillä:

python -c "import jep"

Vastauksena pitäisi saada seuraava viesti:

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

Järjestelmäsi emulaattorin erätiedostossa (copycat.bat - Windowsille, kopioida - Linuxille) parametriluetteloon DEFAULT_JVM_OPTS lisää ylimääräinen parametri Djava.library.path — sen tulee sisältää polku asennettuun Jep-moduuliin.

Windowsin tuloksen pitäisi olla seuraava rivi:

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

Kopycatin käynnistäminen

Emulaattori on konsoli JVM -sovellus. Käynnistys suoritetaan käyttöjärjestelmän komentorivikomentosarjan (sh/cmd) kautta.

Windowsissa suoritettava komento:

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

Komento ajaa Linuxissa socat-apuohjelmalla:

./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-portti, joka on avoinna pääsyä varten GDB-palvelimelle;
  • -n rhino — pääjärjestelmän moduulin (kootun laitteen) nimi;
  • -l user — kirjaston nimi, josta päämoduulia etsitään;
  • -y library — polku laitteeseen sisältyvien moduulien etsimiseen;
  • firmwarerhino_pass.bin — polku laiteohjelmistotiedostoon;
  • COM26 ja COM28 ovat virtuaalisia COM-portteja.

Tämän seurauksena näyttöön tulee kehote Python > (tai 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 >

Vuorovaikutus IDA Pron kanssa

Testauksen yksinkertaistamiseksi käytämme Rhinon laiteohjelmistoa lähdetiedostona IDA-lomakkeen analysointiin ELF tiedosto (metatiedot tallennetaan sinne).

Voit myös käyttää päälaiteohjelmistoa ilman metatietoja.

Kun Kopycat on käynnistetty IDA Prossa, siirry Debugger-valikon kohtaan "Vaihda debuggeria…" ja valitse"GDB-etädebuggeri". Määritä seuraavaksi yhteys: -valikko Vianetsintä - Prosessiasetukset…

Aseta arvot:

  • Sovellus - mikä tahansa arvo
  • Isäntänimi: 127.0.0.1 (tai sen etäkoneen IP-osoite, jossa Kopycat on käynnissä)
  • Port: 23946

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Nyt virheenkorjauspainike tulee saataville (F9-näppäin):

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Napsauta sitä muodostaaksesi yhteyden emulaattorin virheenkorjausmoduuliin. IDA siirtyy virheenkorjaustilaan, lisäikkunoita tulee saataville: tietoa rekistereistä, pinosta.

Nyt voimme käyttää kaikkia debuggerin vakioominaisuuksia:

  • vaiheittainen ohjeiden suorittaminen (Astua sisään и Astua yli — näppäimet F7 ja F8, vastaavasti);
  • suorituksen aloittaminen ja keskeyttäminen;
  • keskeytyskohtien luominen sekä koodille että datalle (F2-näppäin).

Yhteyden muodostaminen debuggeriin ei tarkoita laiteohjelmistokoodin suorittamista. Nykyisen suorituspaikan on oltava osoite 0x08006A74 — toiminnan alku Reset_Handler. Jos vierität luetteloa alaspäin, näet funktiokutsun tärkein. Voit sijoittaa kohdistimen tälle riville (osoite 0x08006ABE) ja suorita toimenpide Suorita kursoriin asti (näppäin F4).

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Seuraavaksi voit siirtyä toimintoon painamalla F7 tärkein.

Jos suoritat komennon Jatka prosessia (F9-näppäin), sitten "Odota"-ikkuna tulee näkyviin yhdellä painikkeella Keskeyttää:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Kun painat Keskeyttää laiteohjelmistokoodin suoritus keskeytyy ja sitä voidaan jatkaa samasta osoitteesta koodissa, jossa se keskeytettiin.

Jos jatkat koodin suorittamista, näet seuraavat rivit virtuaalisiin COM-portteihin liitetyissä päätteissä:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

"State bypass" -rivin läsnäolo osoittaa, että virtuaalinen Bluetooth-moduuli on siirtynyt tilaan vastaanottaa tietoja käyttäjän COM-portista.

Nyt Bluetooth-päätteessä (kuvassa COM29) voit syöttää Rhino-protokollan mukaisia ​​komentoja. Esimerkiksi "MEOW"-komento palauttaa merkkijonon "mur-mur" Bluetooth-päätteeseen:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Emuloi minua, älä täysin

Kun rakennat emulaattoria, voit valita tietyn laitteen yksityiskohtaisuuden/emuloinnin tason. Esimerkiksi Bluetooth-moduulia voidaan emuloida eri tavoin:

  • laite on täysin emuloitu täydellä komentosarjalla;
  • AT-komennot emuloidaan ja tietovirta vastaanotetaan pääjärjestelmän COM-portista;
  • virtuaalilaite tarjoaa täydellisen tiedon uudelleenohjauksen todelliseen laitteeseen;
  • yksinkertaisena tynkänä, joka palauttaa aina "OK".

Emulaattorin nykyinen versio käyttää toista lähestymistapaa - virtuaalinen Bluetooth-moduuli suorittaa konfiguroinnin, jonka jälkeen se siirtyy "välityspalvelin" -tilaan pääjärjestelmän COM-portista emulaattorin UART-porttiin.

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Tarkastellaan mahdollisuutta koodin yksinkertaiseen instrumentointiin siinä tapauksessa, että jokin osa reunasta ei ole toteutettu. Esimerkiksi jos ajastinta, joka ohjaa tiedonsiirtoa DMA:han, ei ole luotu (tarkistus suoritetaan toiminnossa ws2812b_waitsijaitsee 0x08006840), laiteohjelmisto odottaa aina lipun nollaamista kiireinensijaitsee 0x200004C4joka näyttää DMA-datalinjan täyttöasteen:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Voimme kiertää tämän tilanteen nollaamalla lipun manuaalisesti kiireinen heti asennuksen jälkeen. IDA Prossa voit luoda Python-funktion ja kutsua sitä keskeytyskohdassa ja laittaa itse keskeytyskohdan koodiin, kun olet kirjoittanut arvon 1 lippuun kiireinen.

Katkopisteen käsittelijä

Luodaan ensin Python-funktio IDA:ssa. Valikko Tiedosto - komentosarjakomento...

Lisää uusi katkelma vasemmalla olevaan luetteloon, anna sille nimi (esim. BPT),
Kirjoita oikealla olevaan tekstikenttään toimintokoodi:

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

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Sen jälkeen painamme ajaa ja sulje komentosarjaikkuna.

Siirrytään nyt koodiin osoitteessa 0x0800688A, aseta keskeytyskohta (F2-näppäin), muokkaa sitä (kontekstivalikko Muokkaa keskeytyspistettä...), älä unohda asettaa komentosarjan tyypiksi Python:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa
Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Jos nykyinen lipun arvo kiireinen on yhtä kuin 1, sinun tulee suorittaa funktio skip_dma käsikirjoitusrivillä:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Jos suoritat laiteohjelmiston suorittamista varten, keskeytyskohdan käsittelijän koodin laukaisu näkyy IDA-ikkunassa ulostulo rivillä Skipping wait ws2812.... Nyt laiteohjelmisto ei odota lipun nollaamista kiireinen.

Vuorovaikutus emulaattorin kanssa

Emulointi emuloinnin vuoksi ei todennäköisesti aiheuta iloa ja iloa. On paljon mielenkiintoisempaa, jos emulaattori auttaa tutkijaa näkemään muistissa olevat tiedot tai luomaan säikeiden vuorovaikutuksen.

Näytämme sinulle kuinka luoda dynaamisesti vuorovaikutus RTOS-tehtävien välillä. Sinun tulee ensin keskeyttää koodin suoritus, jos se on käynnissä. Jos menet toimintoon bluetooth_task_entry "LED"-komennon käsittelyhaaraan (osoite 0x080057B8), näet, mitä ensin luodaan ja sitten lähetetään järjestelmäjonoon ledControlQueueHandle joku viesti.

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Sinun tulee asettaa keskeytyskohta muuttujan käyttämiseksi ledControlQueueHandlesijaitsee 0x20000624 ja jatka koodin suorittamista:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Tämän seurauksena pysähdys tapahtuu ensin osoitteessa 0x080057CA ennen funktion kutsumista osMailAlloc, sitten osoitteeseen 0x08005806 ennen funktion kutsumista osMailPut, sitten hetken kuluttua - osoitteeseen 0x08005BD4 (ennen funktion kutsumista osMailGet), joka kuuluu funktioon leds_task_entry (LED-tehtävä), eli tehtävät vaihtuivat, ja nyt LED-tehtävä sai ohjauksen.

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Tällä yksinkertaisella tavalla voit määrittää, kuinka RTOS-tehtävät ovat vuorovaikutuksessa toistensa kanssa.

Tietenkin todellisuudessa tehtävien vuorovaikutus voi olla monimutkaisempaa, mutta käyttämällä emulaattoria tämän vuorovaikutuksen seuraaminen on vähemmän työlästä.

Täällä Voit katsoa lyhyen videon emulaattorin käynnistämisestä ja vuorovaikutuksesta IDA Pron kanssa.

Käynnistä Radare2:lla

Et voi sivuuttaa sellaista universaalia työkalua kuin Radare2.

Yhdistääksesi emulaattoriin r2:lla, komento näyttää tältä:

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

Käynnistys saatavilla nyt (dc) ja keskeytä suoritus (Ctrl+C).

Valitettavasti tällä hetkellä r2:lla on ongelmia työskennellessään laitteiston gdb-palvelimen ja muistiasettelun kanssa; tämän vuoksi keskeytyskohdat ja vaiheet eivät toimi (komento ds). Toivomme, että tämä korjataan pian.

Juokse Eclipsen kanssa

Yksi emulaattorin käyttömahdollisuuksista on tehdä virheenkorjaus kehitettävän laitteen laiteohjelmistosta. Selvyyden vuoksi käytämme myös Rhinon laiteohjelmistoa. Voit ladata laiteohjelmiston lähteet siten.

Käytämme sarjan Eclipseä IDE:nä System Workbench for STM32.

Parametri on lisättävä, jotta emulaattori voi ladata suoraan Eclipseen käännetyn laiteohjelmiston firmware=null emulaattorin käynnistyskomentoon:

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

Määritetään virheenkorjausasetuksia

Valitse Eclipsessä valikko Suorita - Virheenkorjausmääritykset... Avautuvassa ikkunassa osiossa GDB-laitteiston virheenkorjaus sinun on lisättävä uusi kokoonpano ja määritä sitten "Pää"-välilehdellä nykyinen projekti ja sovellus virheenkorjausta varten:

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

"Debugger"-välilehdellä sinun on määritettävä GDB-komento:
${openstm32_compiler_path}arm-none-eabi-gdb

Ja anna myös parametrit yhteyden muodostamiseksi GDB-palvelimeen (isäntä ja portti):

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

"Käynnistys"-välilehdellä sinun on määritettävä seuraavat parametrit:

  • ota käyttöön -valintaruutu Lataa kuva (jotta koottu laiteohjelmiston kuva ladataan emulaattoriin);
  • ota käyttöön -valintaruutu Lataa symbolit;
  • lisää käynnistyskomento: set $pc = *0x08000004 (aseta PC-rekisteri arvoon muistista osoitteessa 0x08000004 - osoite on tallennettu sinne ResetHandler).

Kiinnitä huomiota, jos et halua ladata laiteohjelmistotiedostoa Eclipsestä, valitse vaihtoehdot Lataa kuva и Suorita komennot ei tarvitse ilmoittaa.

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Kun olet napsauttanut Debug-painiketta, voit työskennellä virheenkorjaustilassa:

  • askel askeleelta koodin suoritus
    Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa
  • vuorovaikutuksessa keskeytyskohtien kanssa
    Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Huomata. Eclipsellä on, hmm... omituisuuksia... ja sinun täytyy elää niiden kanssa. Jos esimerkiksi käynnistäessäsi virheenkorjausohjelman ilmestyy viesti "Lähdettä ei ole saatavilla "0x0":lle, suorita Step-komento (F5)

Sarvikuono kissan sisällä – suorita laiteohjelmisto Kopycat-emulaattorissa

Sen sijaan johtopäätös

Natiivikoodin emulointi on erittäin mielenkiintoinen asia. Laitekehittäjän on mahdollista suorittaa laiteohjelmiston virheenkorjaus ilman todellista laitetta. Tutkijalle se on mahdollisuus tehdä dynaamista koodianalyysiä, mikä ei aina ole mahdollista edes laitteella.

Haluamme tarjota asiantuntijoille työkalun, joka on kätevä, kohtalaisen yksinkertainen ja joka ei vaadi paljon vaivaa ja aikaa asentaa ja käyttää.

Kirjoita kommentteihin kokemuksistasi laitteistoemulaattorien käytöstä. Kutsumme sinut keskustelemaan ja vastaamme mielellämme kysymyksiin.

Vain rekisteröityneet käyttäjät voivat osallistua kyselyyn. Kirjaudu sisään, ole kiltti.

Mihin käytät emulaattoria?

  • Kehitän (debug) firmwarea

  • Tutkin laiteohjelmistoa

  • Julkaisen pelejä (Dendi, Sega, PSP)

  • jotain muuta (kirjoita kommentteihin)

7 käyttäjää äänesti. 2 käyttäjää pidättyi äänestämästä.

Mitä ohjelmistoa käytät alkuperäisen koodin emulointiin?

  • QEMU

  • Yksisarvinen moottori

  • Proteus

  • jotain muuta (kirjoita kommentteihin)

6 käyttäjää äänesti. 2 käyttäjää pidättyi äänestämästä.

Mitä haluaisit parantaa käyttämässäsi emulaattorissa?

  • Haluan nopeutta

  • Haluan helpon asennuksen/käynnistyksen

  • Haluan lisää vaihtoehtoja vuorovaikutukseen emulaattorin kanssa (API, koukut)

  • Olen tyytyväinen kaikkeen

  • jotain muuta (kirjoita kommentteihin)

8 käyttäjää äänesti. 1 käyttäjä pidättyi äänestämästä.

Lähde: will.com

Lisää kommentti