Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Kohtumisel 0x0A DC7831 DEF CON Nizhni Novgorod 16. veebruaril esitlesime ettekannet binaarkoodi emuleerimise pĂ”hialustest ja meie enda arendusest — riistvaraplatvormide emulaatorist Kopycat.

Artiklis anname ĂŒlevaate seadme pĂŒsivara kĂ€ivitamisest emulaatoris, nĂ€itame suhtlemist siluriga ja teeme vĂ€ikese dĂŒnaamilise analĂŒĂŒsi pĂŒsivaramudelist.

Eelalugu

A long time ago in a galaxy far far away

MĂ”ned aastad tagasi tekkis meie laboris vajadus uurida seadme pĂŒsivara. PĂŒsivara oli kompressitud, lahti pakkimise tegi bootloader. See toimus ĂŒsna keerulisel viisil, mitu korda andmeid mĂ€llu paigutades. Ning ise pĂŒsivara suhtles aktiivselt perifeeriaga. Ja kĂ”ik see MIPS-i tuumal.

Oleme pĂ”hjusel, et olemasolevad emulaatorid meid ei rahuldanud, otsustanud luua oma emulaatori, mis teeks miinimumi ja vĂ”imaldaks pĂ”hifirmavara avada. Proovisime — ja see Ă”nnestus. MĂ”tlesime, et mis siis, kui lisame perifeeria, et pĂ”hifirmavara veel kĂ€itada. See ei olnud liiga valus — ja jĂ€lle Ă”nnestus. JĂ”udsime jĂ€reldusele, et peaksime tegema tĂ€ieliku emulaatori.

LĂ”puks saime emulaatori arvutus sĂŒsteemide jaoks. Kopycat.

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat
Miks Kopycat?

Siin on sÔnamÀng.

  1. copycat (ingl., nim. [ˈkɒpÉȘkĂŠt]) — jĂ€ljendaja, imiteerija
  2. cat (ingl., nim. [ˈkĂŠt]) — kass, kassipoeg — ĂŒks projekti looja lemmikloomadest
  3. TĂ€ht «K» — programmeerimiskeel Kotlin'i jĂ€rgi

Kopycat

Emulaatori loomisel seati tÀielikult kindlad eesmÀrgid:

  • vĂ”imalus kiiresti luua uus perifeeria, moodul, protsessorituum;
  • vĂ”imalus kokku panna virtuaalne seade erinevatest moodulitest;
  • vĂ”imalus laadida virtuaalse seadme mĂ€llu mis tahes binaardata (firmavara);
  • vĂ”imalus töötada hetkepiltidega (sĂŒsteemi seisundi pildistamine);
  • vĂ”imalus suhelda emulaatoriga sisseehitatud veaparandaja kaudu;
  • mugav ja kaasaegne arenduskeel.

LĂ”puks valiti teostuseks Kotlin, bussiarhitektuur (see on, kui moodulid ĂŒhendatakse omavahel lĂ€bi virtuaalsete andmebusside), JSON seadme kirjeldusvorminguks ning GDB RSP protokolliks suhtlemiseks debuggeriga.

Arendus on kestnud juba ĂŒle kahe aasta ja jĂ€tkub aktiivselt. Selle aja jooksul on teostatud MIPS, x86, V850ES, ARM ja PowerPC protsessorituumad.

Projekt kasvab ning on aeg esitleda seda laiemale publikule. Projekti ĂŒksikasjaliku kirjelduse anname hiljem, praegu keskendume Kopycati kasutamisele.

KĂ”ige kannatamatumatele — emulaatori promoversiooni saab alla laadida lingi kaudu.

Norsule emulaatoris

KĂ€ remindersime, et varem loodi konverentsile SMARTRHINO-2018 testseade nimega „Norsu“ tagasiregistreerimise oskuste Ă”ppimiseks. Firmware'i staatilist analĂŒĂŒsi on kirjeldatud selles artiklis.

NĂŒĂŒd proovime lisada "dĂŒnaamikat" ja kĂ€ivitame firmware emulaatoris.

Meil on vaja:
1) Java 1.8
2) Python ja moodul Jep Python'i kasutamiseks emulaatori sees. Windowsi jaoks saab WHL paketti Jep moodulist siit alla laadida.

Windowsi jaoks:
1) com0com
2) PuTTY

Linuxi jaoks:
1) socat

GDB-klientina saab kasutada Eclipse'i, IDA Pro'd vÔi radare2.

Kuidas see töötab?

Emulaatori vahetamiseks tuleb luua virtuaalne seade, mis esindab reaalset seadet.

Reaalset seadet („ninasarvik“) saab nĂ€idata struktuuri scheemina:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Emulaatoril on modulaarsestruktuur ning lÔplikku virtuaalset seadet saab kirjeldada JSON-failis.

JSON 105 rida

{
  "top": true,

  // Plugina nime peaks olema sama, mis faili nimi (vÔi tÀispikk tee raamatukogust)
  "plugin": "rhino",

  // Kaust, kuhu plugin salvestatakse
  "library": "user",

  // Plugina parameetrid (konstruktoriparameetrid, kui jar-plugin versioon)
  "params": [
    { "name": "tty_dbg", "type": "String"},
    { "name": "tty_bt", "type": "String"},
    { "name": "firmware", "type": "String", "default": "NUL"}
  ],

  // Plugina vÀlist sadamat
  "ports": [  ],

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

  // Plugina sisekomponendid
  "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" }
  ],

  // Plugina ĂŒhendused komponentide vahel
  "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"]
  ]
}

Pöörake tĂ€helepanu parameetrile firmware jaotises params — see on faili nimi, mida saab laadida virtuaalsesse seadmesse tarkvara vĂ€rskendamiseks.

Virtuaalset seadet ja selle suhtlemist peamise operatsioonisĂŒsteemiga saab kujutada jĂ€rgmise skeemi abil:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Praegune emulaatori testimise nĂ€idis hĂ”lmab suhtlemist pĂ”hiosa COM-portidega (debug UART ja Bluetooth-mooduli UART). Need vĂ”ivad olla reaalsed portid, kuhu on ĂŒhendatud seadmed, vĂ”i virtuaalsed COM-portid (selleks on vajalik com0com / socat).

Emulaatoriga vÀljastpoolt suhtlemiseks on praegu kaks peamist meetodit:

  • GDB RSP protokoll (vastavad tööriistad — Eclipse / IDA / radare2);
  • emulaatori sisemine kĂ€surea liides (Argparse vĂ”i Python).

Virtuaalsed COM-portid

Kuna virtuaalse seadme UART-iga suhtlemiseks kohaliku masina terminalist on vaja luua paar omavahel seotud virtuaalseid COM-porte. Meie juhul kasutab ĂŒks port emulaatorit ja teine — terminaliprogramm (PuTTY vĂ”i screen):

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

com0com kasutamine

Virtuaalsed COM-portid seadistatakse komplekti com0com setup-utility abil (konsooliversioon — C:Program Files (x86)com0comsetupс.exe, vĂ”i GUI-versioon — C:Program Files (x86)com0comsetupg.exe):

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Samuti tuleb mÀrkida ruudud enable buffer overrun kÔigi loodud virtuaalsete portide jaoks, vastasel juhul ootab emulaator COM-porti vastust.

socat'i kasutamine

UNIX-sĂŒsteemides luuakse virtuaalsed COM-portid automaatselt emulaatori abil kasutades utiliiti socat, selleks piisab, kui emulaatori kĂ€ivitamisel portide nimedes kasutada prefiksit socat:.

Sisemine kÀsurea liides (Argparse vÔi Python)

Kuna Kopycat on konsoolirakendus, pakub emulaator oma objektidega ja muutujatega suhtlemiseks kahte kÀsurea liidest: Argparse ja Python.

Argparse — see on Kopycati sisseehitatud CLI, mis on alati ja kĂ”igile saadaval.

Alternatiivne CLI — Python'i tĂ”lgendaja. Selle kasutamiseks tuleb installida Python'i moodul Jep ja seadistada emulaator töötama Python'iga (kasutatakse kasutaja pĂ”hissĂŒsteemis installitud Python'i tĂ”lgendajat).

Python'i mooduli Jep installimine

Linuxis saab Jep'i installida lÀbi pip:

pip install jep

Jep-i installimiseks Windowsi all on vajalik eelnevalt paigaldada Windows SDK ja sobiv Microsoft Visual Studio. Oleme teie ĂŒlesannet veidi lihtsustanud ja teinud WHL-paketid JEP viimaste Python versioonide jaoks Windowsis, mistĂ”ttu saab mooduli paigaldada failist:

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

Jep-i paigaldamise kontrollimiseks tuleb kÀivitada jÀrgnev kÀsk kÀsureas:

python -c "import jep"

Vastuseks peaks saama sÔnum:

ImportError: Jep ei ole iseseisvas Pythoni versioonis toetatud, see peab olema Java-sse sisse ehitatud.

Teie sĂŒsteemi emulatori kĂ€skfailis (kopycat.bat – Windowsi jaoks, kopycat – Linuxi jaoks) lisage parameetrite nimekirja DEFAULT_JVM_OPTS tĂ€iendav parameeter Djava.library.path – see peaks sisaldama teed paigaldatud Jep moodulini.

Seega peaks Windowsi jaoks moodustuma jÀrgmine rida:

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

Kopycat-i kÀivitamine

Emulaator on konsooli JVM-rakendus. KĂ€ivitamine toimub operatsioonisĂŒsteemi kĂ€sureas (sh/cmd).

KÀsk Windowsi all kÀivitamiseks:

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

KÀsk Linuxis kÀivitamiseks kasutades utiliiti 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, mis avatakse GDB-serverile juurdepÀÀsuks;
  • -n rhino — sĂŒsteemi pĂ”hikomponendi nimi (seade koosseisus);
  • -l user — pĂ”hikomponendi otsimiseks kasutatav teek;
  • -y library — tee, kust otsitakse seadmes olevaid komponente;
  • firmwarerhino_pass.bin — lĂ€htefaili tee;
  • COM26 ja COM28 — virtuaalsed COM-portid.

Tulemuseks kuvatakse kÀskluste tÀitmine Python > (vÔi Argparse >):

18:07:59 INFO [eFactoryBuilder.create ]: Moodul top on edukalt loodud
18:07:59 INFO [ Module.initializeAndRes]: Seadistatakse tuum top.u1_stm32.cortexm0.arm jaoks
18:07:59 INFO [ Module.initializeAndRes]: Seadistatakse debugeerija top.u1_stm32.dbg jaoks
18:07:59 WARN [ Module.initializeAndRes]: JĂ€lgijat ei leitud...
18:07:59 INFO [ Module.initializeAndRes]: Portide ja busside initsialiseerimine...
18:07:59 WARN [ Module.initializePortsA]: TÄHELEPANU: MĂ”ne porti puhul on hoiatus, kasuta printModulesPortsWarnings, et nĂ€ha...
18:07:59 FINE [ ARMv6CPU.reset ]: MÀÀratud sisenemispunkt 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Moodul top on edukalt initsialiseeritud ja lÀhtestatud!
18:07:59 INFO [ Kopycat.open ]: Alustatakse alusena top[rhino] virtuaalsust arm[ARMv6Core] jaoks
18:07:59 INFO [ GDBServer.debuggerModule ]: Seadistatud uus debugeerija moodul top.u1_stm32.dbg GDB_SERVER jaoks (port=23946,alive=true)
Python >

Koostoime IDA Pro-ga

AnalĂŒĂŒsimiseks kasutame IDA-s lihtsustatud testimiseks "Norsukaru" tarkvara ELF-failina (seal on meta information).

Saate kasutada ka pÔhifirmavara ilma metaandmeteta.

PĂ€rast Kopycat kĂ€ivitamist IDA Pro-s lĂ€heme Debugger menĂŒĂŒs punkti «Switch debugger » ja valime «Remote GDB debugger«. Edasi seadistame ĂŒhenduse: menĂŒĂŒst Debugger — Process options


Seame vÀÀrtused:

  • Application — mis tahes vÀÀrtus
  • Hostname: 127.0.0.1 (vĂ”i IP-aadress kaugtöötlusmasinast, kus Kopycat töötab)
  • Port: 23946

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

NĂŒĂŒd on juurdepÀÀs silumise kĂ€ivitamise nupule (klahv F9):

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Vajutame sellele — toimub ĂŒhendamine debuggermooduli ja emulaatoriga. IDA lĂ€heb silumisse ja muutuvad kergesti kĂ€ttesaadavaks lisakujud: registrite teave, virna teave.

NĂŒĂŒd saame kasutada kĂ”iki standardseid silumise vĂ”imalusi:

  • juhendi lĂ€bi viimist (Step into ja Step over — klahvid F7 ja F8, vastavalt);
  • kĂ€ivitus ja tĂ”kestamine;
  • murdpunktide loomine nii koodile kui andmetele (klahv F2).

Ühendamine debugeerijaga ei tĂ€henda, et firmavara kood kĂ€ivitatakse. KĂ€ivituskoht peab olema aadressil 0x08006A74 — funktsiooni algus Reset_Handler. Kui kerite loendi alla, siis nĂ€ete funktsiooni kutset main. Kursorit saab sellel real (aadress) 0x08006ABE) ja teostada toiming KĂ€ita kuni kursori (klahv F4).

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

SeejÀrel saab vajutada F7, et siseneda funktsiooni main.

Kui kĂ€ivitada kĂ€sk JĂ€tka protsessi (klahv F9), siis kuvatakse aken „Palun oota” ainsa nupuga Peata:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Nupu vajutamisel Peata koodide tÀitmine peatub ja seda saab jÀtkata samalt aadressilt koodis, kus see katkestati.

Kui koodi tĂ€itmist jĂ€tkata, siis virtuaalsete COM-portidega ĂŒhendatud terminalides vĂ”ib nĂ€ha jĂ€rgmisi ridu:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Rida „state bypass” nĂ€itab, et virtuaalne Bluetooth-modul on lĂ€inud andmete vastuvĂ”tu reĆŸiimi kasutaja COM-portidelt.

NĂŒĂŒd saab Bluetooth-terminalis (pildil – COM29) sisestada kĂ€ske vastavalt „Norsukaru” protokollile. NĂ€iteks kĂ€sule „MEOW” tagastatakse Bluetooth-terminalis rida „mur-mur”:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Emuleeri mind mitte tÀielikult

Emulaatori ehitamisel saab valida, kui detailne/ĂŒle kantud on see vĂ”i see seade. NĂ€iteks Bluetooth-modulit saab emuleerida erinevalt:

  • emuleeritakse tĂ€ielikult seade koos kĂ”igi kĂ€skudega;
  • AT-kĂ€sud emuleeritakse ja andmevoog vĂ”etakse peamise sĂŒsteemi COM-portist;
  • virtuaalne seade tagab tĂ€ieliku andmete suunamise reaalsele seadmele;
  • lihtsa pistikuga, mis alati tagastab "OK".

Praeguses emulaatori versioonis kasutatakse teist lĂ€henemist — virtuaalne Bluetooth-moodul konfigureerib, seejĂ€rel lĂŒlitub "proksimise" reĆŸiimi, edastades andmeid peamise sĂŒsteemi COM-portist emulaatori UART-porti.

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Vaatame koodi lihtsat instrumenteerimist, juhul kui mÔni periferiaseade ei ole rakendatud. NÀiteks, kui ajastit, mis kontrollib andmete edastamist DMA-s, ei ole loodud (kontroll teostatakse funktsioonis ws2812b_wait, mis asub aadressil 0x08006840), siis tarkvara ootab alati, kuni lipp "busy" , mis asub aadressil0x200004C4 , nÀitab DMA andmejoone hÔivamist:Sellisest olukorrast saame mööda hiilida "manuaalse" lipu resettimisega

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

vahetult pÀrast selle seadmist. IDA Pro-s on vÔimalik luua Python-funktsioon ja kutsuda see esile hetkel, kui breakpoint on seadistatud, paigaldades selle koodi pÀrast vÀÀrtuse 1 kirjutamist lipule , mis asub aadressil Breakpoint-i töötleja , mis asub aadressil.

Esmalt loome IDA-s Python-funktsiooni. MenĂŒĂŒs

Alustame Python-funktsiooni loomisega IDA-s. MenĂŒĂŒs Fail — Skripti kĂ€sk


Lisame uue snipeti vasakpoolsesse nimekirja, anname selle nime (nÀiteks, BPT),
parempoolsesse teksti vÀljasse sisestame funktsiooni koodi:

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

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

PĂ€rast seda vajutame Run ja sulgeme skripti akna.

NĂŒĂŒd liigume koodi aadressile 0x0800688A, seadistame breakpoint (klahv F2), toimetame seda (kontekstimenĂŒĂŒ Muuda breakpointi
), Ă€rge unustage mÀÀrata skripti tĂŒĂŒpi – Python:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat
Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Kui praegune lipu vÀÀrtus , mis asub aadressil on 1, siis tuleks kÀivitada funktsioon skip_dma skripti rida:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Kui laadida ĂŒlekande kĂ€ivitamiseks, siis breakpointi töötleja koodi aktiveerumist saab nĂ€ha IDAs aknas VĂ€ljund rea jĂ€rgi Skipping wait ws2812.... NĂŒĂŒd ei ootata lipu lĂ€htestamist. , mis asub aadressil.

Koostoime emulaatoriga

Emuleerimine emuleerimise nimel ei kutsu tÔenÀoliselt esile rÔÔmu ja elevust. Palju huvitavam on, kui emulaator aitab teadlasel nÀha mÀlus andmeid vÔi luua voogude koostoimeid.

NĂ€itame, kuidas dĂŒnaamiliselt luua RTOS-ĂŒlesannete koostoime. Eelnevalt tuleks peatada koodi tĂ€itmine, kui see on kĂ€ivitatud. Kui minna funktsiooni bluetooth_task_entry LED kĂ€skluse töötlemise haru (aadress 0x080057B8), siis vĂ”ib nĂ€ha, et esmalt luuakse ja seejĂ€rel saadetakse sĂŒsteemi jĂ€rjekorda ledControlQueueHandle mingi sĂ”num.

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Peaksite seadma katkestuse, kui juurdepÀÀsete muutuja ledControlQueueHandle, mis asub aadressil 0x20000624 ja jÀtkama koodi tÀitmisega:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Tulemusena peatub esmalt aadressil 0x080057CA enne funktsiooni vĂ€ljakutset osMailAlloc, edasi — aadressil 0x08005806 enne funktsiooni vĂ€ljakutset osMailPut, seejĂ€rel mĂ”ne aja pĂ€rast — aadressil 0x08005BD4 (enne funktsiooni vĂ€ljakutset osMailGet), mis kuulub funktsioonile leds_task_entry (LED-ĂŒlesanne), st toimus ĂŒlesannete vahetus, ja nĂŒĂŒd on juhtimine saanud LED-ĂŒlesanne.

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Nii lihtsa meetodi abil saab paika panna, kuidas RTOS-ĂŒlesanded omavahel suhtlevad.

Muidugi vĂ”ib ĂŒlesannete vaheline suhtlemine reaalsuses olla keerulisem, kuid emulatori kasutamine muudab selle jĂ€lgimise vĂ€hem vaevarikkaks.

Siin vÔite vaadata vÀikest videot emulatori kÀivitamisest ja suhtlemisest IDA Pro-ga.

KĂ€ivitamine Radare2-ga

Ei saa mööda minna sellisest universaalsest tööriistast nagu Radare2.

Emulaatoriga ĂŒhendamiseks r2 abil nĂ€eb kĂ€sk vĂ€lja selline:

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

Praegu on saadaval kÀivitamine (dc) ja tÀitmise peatamine (Ctrl+C).

Kahjuks on r2-l hetkel probleeme riistvaralise gdb-serveri ja mÀlu kaardistamisega, mistÔttu ei tööta murdepunkid ja sammud (kÀsk ds). Loodame, et see probleem lahendatakse lÀhitulevikus.

KĂ€ivitamine Eclipse'ist

Üks viis emulaatori kasutamiseks on arendatava seadme tarkvara silumine. NĂ€itlikkuse huvides kasutame ka «Nohik» tarkvara. Tarkvara allikakoodid on saadaval siit.

IDE-na kasutame Eclipse'i komplektist System Workbench for STM32.

Et emulaatorisse laadida Eclipse'is koostatud tarkvara, tuleb lisada parameeter firmware=null emulaatori kÀivituskÀskemesse:

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

Debug-konfiguratsiooni seadistamine

Eclipse'is valige menĂŒĂŒ Run — Debug Configurations
 Avanevas aknas tuleb jaotises GDB Hardware Debugging lisada uus konfiguratsioon, seejĂ€rel tuleb vahekaardil «Main» mÀÀrata praegune projekt ja silumisprogramm:

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Vahekaardil «Debugger» tuleb mÀrkida GDB-kÀsk:
${openstm32_compiler_path}arm-none-eabi-gdb

Ja ka sisestada ĂŒhenduse parameetrid GDB-serveriga (host ja port):

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Vahe „Startup“ all tuleb mĂ€rkida jĂ€rgmised sĂ€tted:

  • mÀÀrake linnuke Laadi pilt (et laadimine toimuks emulaatorisse kokku pandud pildifailist);
  • mÀÀrake linnuke Laadi sĂŒmbolid;
  • lisage kĂ€ivitamiskĂ€sk: set $pc = *0x08000004 (mÀÀrake registri PC vÀÀrtuseks mĂ€lu aadressilt 0x08000004 — seal hoitakse aadressi ResetHandler’ile).

Pange tĂ€hele, kui te ei soovi Eclipse’ist pildifaili laadida, siis sĂ€tteid Laadi pilt ja KĂ€ivita kĂ€sk ei pea mÀÀrama.

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

PĂ€rast nupu Debug vajutamist saab töötada silumise reĆŸiimis:

  • koodi samm-sammuline tĂ€itmine
    Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat
  • kohtumistega suhtlemine
    Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

MĂ€rkus. Eclipse’is on, hmm
 mĂ”ned eripĂ€rad
 ja nendega tuleb elada. NĂ€iteks, kui silumisse sisenemisel kuvatakse teade „No source available for „0x0““, siis tĂ€itke kĂ€sk Step (F5)

Ninasarv sees kassi sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

KokkuvÔtte asemel

Kohaliku koodi emuleerimine on vĂ€ga huvitav tegevus. Seadmese arendajale avaneb vĂ”imalus siluda saadetisi ilma reaalse seadmeta. Uurijale - vĂ”imalus teha dĂŒnaamilist koodianalĂŒĂŒsi, mis ei ole alati vĂ”imalik isegi seadme olemasolul.

Soovime pakkuda spetsialistidele tööriista, mis oleks mugav, suhteliselt lihtne ja ei nÔuaks palju aega ja vaeva seadistamiseks ja kÀivitamiseks.

Jagage oma kogemustest riistvaraemulaatorite kasutamisel kommentaarides. Ootame arutelu ja vastame hea meelega kĂŒsimustele.

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. Logige sisse, palun.

Miks te kasutate emulaatorit?

  • arendan (teisendan) pĂŒsivara

  • uurin pĂŒsivara

  • kĂ€itan mĂ€nge (Dendi, Sega, PSP)

  • midagi muud (kirjutage kommentaaridesse)

HÀÀletas 7 kasutajat. 2 kasutajat ei hÀÀletanud.

Millist tarkvara te kasutate natiivkoodi emuleerimiseks?

  • QEMU

  • Unicorn engine

  • Proteus

  • midagi muud (kirjutage kommentaaridesse)

HÀÀletas 6 kasutajat. 2 kasutajat jÀtsid hÀÀletamata.

Mida sooviksite emulaatoris parandada?

  • sooviksin kiirus

  • sooviksin mugavust seadistamisel/kĂ€ivitamisel

  • sooviksin rohkem interaktsiooni vĂ”imalusi emulaatoriga (API, hook'id)

  • olen rahul kĂ”igega

  • midagi muud (kirjutage kommentaaridesse)

Olenenud 8 kasutajalt. 1 kasutaja hoidub.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster