Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Si pjesë e takimit 0x0A DC7831 DEF CON Nizhny Novgorod Më 16 shkurt, ne prezantuam një raport mbi parimet themelore të emulimit të kodit binar dhe zhvillimin tonë - një emulator i platformës harduerike Kopjoni.

Në këtë artikull do të përshkruajmë se si të ekzekutojmë firmware-in e pajisjes në emulator, të demonstrojmë ndërveprimin me korrigjuesin dhe të kryejmë një analizë të vogël dinamike të firmuerit.

parahistorinë

Shumë kohë më parë në një galaktikë shumë larg

Nja dy vjet më parë në laboratorin tonë kishte nevojë për të hetuar firmware-in e një pajisjeje. Firmware u kompresua dhe u shpaketua me një ngarkues. Ai e bëri këtë në një mënyrë shumë të ndërlikuar, duke zhvendosur të dhënat në memorie disa herë. Dhe vetë firmware më pas ndërveproi në mënyrë aktive me pajisjet periferike. Dhe e gjithë kjo në thelbin MIPS.

Për arsye objektive, emulatorët e disponueshëm nuk na përshtaten, por ne ende donim të ekzekutonim kodin. Pastaj vendosëm të bënim emulatorin tonë, i cili do të bënte minimumin dhe do të na lejonte të shpaketonim firmware-in kryesor. Ne e provuam dhe funksionoi. Menduam, çka nëse shtojmë pajisje periferike për të kryer gjithashtu firmware-in kryesor. Nuk lëndoi shumë - dhe funksionoi gjithashtu. Ne menduam përsëri dhe vendosëm të bëjmë një emulator të plotë.

Rezultati ishte një emulator i sistemeve kompjuterike Kopjoni.

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat
Pse Kopycat?

Ka një lojë fjalësh.

  1. Kopje (anglisht, emër [ˈkɒpɪkæt]) - imitues, imitues
  2. mace (Anglisht, emër [ˈkæt]) - mace, mace - kafsha e preferuar e një prej krijuesve të projektit
  3. Shkronja "K" është nga gjuha e programimit Kotlin

Kopjoni

Gjatë krijimit të emulatorit, u vendosën qëllime shumë specifike:

  • aftësia për të krijuar shpejt pajisje të reja periferike, module, bërthama procesori;
  • aftësia për të mbledhur një pajisje virtuale nga module të ndryshme;
  • aftësia për të ngarkuar çdo të dhënë binare (firmware) në kujtesën e një pajisjeje virtuale;
  • aftësia për të punuar me fotografi (fotografi të gjendjes së sistemit);
  • aftësia për të bashkëvepruar me emulatorin përmes korrigjuesit të integruar;
  • gjuhë e bukur moderne për zhvillim.

Si rezultat, Kotlin u zgjodh për zbatim, arkitektura e autobusit (kjo është kur modulet komunikojnë me njëri-tjetrin përmes autobusëve të të dhënave virtuale), JSON si formati i përshkrimit të pajisjes dhe GDB RSP si protokoll për ndërveprimin me korrigjuesin.

Zhvillimi ka vazhduar për pak më shumë se dy vjet dhe po vazhdon në mënyrë aktive. Gjatë kësaj kohe, u implementuan bërthamat e procesorit MIPS, x86, V850ES, ARM dhe PowerPC.

Projekti po rritet dhe është koha për ta prezantuar atë para publikut të gjerë. Ne do të bëjmë një përshkrim të detajuar të projektit më vonë, por tani për tani do të fokusohemi në përdorimin e Kopycat.

Për më të paduruarit, mund të shkarkohet një version promocional i emulatorit lidhje.

Rhino në emulator

Kujtojmë se më herët për konferencën SMARTRHINO-2018, u krijua një pajisje testuese “Rhinoceros” për të mësuar aftësitë e inxhinierisë së kundërt. Procesi i analizës statike të firmuerit është përshkruar në Ky artikull.

Tani le të përpiqemi të shtojmë "altoparlantë" dhe të ekzekutojmë firmware në emulator.

Ne do të duhet:
1) Java 1.8
2) Python dhe moduli jep për të përdorur Python brenda emulatorit. Ju mund të ndërtoni modulin WHL Jep për Windows shkarko këtu.

Për Windows:
1) com0com
2) PETTY

Për Linux:
1) socat

Ju mund të përdorni Eclipse, IDA Pro ose radare2 si klient GDB.

Si funksionon kjo gjë?

Për të kryer firmware në emulator, është e nevojshme të "montoni" një pajisje virtuale, e cila është një analog i një pajisjeje reale.

Pajisja e vërtetë ("rhino") mund të tregohet në diagramin e bllokut:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Emulatori ka një strukturë modulare dhe pajisja virtuale përfundimtare mund të përshkruhet në një skedar JSON.

Linja JSON 105

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

Kushtojini vëmendje parametrit Firmware seksion paramet është emri i një skedari që mund të ngarkohet në një pajisje virtuale si firmware.

Pajisja virtuale dhe ndërveprimi i saj me sistemin kryesor operativ mund të përfaqësohet nga diagrami i mëposhtëm:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Shembulli aktual i testit të emulatorit përfshin ndërveprimin me portat COM të sistemit operativ kryesor (debugoni UART dhe UART për modulin Bluetooth). Këto mund të jenë porte reale me të cilat janë lidhur pajisjet ose porte virtuale COM (për këtë ju nevojiten vetëm com0com/socat).

Aktualisht ekzistojnë dy mënyra kryesore për të bashkëvepruar me emulatorin nga jashtë:

  • Protokolli GDB RSP (në përputhje me rrethanat, mjetet që mbështesin këtë protokoll janë Eclipse / IDA / radare2);
  • Linja e komandës së emulatorit të brendshëm (Argparse ose Python).

Portet virtuale COM

Për të bashkëvepruar me UART të një pajisjeje virtuale në makinën lokale nëpërmjet një terminali, duhet të krijoni një palë portash virtuale COM të lidhura. Në rastin tonë, një portë përdoret nga emulatori, dhe e dyta përdoret nga një program terminal (PuTTY ose ekran):

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Duke përdorur com0com

Portet virtuale COM janë konfiguruar duke përdorur mjetin e konfigurimit nga kompleti com0com (versioni i konsolës - C: Skedarët e Programit (x86) com0comsetupс.exe, ose versioni GUI - C: Skedarët e programit (x86) com0comsetupg.exe):

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Kontrolloni kutitë aktivizoni tejkalimin e tamponit për të gjitha portet virtuale të krijuara, përndryshe emulatori do të presë një përgjigje nga porta COM.

Duke përdorur socat

Në sistemet UNIX, portet virtuale COM krijohen automatikisht nga emulatori duke përdorur mjetin socat; për ta bërë këtë, thjesht specifikoni prefiksin në emrin e portit kur filloni emulatorin socat:.

Ndërfaqja e brendshme e linjës së komandës (Argparse ose Python)

Meqenëse Kopycat është një aplikacion konsol, emulatori ofron dy opsione të ndërfaqes së linjës së komandës për të bashkëvepruar me objektet dhe variablat e tij: Argparse dhe Python.

Argparse është një CLI i integruar në Kopycat dhe është gjithmonë i disponueshëm për të gjithë.

Një CLI alternative është interpretuesi Python. Për ta përdorur atë, duhet të instaloni modulin Jep Python dhe të konfiguroni emulatorin për të punuar me Python (do të përdoret interpretuesi Python i instaluar në sistemin kryesor të përdoruesit).

Instalimi i modulit Python Jep

Në Linux Jep mund të instalohet përmes pip:

pip install jep

Për të instaluar Jep në Windows, fillimisht duhet të instaloni Windows SDK dhe Microsoft Visual Studio përkatës. Ne e kemi bërë pak më të lehtë për ju dhe WHL ndërton JEP për versionet aktuale të Python për Windows, kështu që moduli mund të instalohet nga skedari:

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

Për të kontrolluar instalimin e Jep, duhet të ekzekutoni në vijën e komandës:

python -c "import jep"

Mesazhi i mëposhtëm duhet të merret si përgjigje:

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

Në skedarin e grupit të emulatorit për sistemin tuaj (kopjoj.bat - për Windows, kopjues - për Linux) në listën e parametrave DEFAULT_JVM_OPTS shtoni një parametër shtesë Djava.library.path — duhet të përmbajë shtegun për në modulin e instaluar Jep.

Rezultati për Windows duhet të jetë një linjë si kjo:

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

Nisja e Kopycat

Emulatori është një aplikacion i konsolës JVM. Nisja kryhet përmes skriptit të linjës së komandës së sistemit operativ (sh/cmd).

Komanda për të ekzekutuar nën Windows:

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

Komanda për të ekzekutuar nën Linux duke përdorur programin 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 — Porta TCP që do të jetë e hapur për akses në serverin GDB;
  • -n rhino — emri i modulit kryesor të sistemit (pajisja e montuar);
  • -l user — emri i bibliotekës për të kërkuar modulin kryesor;
  • -y library — rruga për të kërkuar modulet e përfshira në pajisje;
  • firmwarerhino_pass.bin - rruga për në skedarin e firmuerit;
  • COM26 dhe COM28 janë porte virtuale COM.

Si rezultat, do të shfaqet një kërkesë Python > (Ose 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 >

Ndërveprimi me IDA Pro

Për të thjeshtuar testimin, ne përdorim firmuerin Rhino si skedarin burim për analizë në IDA në formë Skedari ELF (aty ruhen informacionet meta).

Ju gjithashtu mund të përdorni firmware-in kryesor pa informacion meta.

Pas nisjes së Kopycat në IDA Pro, në menunë Debugger shkoni te artikulli "Ndërro korrigjuesin…"Dhe zgjidhni"Korrigjuesi në distancë i GDB". Më pas, konfiguroni menunë e lidhjes: Korrigjues - Përpunoni opsionet…

Vendosni vlerat:

  • Aplikimi - çdo vlerë
  • Emri i hostit: 127.0.0.1 (ose adresa IP e makinës në distancë ku po funksionon Kopycat)
  • Porta: 23946

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Tani butoni i korrigjimit bëhet i disponueshëm (tasti F9):

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Klikoni atë për t'u lidhur me modulin e korrigjuesit në emulator. IDA kalon në modalitetin e korrigjimit, dritaret shtesë bëhen të disponueshme: informacione rreth regjistrave, rreth pirgut.

Tani mund të përdorim të gjitha tiparet standarde të korrigjuesit:

  • ekzekutimi hap pas hapi i udhëzimeve (Hapi brenda и Kaloni përpara - tastet F7 dhe F8, përkatësisht);
  • fillimi dhe ndalimi i ekzekutimit;
  • krijimi i pikave të ndërprerjes si për kodin ashtu edhe për të dhënat (çelësi F2).

Lidhja me një korrigjues nuk do të thotë ekzekutim i kodit të firmuerit. Pozicioni aktual i ekzekutimit duhet të jetë adresa 0x08006A74 - fillimi i funksionit Reset_Handler. Nëse lëvizni poshtë listimit, mund të shihni thirrjen e funksionit kryesor. Mund ta vendosni kursorin në këtë rresht (adresa 0x08006ABE) dhe kryeni operacionin Vraponi deri në kursorin (tasti F4).

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Më pas, mund të shtypni F7 për të hyrë në funksion kryesor.

Nëse ekzekutoni komandën Vazhdoni procesin (tasti F9), më pas dritarja "Ju lutemi prisni" do të shfaqet me një buton të vetëm Pezullon:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Kur shtypni Pezullon ekzekutimi i kodit të firmuerit është pezulluar dhe mund të vazhdohet nga e njëjta adresë në kodin ku është ndërprerë.

Nëse vazhdoni të ekzekutoni kodin, do të shihni linjat e mëposhtme në terminalet e lidhur me portet virtuale COM:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Prania e linjës "bypass shtetëror" tregon që moduli virtual Bluetooth ka kaluar në mënyrën e marrjes së të dhënave nga porta COM e përdoruesit.

Tani në terminalin Bluetooth (COM29 në foto) mund të futni komanda në përputhje me protokollin Rhino. Për shembull, komanda "MEOW" do të kthejë vargun "mur-mur" në terminalin Bluetooth:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Më imitoni jo plotësisht

Kur ndërtoni një emulator, mund të zgjidhni nivelin e detajeve/emulimit të një pajisjeje të caktuar. Për shembull, moduli Bluetooth mund të imitohet në mënyra të ndryshme:

  • pajisja është emuluar plotësisht me një grup të plotë komandash;
  • Komandat AT janë emuluar dhe rrjedha e të dhënave merret nga porti COM i sistemit kryesor;
  • pajisja virtuale ofron ridrejtim të plotë të të dhënave në pajisjen reale;
  • si cung i thjeshtë që kthen gjithmonë "OK".

Versioni aktual i emulatorit përdor qasjen e dytë - moduli virtual Bluetooth kryen konfigurimin, pas së cilës kalon në mënyrën e "proxying" të të dhënave nga porti COM i sistemit kryesor në portin UART të emulatorit.

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Le të shqyrtojmë mundësinë e instrumentimit të thjeshtë të kodit në rast se një pjesë e periferisë nuk zbatohet. Për shembull, nëse nuk është krijuar një kohëmatës përgjegjës për kontrollin e transferimit të të dhënave në DMA (kontrolli kryhet në funksionin ws2812b_waitndodhet në 0x08006840), atëherë firmware do të presë gjithmonë që flamuri të rivendoset i zënëndodhet në 0x200004C4e cila tregon zënien e linjës së të dhënave DMA:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Ne mund ta shmangim këtë situatë duke rivendosur manualisht flamurin i zënë menjëherë pas instalimit të tij. Në IDA Pro, ju mund të krijoni një funksion Python dhe ta thërrisni atë në një pikë ndërprerjeje, dhe të vendosni vetë pikën e ndërprerjes në kod pasi të shkruani vlerën 1 në flamur. i zënë.

Mbajtës i pikës së ndërprerjes

Së pari, le të krijojmë një funksion Python në IDA. Menu Skedari - Komanda e skriptit...

Shto një fragment të ri në listën në të majtë, jepi një emër (për shembull, BPT),
Në fushën e tekstit në të djathtë, futni kodin e funksionit:

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

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Pas kësaj shtypim run dhe mbyllni dritaren e skenarit.

Tani le të shkojmë te kodi në 0x0800688A, vendosni një pikë ndërprerjeje (tasti F2), modifikoni atë (menuja e kontekstit Redakto pikën e ndërprerjes...), mos harroni të vendosni llojin e skriptit në Python:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat
Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Nëse vlera aktuale e flamurit i zënë është e barabartë me 1, atëherë duhet të ekzekutoni funksionin skip_dma në rreshtin e skenarit:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Nëse përdorni firmuerin për ekzekutim, atëherë aktivizimi i kodit të mbajtësit të pikës së ndërprerjes mund të shihet në dritaren IDA prodhim sipas rreshtit Skipping wait ws2812.... Tani firmware nuk do të presë që flamuri të rivendoset i zënë.

Ndërveprimi me emulatorin

Emulimi për hir të emulimit nuk ka gjasa të shkaktojë kënaqësi dhe gëzim. Është shumë më interesante nëse emulatori ndihmon studiuesin të shohë të dhënat në memorie ose të vendosë ndërveprimin e fijeve.

Ne do t'ju tregojmë se si të krijoni në mënyrë dinamike ndërveprimin midis detyrave RTOS. Së pari duhet të ndaloni ekzekutimin e kodit nëse ai po funksionon. Nëse shkoni te funksioni bluetooth_detyra_hyrja në degën e përpunimit të komandës "LED" (adresa 0x080057B8), atëherë mund të shihni se çfarë krijohet fillimisht dhe më pas dërgohet në radhën e sistemit ledControlQueueHandle ndonjë mesazh.

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Ju duhet të vendosni një pikë ndërprerjeje për të hyrë në ndryshore ledControlQueueHandlendodhet në 0x20000624 dhe vazhdoni të ekzekutoni kodin:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Si rezultat, ndalesa së pari do të ndodhë në adresë 0x080057CA përpara se të telefononi funksionin osMailAlloc, pastaj në adresën 0x08005806 përpara se të telefononi funksionin osMailPut, pastaj pas një kohe - në adresë 0x08005BD4 (para se të telefononi funksionin osMailGet), që i përket funksionit leds_detyrë_hyrja (LED-detyrë), domethënë, detyrat u ndërruan, dhe tani detyra LED mori kontrollin.

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Në këtë mënyrë të thjeshtë mund të përcaktoni se si detyrat RTOS ndërveprojnë me njëra-tjetrën.

Sigurisht, në realitet, ndërveprimi i detyrave mund të jetë më i ndërlikuar, por duke përdorur një emulator, gjurmimi i këtij ndërveprimi bëhet më pak i mundimshëm.

Këtu Mund të shikoni një video të shkurtër të nisjes dhe bashkëveprimit të emulatorit me IDA Pro.

Nisni me Radare2

Ju nuk mund të injoroni një mjet të tillë universal si Radare2.

Për t'u lidhur me emulatorin duke përdorur r2, komanda do të duket si kjo:

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

Nisja në dispozicion tani (dc) dhe ndaloni ekzekutimin (Ctrl+C).

Fatkeqësisht, për momentin, r2 ka probleme kur punon me serverin e harduerit gdb dhe paraqitjen e kujtesës; për shkak të kësaj, pikat e ndërprerjes dhe hapat nuk funksionojnë (komandë ds). Shpresojmë që kjo të rregullohet së shpejti.

Vrapimi me Eclipse

Një nga opsionet për përdorimin e emulatorit është korrigjimi i firmware-it të pajisjes që po zhvillohet. Për qartësi, ne do të përdorim gjithashtu firmware-in Rhino. Mund të shkarkoni burimet e firmuerit prandaj.

Ne do të përdorim Eclipse nga grupi si një IDE Tabela e punës e sistemit për STM32.

Në mënyrë që emulatori të ngarkojë firmware të përpiluar drejtpërdrejt në Eclipse, duhet të shtoni parametrin firmware=null në komandën e nisjes së emulatorit:

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

Vendosja e konfigurimit të korrigjimit

Në Eclipse, zgjidhni menunë Ekzekuto - Korrigjimi i konfigurimeve... Në dritaren që hapet, në seksionin Korrigjimi i harduerit GDB ju duhet të shtoni një konfigurim të ri, pastaj në skedën "Kryesore" specifikoni projektin aktual dhe aplikacionin për korrigjimin:

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Në skedën "Debugger" ju duhet të specifikoni komandën GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

Dhe gjithashtu futni parametrat për t'u lidhur me serverin GDB (host dhe port):

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Në skedën "Fillimi", duhet të specifikoni parametrat e mëposhtëm:

  • aktivizo kutinë e zgjedhjes Ngarko imazhin (në mënyrë që imazhi i firmuerit të montuar të ngarkohet në emulator);
  • aktivizo kutinë e zgjedhjes Simbolet e ngarkesës;
  • shtoni komandën e nisjes: set $pc = *0x08000004 (vendosni regjistrin e PC në vlerën nga memoria në adresë 0x08000004 - adresa ruhet atje ResetHandler).

Обратите внимание, nëse nuk dëshironi të shkarkoni skedarin e firmuerit nga Eclipse, atëherë opsionet Ngarko imazhin и Ekzekutoni komandat nuk ka nevojë të tregohet.

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Pasi të klikoni Debug, mund të punoni në modalitetin e korrigjimit:

  • ekzekutimi hap pas hapi i kodit
    Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat
  • duke ndërvepruar me pikat e ndërprerjes
    Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Shënim. Eklipsi ka, hmm... disa të çuditshme... dhe ju duhet të jetoni me to. Për shembull, nëse kur filloni korrigjuesin shfaqet mesazhi "Nuk ka burim të disponueshëm për "0x0", atëherë ekzekutoni komandën Step (F5)

Rhinoceros brenda një mace - ekzekutoni firmuerin në emulatorin Kopycat

Në vend të një përfundimi

Emulimi i kodit vendas është një gjë shumë interesante. Për një zhvillues pajisjesh, bëhet e mundur të korrigjoni firmware-in pa një pajisje të vërtetë. Për një studiues, është një mundësi për të kryer analiza dinamike të kodit, gjë që nuk është gjithmonë e mundur edhe me një pajisje.

Ne duam t'u ofrojmë specialistëve një mjet që është i përshtatshëm, mesatarisht i thjeshtë dhe që nuk kërkon shumë përpjekje dhe kohë për t'u vendosur dhe përdorur.

Shkruani në komente për përvojën tuaj duke përdorur emulatorët e harduerit. Ju ftojmë të diskutoni dhe do të jemi të lumtur t'u përgjigjemi pyetjeve.

Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. Hyni, te lutem

Për çfarë po e përdorni emulatorin?

  • Unë zhvilloj (debug) firmware

  • Unë jam duke kërkuar firmware

  • Unë nis lojërat (Dendi, Sega, PSP)

  • diçka tjetër (shkruani në komente)

7 përdorues votuan. 2 përdorues abstenuan.

Çfarë softueri përdorni për të imituar kodin vendas?

  • QEMU

  • Motori Unicorn

  • Proteus

  • diçka tjetër (shkruani në komente)

6 përdorues votuan. 2 përdorues abstenuan.

Çfarë dëshironi të përmirësoni në emulatorin që po përdorni?

  • Dua shpejtësi

  • Unë dua lehtësinë e konfigurimit/hapjes

  • Dua më shumë opsione për të bashkëvepruar me emulatorin (API, grepa)

  • Unë jam i kënaqur me gjithçka

  • diçka tjetër (shkruani në komente)

8 përdorues kanë votuar. 1 përdorues abstenoi.

Burimi: www.habr.com

Shto një koment