Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Kohtumise raames 0x0A DC7831 DEF CON Nizhni Novgorod 16. veebruaril esitlesime ettekannet binaarkoodi emulatsiooni pÔhialustest ja meie arengust - riistvaraplatvormide emulaatorist. Kopycat.

Artiklis kirjeldame seadme pĂŒsivara kĂ€ivitamist emulaatoris, demonstreerime suhtlemist siluri ja teeme vĂ€ikese dĂŒnaamilise analĂŒĂŒsi pĂŒsivara ĂŒle.

Eellugu

Kaua aega tagasi kaugel-galaktikas

MĂ”ni aasta tagasi oli meie laboris vajadus uurida seadme pĂŒsivara. PĂŒsivara oli tihendatud, lahti pakitud bootloader'iga. Ta tegi seda ĂŒsna keerulisel moel, paar korda andmeid mĂ€lus ĂŒmber paigutades. Ja ise pĂŒsivara suhtles aktiivselt perifeeriaga. Ja kĂ”ik see MIPSi tuumal.

KÀesolevad emulaatorid ei rahuldanud meid objektiivsetel pÔhjustel, kuid soovisime ikkagi koodi kÀivitada. Siis otsustasime teha oma emulaatori, mis teeks minimaalselt ja vÔimaldaks pÔhivara lahti pakkida. Proovisime - see töötas. MÔtlesime, mis siis, kui lisada perifeeria, et ka pÔhivara töötlema hakata. See ei olnud eriti keeruline - ja ka see töötas. Taaskord mÔtlesime ja otsustasime teha tÀisfunktsionaalse emulaatori.

Tulemusena saime arvutisĂŒsteemide emulaatori Kopycat.

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat
Miks Kopycat?

See on sÔnamÀng.

  1. copycat (inglise, subst. [ˈkɒpÉȘkĂŠt]) - imiteerija, jĂ€ljendaja
  2. cat (inglise, subst. [ˈkĂŠt]) - kass, kiisu - ĂŒks projekti looja lemmiklooma nimi
  3. TĂ€ht „K“ on saadud programmeerimiskeelest Kotlin

Kopycat

Emulaatori loomisel seati tÀiesti konkreetsed eesmÀrgid:

  • vĂ”imalus ĂŒsna kiiresti luua uus perifeeria, moodul, protsessorituum;
  • vĂ”imalus kokku panna virtuaalne seade erinevatest moodulitest;
  • vĂ”imalus laadida virtuaalse seadme mĂ€llu kĂ”iki binaarseid andmeid (pĂŒsivara);
  • vĂ”imalus töötada snapshootidega (sĂŒsteemi olekute pildid);
  • vĂ”imalus suhelda emulaatoriga lĂ€bi sisseehitatud siluri;
  • mugav ja kaasaegne programmeerimiskeel arendamiseks.

LĂ”puks valiti elluviimiseks Kotlin, bussiarhitektuur (see tĂ€hendab, et moodulid ĂŒhendatakse omavahel virtuaalsete andmebusside kaudu), JSON - seadme kirjeldamise formaadina, ja GDB RSP - siluri suhtlusprotokollina.

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

Projekt kasvab ja on aeg tutvustada seda laiemale publikule. Projekti ĂŒksikasjalik kirjeldus tuleb hiljem, aga praegu keskendume Kopycat'i kasutamisele.

KĂ”ige kannatamatutele — emulaatori promoversioon on saadaval allalaadimiseks lingil.

Ninasarvik emulaatoris

Kasutame meelde tuletamiseks, et varem loodi konverentsiks SMARTRHINO-2018 testseade "Ninasarvik" reversseerituse oskuste Ă”ppimiseks. Juhendi staatilise analĂŒĂŒsi jaoks kirjeldati. selles artiklis.

KĂ€esolevaga proovime aga lisada "dĂŒnaamikat" ja kĂ€ivitame pĂŒsivara emulaatoris.

Meile on vajalikud:
1) Java 1.8
2) Python ja moodul Jep Python'i kasutamiseks emulaatoris. WHL-ehitatud Jep mooduli versioon Windowsile on saadaval. 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?

PĂŒsivara emulaatoris tĂ€itmiseks on vajalik "kokku panna" virtuaalne seade, mis esindab reaalset seadet.

Reaalset seadet ("ninasarvik") saab nÀidata struktuuriskeemis:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

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

JSON 105 real

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

Pange tĂ€hele parameetrit firmware jaotises params — see on faili nimi, mille saab laadida virtuaalsesse seadmesse pĂŒsivara vormis.

Virtuaalne seade ja selle koostoime pÔhiosakonnaga on esitatud jÀrgmisel skeemil:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Praegune emulaatori testimise eksemplar eeldab koostoimet pĂ”hiosakonna COM-portidega (silumis UART ja UART Bluetooth-mooduli jaoks). Need vĂ”ivad olla reaalsed portid, kuhu seadmed on ĂŒhendatud, vĂ”i siis virtuaalsed COM-portid (just selleks on vajalik com0com / socat).

Praegu on emulaatoriga vÀlise koostoime jaoks kaks peamist viisi:

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

Virtuaalsed COM-portid

Kuna virtuaalse seadme UART-iga koostoime loomiseks kohaliku masina terminaliga on vajalik luua seotud virtuaalsete COM-portide paar. Meie juhul kasutab ĂŒhte porti emulaator ja teist — terminali programm (PuTTY vĂ”i screen):

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

com0com kasutamine

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

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Tuleb mÀrkida linnukesed enable buffer overrun kÔikide loodud virtuaalsete portide jaoks, vastasel juhul ootab emulaator vastust COM-portidelt.

socat kasutamine

UNIX-sĂŒsteemides luuakse virtuaalsed COM-portid emulaatori poolt automaatselt socat utiliidi abil, selleks piisab emulaatori kĂ€ivitamisel portide nimes prefiksi mÀÀramisest socat:.

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

Kuna Kopycat on konsooli rakendus, pakub emulaator oma objektide ja muutujatega koostoime loomiseks kahte kÀsurea liidese vÔimalust: Argparse ja Python.

Argparse on Kopycati sisse ehitatud CLI, mis on alati ja kÔigile kergesti ligipÀÀsetav.

Alternatiivne CLI on Python'i tÔlk. Selle kasutamiseks tuleb installida Python'i moodul Jep ja seadistada emulaator töötama Pythoniga (kasutatakse kasutaja pÔhiosakonnas installitud Python'i tÔlget).

Python'i mooduli Jep installimine

Linuxis saab Jep'i installida pip'i kaudu:

pip install jep

Jepi installimiseks Windowsis tuleb eelnevalt installida Windows SDK ja vastav Microsoft Visual Studio. Oleme teie ĂŒlesande pisut lihtsustanud ja teinud WHL-pakkumised JEP aktuaalsete Python versioonide jaoks Windowsis, seega saab mooduli installida failist:

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

Jep'i installatsiooni kontrollimiseks peate kÀivitama kÀsureal:

python -c "import jep"

Vastuseks peaks tulema sÔnum:

ImportError: Jep ei ole iseseisvas Python'is toetatud, see peab olema Java'sse sisse embeditud.

Teie sĂŒsteemi emulaatori kĂ€sklusfailis (kopycat.bat — Windowsi jaoks, kopycat — Linuxi jaoks) lisage parameetrite loendisse DEFAULT_JVM_OPTS lisaks veel ĂŒks parameeter Djava.library.path — see peab sisaldama teed installitud mooduli Jep'i juurde.

Seega peaks Windowsi jaoks saama 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 konsoolipĂ”hine JVM rakendus. KĂ€ivitamine toimub operatsioonisĂŒsteemi kĂ€surea skripti kaudu (sh/cmd).

KÀivitamis kÀsk Windowsis:

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

KÀivitamis kÀsk Linuxis, 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-serveri juurde pÀÀsemiseks;
  • -n rhino — pĂ”hikomplekti seadme nimi;
  • -l user — pĂ”hikomplekti otsingu raamatukogu nimi;
  • -y library — seadme moodulite otsingu tee;
  • firmwarerhino_pass.bin — muudete faili tee;
  • COM26 ja COM28 — virtuaalsed COM-pordid.

Tulemuseks on vÀljund: Python > (vÔi Argparse >):

18:07:59 INFO [eFactoryBuilder.create]: Moodul top loodi edukalt kui top
18:07:59 INFO [Module.initializeAndRes]: Seadistatakse core 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]: Tracerit ei leitud top'i...
18:07:59 INFO [Module.initializeAndRes]: Portide ja busside algatamine...
18:07:59 WARN [Module.initializePortsA]: TÄHELEPANU: MĂ”nedel portidel on hoiatuseid, kasutage printModulesPortsWarnings neid nĂ€ha...
18:07:59 FINE [ARMv6CPU.reset]: Sisendpunkti aadress on seatud 08006A75
18:07:59 INFO [Module.initializeAndRes]: Moodul top on edukalt algatatud ja lÀhtestatud kui top rakk!
18:07:59 INFO [Kopycat.open]: Alustatakse plaadi top[rhino] virtualiseerimist arm[ARMv6Core]
18:07:59 INFO [GDBServer.debuggerModule]: Uus debugeerija moodul top.u1_stm32.dbg on seadistatud GDB_SERVER(port=23946,alive=true)
Python >

Koostoime IDA Pro-ga

AnalĂŒĂŒsi lĂ€htefailina IDAs kasutame testimise lihtsustamiseks «Rhinole» mĂ”eldud firmware'i ELF-failina (seal on salvestatud metaainfo).

Samuti vÔite kasutada pÔhifirmware'i ilma metaandmeteta.

PĂ€rast Kopycat'i kĂ€ivitamist IDA Pro's liigume Debugger menĂŒĂŒs punkti «Switch debugger » ja valime «Kaug-GDB debugger«. JĂ€tkame ĂŒhenduse seadistamist: menĂŒĂŒ Debugeerija — Protsessi valikud


Seame vÀÀrtused:

  • Rakendus — ĂŒkskĂ”ik milline vÀÀrtus
  • Hostname: 127.0.0.1 (vĂ”i kaugmasina IP-aadress, kus Kopycat on kĂ€imas)
  • Port: 23946

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

NĂŒĂŒd on kĂ€ivitamise nupp (klahv F9) saadaval:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Klikkame sellele — ĂŒhendame debugeerimise mooduliga emulaatoris. IDA lĂ€heb debugeerimise reĆŸiimi, avanevad lisakraanid: registerteave, stek.

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

  • juhuslikult teostada juhiseid (Step into ja Step over — klahvid F7 ja F8, vastavalt);
  • kĂ€ivitamine ja tĂ€itmise peatamine;
  • looge peatuspunkte nii koodi kui ka andmete jaoks (klahv F2).

Debugeerijaga ĂŒhendamine ei tĂ€henda, et koodiraamat kĂ€ivitub. TĂ€itmiseks peab hetke aadress olema 0x08006A74 — funktsiooni algus Reset_Handler. Kui kerida loetelu alla, siis on nĂ€ha funktsiooni kutset main. Kursor vĂ”ib sellel real seista (aadress 0x08006ABE) ja teostada toimingu Run until cursor (klahv F4).

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

JÀtkamiseks vÔib vajutada F7, et siseneda funktsiooni main.

Kui tÀita kÀsk Continue process (klahv F9), siis ilmub aken "Palun oota" ainulaadse nupuga Suspend:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Kuna vajutatakse, Suspend koodi tÀitmine peatub ja seda saab jÀtkata samalt aadressilt koodis, kus see katkestati.

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

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Rida "state bypass" nĂ€itab, et virtuaalne Bluetooth-moodul on lĂ€inud kasutaja COM-portide andmete vastuvĂ”tmise reĆŸiimi.

NĂŒĂŒd saab Bluetooth-terminalis (pildil — COM29) sisestada kĂ€ske vastavalt "NorsupĂ€tsi" protokollile. NĂ€iteks kĂ€sule "MEOW" tagastatakse Bluetooth-terminalis rida "mur-mur":

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Emuleeri mind mitte tÀielikult

Emulaatori loomisel saab valida seadme detailituse/emuletuse taset. NĂ€iteks Bluetooth-moodulit saab emuleerida erinevalt:

  • emuleeritakse seadet tĂ€ielikult koos tĂ€ieliku kĂ€su kogumiga;
  • emuleeritakse AT-kĂ€ske, samas kui andmevoog vĂ”etakse peamise sĂŒsteemi COM-portist;
  • virtuaalne seade tagab tĂ€ieliku andmete edastamise reaalsele seadmele;
  • lihtsa stubina, mis alati tagastab "OK".

KĂ€esolevas emulaatori versioonis kasutatakse teist lĂ€henemist — virtuaalne Bluetooth-modul konfigureerib, seejĂ€rel lĂ€heb andmete "proximeerimise" reĆŸiimi COM-pordist pĂ”h sĂŒsteemist emulaatori UART-porda.

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Vaatame vĂ”imalust lihtsaks koodi instrumenteerimiseks, juhul kui mĂ”ni perifeeria osa ei ole teostatud. NĂ€iteks, kui taimerit, mis vastutab andmete edastamise ĂŒle DMA, ei ole loodud (kontrollimine toimub funktsioonis ws2812b_wait, mis asub aadressil 0x08006840), siis jÀÀb firmware alati ootama lipu lĂ€htestamist busy, mis asub aadressil 0x200004C4, mis nĂ€itab DMA andmeliini hĂ”ivatust:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Saame selle olukorra vÀltida, "manuaalselt" lipu lÀhtestamisega busy koheselt pÀrast selle seadistamist. IDA Pro-s saab luua Python-funktsiooni ja seda kutsuda breakpoint'is, samas kui breakpoint tuleb paigutada koodi pÀrast vÀÀrtuse 1 kirjutamist lipule busy.

Breakpoint'i töötleja

Esiteks loome Python-funktsiooni IDA-s. MenĂŒĂŒ File — Script command


Lisame uue lÔigu vasakpoolse nimekirja, anname sellele nime (nÀiteks, BPT),
ja parempoolsesse tekstivÀljadese sisestame funktsiooni koodi:

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

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

PĂ€rast seda vajutame KĂ€ita ja sulgeme skripti akna.

NĂŒĂŒd liikume aadressile 0x0800688A, paigaldame breakpoint'i (klahv F2), redigeerime seda (konteksimenĂŒĂŒ Edit breakpoint
), Ă€rge unustage seada skripti tĂŒĂŒpi – Python:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat
Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Kui lipu praegune vÀÀrtus busy on 1, siis tuleb kutsuda funktsioon skip_dma skripti ridas:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Kui kĂ€ivitada firmware'i tĂ€itmine, siis saab breakpoint'i töötleja koodi aktiveerimist nĂ€ha IDA-s aknas VĂ€ljund rea jĂ€rgi Skipping wait ws2812.... NĂŒĂŒd ei ootata lipu lĂ€htestamist busy.

Suhtlemine emulaatoriga

Emuleerimine emuleerimise nimel tÔenÀoliselt ei tekita rÔÔmu. Tunduvalt huvitavam on, kui emulaator aitab uurijal vaadata mÀlu andmeid vÔi luua voogude vahel suhtlemist.

KĂ€tkeme, kuidas dĂŒnaamiliselt seada RTOS-i ĂŒlesannete vahelisi suhteid. Eelnevalt tuleks koodi tĂ€itmine peatada, kui see on kĂ€ivitunud. Kui minna funktsiooni bluetooth_task_entry LED kĂ€sitlemisvĂ”sasse (aadress 0x080057B8), siis vĂ”ib nĂ€ha, et esmalt luuakse ja seejĂ€rel saadetakse sĂŒsteemi jĂ€rjekorda ledControlQueueHandle mingi sĂ”num.

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Tuleb paigaldada breakpoint muutuja seuradele ja jÀtkata koodi tÀitmist: ledControlQueueHandle, mis asub aadressil 0x20000624 ja jÀtkata koodi tÀitmist:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Seega toimub esmalt peatamine aadressil 0x080057CA enne funktsiooni kutsumist osMailAlloc, seejĂ€rel aadressil 0x08005806 enne funktsiooni kutsumist osMailPut, hiljem mĂ”ne aja pĂ€rast aadressil 0x08005BD4 (enne funktsiooni kutsumist osMailGet), mis kuulub funktsioonile leds_task_entry (LED-ĂŒlesanne), st toimus ĂŒlesannete vahetus ja nĂŒĂŒd sai juhtimise LED-ĂŒlesanne.

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Nii lihtsal viisil saab mÀÀrata, kuidas RTOS-i ĂŒlesanded ĂŒksteisega suhtlevad.

TĂ”enĂ€oliselt on ĂŒlesannete vaheline suhtlemine keerulisem, kuid simulaatori abil on selle jĂ€lgimine vĂ€hem koormav.

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

KĂ€ivitamine Radare2 abil

Ei saa ĂŒle vaadata sellist universaalset tööriista nagu Radare2.

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

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

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

Kahjuks on r2-ga hetkel probleeme, kui töötada riistvara gdb-serveriga ja mÀlu kaardistamisega, seetÔttu ei tööta peatumise punktid ja Step'id (kÀsk ds). Loodame, et see parandatakse lÀhitulevikus.

KĂ€ivitamine Eclipse'iga

Üks vĂ”imalus simulaatori kasutamiseks on arendatava seadme pĂŒsivara silumine. Selguse huvides kasutame ka pĂŒsivara 'Norsut'. PĂŒsivara lĂ€htekoodi saab alla laadida siit.

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

Kuna kĂ€ivitamiseks peab simulaatorisse laadima Eclipse'is otse kompileeritud pĂŒsivara, on vajalik lisada parameeter firmware=null simulaatori kĂ€ivitamiskĂ€sule:

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

Silumisprotsessi seadistamine

Eclipse'is valime menĂŒĂŒst Run — Debug Configurations
 Avanevas aknas jaotises GDB Hardware Debugging on vajalik lisada uus konfigureerimine, mille jĂ€rel vahekaardil 'Main' tuleb mÀÀrata praegune projekt ja silumisrakendus:

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Vahekaardil 'Debugger' on vajalik mÀÀrata GDB-kÀsk:
${openstm32_compiler_path}arm-none-eabi-gdb

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

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

Vahekaardil 'Startup' on vajalik mÀÀrata jÀrgmised parameetrid:

  • mĂ€rkida linnuke Load image (et simulaatorisse laaditaks kokku pandud pĂŒsivara kuva);
  • mĂ€rkida linnuke Load symbols;
  • lisada kĂ€ivitamiskĂ€sk: set $pc = *0x08000004 (mÀÀrata PC registrisse vÀÀrtus mĂ€lust aadressilt 0x08000004 — seal on salvestatud aadress ResetHandler’i).

Pange tĂ€hele, kui te ei soovi laadida pĂŒsivara faili Eclipse’ist, siis parameetreid Load image ja KĂ€ivita kĂ€sud mĂ€rkida ei ole vaja.

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

PĂ€rast Debug nuppu vajutamist saab töötada silumine reĆŸiimis:

  • koodi samm-sammuline tĂ€itmine
    Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat
  • koostöö peatuspunktega
    Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

MĂ€rkus. Eclipse’is on, hmm
 mĂ”ned eripĂ€rad
 ning nendega tuleb ellu jÀÀda. NĂ€iteks, kui silumi kĂ€ivitamisel ilmub sĂ”num „No source available for „0x0″”, siis tĂ€itke kĂ€sk Step (F5)

Narkootikum kassipoja sees — kĂ€ivitame pĂŒsivara emulaatoris Kopycat

LÔpetuseks

Natiivse koodi emuleerimine on vĂ€ga huvitav asi. Seadmete arendajale annab see vĂ”imaluse siluda pĂŒsivara ilma reaalse seadmeta. Uurijale — vĂ”imalus lĂ€bi viia koodi dĂŒnaamiline analĂŒĂŒs, mis ei ole alati vĂ”imalik isegi seadmega.

Me tahame pakkuda spetsialistidele tööriista, mis oleks mugav, piisavalt lihtne ja ei nÔuaks palju jÔudu ja aega seadistamiseks ja kÀivitamiseks.

Kirjutage kommentaarides oma kogemustest riistvara emulaatorite kasutamisel. Ootame arutelu ja vastame rÔÔmuga kĂŒsimustele.

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

Milleks kasutate emulaatorit?

  • arendan (silun) pĂŒsivara

  • uurin pĂŒsivara

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

  • midagi muud (kirjutage kommentaaridesse)

HÀÀletas 7 kasutajat. 2 kasutajat jÀid erapooletuks.

Millist tarkvara kasutate natiivse koodi emuleerimiseks?

  • QEMU

  • Unicorn engine

  • Proteus

  • midagi muud (kirjutage kommentaaridesse)

HÀÀletanud 6 kasutajat. 2 kasutajat hoidusid.

Mida sooviksite parandada kasutatavas emulaatoris?

  • soovin kiirus

  • soovin seadistamise/kĂ€ivitamise mugavust

  • soovin rohkem vĂ”imalusi emulaatoriga suhtlemiseks (API, hookid)

  • olen rahul kĂ”igega

  • midagi muud (kirjutage kommentaaridesse)

HÀÀletas 8 kasutajat. 1 kasutaja jÀi erapooletuks.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster