Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Under mötet 0x0A DC7831 DEF CON Nizhny Novgorod Den 16 februari presenterade vi en förelĂ€sning om grundlĂ€ggande principer för emulering av binĂ€rkod och vĂ„r egen utveckling – emulatorn för hĂ„rdvaruplattformar Kopycat.

I artikeln kommer vi att ge en beskrivning av hur man kör en enhets firmware i emulatorn, demonstrera interaktion med debuggern och utföra en liten dynamisk analys av firmwaren.

Bakgrund

En gÄng för lÀnge sedan i en galax lÄngt, lÄngt borta

För nÄgra Är sedan uppstod det ett behov i vÄrt laboratorium att undersöka firmware för en enhet. Firmwaren var komprimerad och packades upp av bootloadern. Den gjorde detta pÄ ett ganska komplicerat sÀtt, genom att flera gÄnger flytta data i minnet. Och sjÀlva firmwaren interagerade aktivt med periferin. Och allt detta pÄ en MIPS-kÀrna.

Existerande emulatorer passade oss av objektiva skĂ€l inte, och vi ville verkligen starta koden. Vi beslöt dĂ„ att göra vĂ„r egen emulator som skulle göra minimi och lĂ„ta oss packa upp huvudfirmwaren. Vi provade – det lyckades. Vi tĂ€nkte, vad hĂ€nder om vi lĂ€gger till periferin för att Ă€ven kunna köra huvudfirmwaren. Det var inte sĂ€rskilt smĂ€rtsamt – och det lyckades ocksĂ„. Vi tĂ€nkte igen och bestĂ€mde oss för att göra en fullfjĂ€drad emulator.

Resultatet blev en emulator för datorsystem Kopycat.

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn
Varför Kopycat?

Det Àr ett ordspel.

  1. copycat (eng., subst. [ˈkɒpÉȘkĂŠt]) – imitatör, efterapare
  2. cat (eng., subst. [ˈkĂŠt]) – katt, katten – det Ă€lskade djuret hos en av projektets skapare
  3. Bokstaven 'K' kommer frÄn programmeringssprÄket Kotlin

Kopycat

Vid skapandet av emulatorn satte vi upp helt bestÀmda mÄl:

  • möjligheten att ganska snabbt skapa en ny perifer enhet, modul, processor-kĂ€rna;
  • möjligheten att sammanstĂ€lla en virtuell enhet av olika moduler;
  • möjligheten att ladda vilket binĂ€rt data (firmware) som helst i minnet pĂ„ den virtuella enheten;
  • möjligheten att arbeta med snapshots (systemtillstĂ„ndsbilder);
  • möjligheten att interagera med emulatorn via den inbyggda debuggern;
  • ett trevligt modernt sprĂ„k för utveckling.

Resultatet blev att Kotlin valdes för genomförandet, bus-arkitektur (dĂ€r moduler kopplas samman via virtuella databusser), JSON – som format för beskrivning av enheten, och GDB RSP – som protokoll för interaktion med debuggern.

Utvecklingen har pÄgÄtt i drygt tvÄ Är och fortsÀtter aktivt. Under denna tid har CPU-kÀrnor för MIPS, x86, V850ES, ARM och PowerPC implementerats.

Projektet vÀxer, och det Àr dags att presentera det för allmÀnheten. En detaljbeskrivning av projektet kommer senare, men nu fokuserar vi pÄ att anvÀnda Kopycat.

För de mest otĂ„liga — en provversion av emulatorn kan laddas ner via lĂ€nken.

Noshörning i emulatorn

Kom ihÄg att det tidigare skapades en testenhet "Noshörning" för konferensen SMARTRHINO-2018 för att lÀra sig fÀrdigheter inom reverse engineering. Processen för statisk analys av firmware beskrevs i denna artikel.

Nu ska vi försöka lÀgga till "dynamik" och köra firmware i emulatorn.

Vi behöver:
1) Java 1.8
2) Python och modulen Jep för att anvÀnda Python inom emulatorn. WHL-paketet för Jep-modulen för Windows kan laddas ner hÀr.

För Windows:
1) com0com
2) PuTTY

För Linux:
1) socat

Som GDB-klient kan Eclipse, IDA Pro eller radare2 anvÀndas.

Hur fungerar det?

För att kunna utföra firmware i emulatorn mÄste en "virtuell enhet" byggas, som Àr en motsvarighet till den verkliga enheten.

Den verkliga enheten ("noshörning") kan visas i en systemöversikt:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Emulatorn har en modulÀr struktur och den slutgiltiga virtuella enheten kan beskrivas i en JSON-fil.

JSON pÄ 105 rader

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

Observera parameter firmware i avsnittet params — detta Ă€r namnet pĂ„ filen som kan laddas upp till den virtuella enheten som firmware.

Den virtuella enheten och dess interaktion med det primÀra operativsystemet kan representeras av följande schema:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Den nuvarande testinstansen av emulatorn förutsÀtter interaktion med COM-portarna i det primÀra operativsystemet (debug UART och UART för Bluetooth-modulen). Det kan vara riktiga portar som Àr anslutna till enheter eller virtuella COM-portar (för detta behövs just com0com / socat).

För att interagera med emulatorn externt finns det för nÀrvarande tvÄ huvudsakliga metoder:

  • GDB RSP-protokollet (verktyg som stöder detta protokoll — Eclipse / IDA / radare2);
  • den interna kommandoraden för emulatorn (Argparse eller Python).

virtuella COM-portar

För att interagera med UART pÄ den virtuella enheten pÄ den lokala maskinen via en terminal mÄste du skapa ett par ihopkopplade virtuella COM-portar. I vÄrt fall anvÀnds en port av emulatorn och den andra av terminalprogrammet (PuTTY eller screen):

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

AnvÀndning av com0com

De virtuella COM-portarna konfigureras med setup-verktyget frĂ„n com0com-paketet (kommandoradsversion — C:Program Files (x86)com0comsetupс.exe, eller GUI-version — C:Program Files (x86)com0comsetupg.exe):

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Du bör aktivera alternativen enable buffer overrun för alla skapade virtuella portar, annars kommer emulatorn att vÀnta pÄ svar frÄn COM-porten.

AnvÀndning av socat

I UNIX-system skapas virtuella COM-portar automatiskt av emulatorn med hjÀlp av socat-verktyget, det Àr tillrÀckligt att ange prefixet socat:.

Det interna kommandoradsgrÀnssnittet (Argparse eller Python)

Eftersom Kopycat Àr en konsolapplikation erbjuder emulatorn tvÄ alternativ för kommandoradsgrÀnssnitt för att interagera med sina objekt och variabler: Argparse och Python.

Argparse Àr CLI:n som Àr inbyggd i Kopycat, och den Àr alltid tillgÀnglig för alla.

Alternativt CLI — Python-tolk. För att anvĂ€nda detta mĂ„ste Python-modulen Jep installeras och emulatorn konfigureras för att arbeta med Python (den Python-tolk som Ă€r installerad i anvĂ€ndarens primĂ€ra system kommer att anvĂ€ndas).

Installation av Python-modulen Jep

Under Linux kan Jep installeras via pip:

pip install jep

För att installera Jep under Windows mÄste Windows SDK och motsvarande Microsoft Visual Studio först installeras. Vi har förenklat din uppgift nÄgot och gjort WHL-paket JEP för aktuella versioner av Python för Windows, sÄ modulen kan installeras frÄn filen:

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

För att kontrollera installationen av Jep, kör följande kommando i kommandorutan:

python -c "import jep"

Som svar ska följande meddelande returneras:

ImportError: Jep stöds inte i fristÄende Python, det mÄste inbÀddas i Java.

I kommandofilen för emulatören för ditt system (kopycat.bat — för Windows, kopycat — för Linux) lĂ€gg till ett ytterligare parameter till listan DEFAULT_JVM_OPTS till ett extra parameter Djava.library.path — den ska innehĂ„lla sökvĂ€gen till den installerade Jep-modulen.

För Windows bör resultatet bli en rad av följande typ:

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

Starta Kopycat

Emulatören Àr en konsol-JVM-applikation. Starten görs via ett kommandoskript i operativsystemet (sh/cmd).

Kommandot för att starta under Windows:

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

Kommandot för att starta under Linux med hjÀlp av verktyget 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-porten som kommer att öppnas för Ă„tkomst till GDB-servern;
  • -n rhino — namnet pĂ„ huvudmodulen i systemet (enheten i samlingen);
  • -l user — namnet pĂ„ biblioteket för att söka efter huvudmodulen;
  • -y library — sökvĂ€gen för att hitta moduler som ingĂ„r i enheten;
  • firmwarerhino_pass.bin — sökvĂ€gen till firmwarefilen;
  • COM26 och COM28 Ă€r virtuella COM-portar.

Som resultat kommer en inbjudan att visas Python > (eller Argparse >):

18:07:59 INFO [eFactoryBuilder.create ]: Modulen top skapades framgÄngsrikt som top
18:07:59 INFO [ Module.initializeAndRes]: StÀller in kÀrnan till top.u1_stm32.cortexm0.arm för top
18:07:59 INFO [ Module.initializeAndRes]: StÀller in avkodaren till top.u1_stm32.dbg för top
18:07:59 WARN [ Module.initializeAndRes]: AvkÀnnaren hittades inte i top...
18:07:59 INFO [ Module.initializeAndRes]: Initierar portar och busser...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Vissa portar har varningar, anvÀnd printModulesPortsWarnings för att se det...
18:07:59 FINE [ ARMv6CPU.reset ]: StÀll in startpunktens adress till 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Modulen top Àr framgÄngsrikt initierad och ÄterstÀlld som en toppcell!
18:07:59 INFO [ Kopycat.open ]: Startar virtualisering av kortet top[rhino] med arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: StÀller in ny avkodare topp.u1_stm32.dbg för GDB_SERVER(port=23946,alive=true)
Python >

Interagera med IDA Pro

Som indatafil för analys i IDA, för att förenkla testning, anvÀnder vi firmware "Rhinoceros" i form av EN ELF-fil (dÀr metainformationen Àr lagrad).

Du kan ocksÄ anvÀnda den huvudsakliga firmware utan metainformation.

Efter att Kopycat startats i IDA Pro, gĂ„ till menyn Debugger och vĂ€lj "Byt debugger » och vĂ€lja «Remote GDB-debugger«. NĂ€sta, konfigurera anslutningen: menyn Debugger — Processalternativ


StÀll in vÀrden:

  • Application — vilket vĂ€rde som helst
  • Hostname: 127.0.0.1 (eller IP-adressen till den avlĂ€gsna maskinen dĂ€r Kopycat körs)
  • Port: 23946

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Knappen för att starta debuggningslÀge (tangent F9) blir nu tillgÀnglig:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Tryck pĂ„ den — anslutning till debuggningsmodulen i emulatorn sker. IDA gĂ„r in i debuggningslĂ€ge, ytterligare fönster blir tillgĂ€ngliga: registerinformation, stackinformation.

Nu kan vi anvÀnda alla standardfunktioner i debuggningsverktyget:

  • stegvis utförande av instruktioner (Step into och Step over — tangenterna F7 och F8, respektive);
  • start och paus i utförande;
  • skapa brytpunkter bĂ„de pĂ„ kod och data (tangent F2).

Anslutning till debuggningsverktyget innebĂ€r inte att firmwarekoden körs. Den aktuella positionen för exekvering mĂ„ste vara adressen 0x08006A74 — början av funktionen Reset_Handler. Om man scrollar ner i listningen kan man se anropet till funktionen main. Man kan sĂ€tta markören pĂ„ den hĂ€r raden (adressen 0x08006ABE) och utföra operationen Run until cursor (tangent F4).

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

DÀrefter kan man trycka pÄ F7 för att gÄ in i funktionen main.

Om man utför kommandot Continue process (tangent F9), dyker ett fönster med texten «Please wait» upp med en enda knapp Suspend:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Vid tryckning Suspend pausas utförandet av firmwarekoden och kan Äterupptas frÄn samma adress i koden dÀr det avbröts.

Om man fortsÀtter att köra koden kan man se följande rader i terminaler som Àr anslutna till virtuella COM-portar:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

NÀrvaron av raden «state bypass» indikerar att den virtuella Bluetooth-modulen har övergÄtt till lÀget för att ta emot data frÄn anvÀndarens COM-port.

Nu kan man i Bluetooth-terminalen (i bilden — COM29) skriva kommandon enligt «Noshörnings»-protokollet. Till exempel, som svar pĂ„ kommandot «MEOW» kommer Bluetooth-terminalen att returnera raden «mur-mur»:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Emulera mig inte helt

Vid konstruktionen av emulatorsystemet kan man vÀlja graden av detaljrikedom/emulering av en viss enhet. Till exempel kan Bluetooth-modulen emuleras pÄ olika sÀtt:

  • hela enheten emuleras med ett komplett kommando-set;
  • AT-kommandon emuleras, medan dataflödet tas emot frĂ„n COM-porten i huvudsystemet;
  • den virtuella enheten sĂ€kerstĂ€ller fullstĂ€ndig omdirigering av data till den verkliga enheten;
  • i form av en enkel stub som alltid returnerar «OK».

I den aktuella versionen av emulatorn anvĂ€nds den andra metoden – en virtuell Bluetooth-modul konfigurerar, varefter den gĂ„r över till att "proxies" data frĂ„n COM-porten i det primĂ€ra systemet till UART-porten i emulatorn.

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

LÄt oss övervÀga möjligheten till enkel instrumentering av koden i fall dÀr nÄgon del av periferin inte Àr implementerad. Till exempel, om en timer som ansvarar för att kontrollera datatransmissionen i DMA inte har skapats (kontrollen görs i funktionen ws2812b_wait, som ligger pÄ adressen 0x08006840), kommer firmware alltid att vÀnta pÄ att flaggan busy, som ligger pÄ adressen 0x200004C4, ska ÄterstÀllas, vilket visar aktiviteten pÄ DMA-databussen:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Vi kan lösa denna situation genom att "manuellt" ÄterstÀlla flaggan busy direkt efter att den har satts. I IDA Pro kan du skapa en Python-funktion och anropa den i en breakpoint, sÀtta sjÀlva breakpointen i koden efter att ha skrivit vÀrdet 1 i flaggan busy.

Breakpoint-behandlare

Först ska vi skapa en Python-funktion i IDA. Menyn File – Script command


LÀgg till ett nytt snipp i vÀnsterpanelen, ge den ett namn (till exempel, BPT),
och i textfÀltet till höger skriver vi funktionens kod:

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

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Efter detta trycker vi pÄ Run och stÀnger skriptfönstret.

Nu gĂ„r vi till koden pĂ„ adressen 0x0800688A, sĂ€tter en breakpoint (tangenten F2), redigerar den (högerklicksmenu Edit breakpoint
), glöm inte att stĂ€lla in skripttypen – Python:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn
Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Om det aktuella vÀrdet av flaggan busy Àr 1, bör funktionen skip_dma anropas i skriptet:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Om du kör firmware för att exekvera, kan du se kodens breakpoint-behandlare i IDA i fönstret Output med raderna Skipping wait ws2812.... Nu kommer firmware inte att vÀnta pÄ att flaggan ska ÄterstÀllas. busy.

Interaktion med emulatorn

Emulering för emuleringens skull kommer knappast att vÀcka glÀdje. Mycket intressantare Àr det om emulatorn hjÀlper forskaren att se data i minnet eller att sÀtta upp interaktion mellan trÄdar.

Vi ska visa hur man i realtid sÀtter upp interaktionen av RTOS-uppgifter. Först mÄste du stoppa koden om den körs. Om du gÄr till funktionen bluetooth_task_entry i grenen hantering av kommandot "LED" (adress 0x080057B8), kan du se att en viss meddelande först skapas och sedan skickas till det systematiska kön ledControlQueueHandle .

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Du bör sÀtta en breakpoint vid Ätkomsten till variabeln ledControlQueueHandle, som ligger pÄ adressen 0x20000624 och fortsÀtta körning av koden:

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Som följd av detta sker först ett stopp pĂ„ adressen 0x080057CA före anrop av funktionen osMailAlloc, sedan — pĂ„ adressen 0x08005806 före anrop av funktionen osMailPut, sedan efter en tid — pĂ„ adressen 0x08005BD4 (före anrop av funktionen osMailGet), som tillhör funktionen leds_task_entry (LED-task), det vill sĂ€ga att en vĂ€xling av uppgifter har Ă€gt rum, och nu har LED-tasken fĂ„tt kontrollen.

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

PÄ detta enkla sÀtt kan man avgöra hur RTOS-uppgifter interagerar med varandra.

SjÀlvklart kan interaktionen mellan uppgifter i verkligheten vara mer komplex, men med hjÀlp av en emulator blir det mindre arbetskrÀvande att spÄra denna interaktion.

HÀr Man kan se en kort video om att köra emulatormiljön och interagera med IDA Pro.

Körning med Radare2

Man kan inte förbise ett sÄ mÄngsidigt verktyg som Radare2.

För att ansluta till emulatormiljön med hjÀlp av r2 kommer kommandot att se ut sÄ hÀr:

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

Just nu Àr körning (dc) och avbrytande av körning (Ctrl+C) tillgÀngliga.

TyvÀrr finns det för nÀrvarande problem med r2 vid anvÀndning av hÄrdvarugdb-servern och minnesmappning, vilket gör att punkter för stopp och Stepping (kommando ds) inte fungerar. Vi hoppas att detta kommer att ÄtgÀrdas inom kort.

Körning med Eclipse

Ett av sÀtten att anvÀnda emulatormiljön Àr att debugga firmware för den utvecklade enheten. För tydlighetens skull kommer vi Àven att anvÀnda firmware "Rhino". KÀllkoden för firmen kan laddas ner hÀrifrÄn.

Som IDE kommer vi att anvÀnda Eclipse frÄn uppsÀttningen System Workbench for STM32.

För att emulatormiljön ska ladda firmwaren som direkt samlas i Eclipse, mÄste parametern firmware=null lÀggas till i kommandot för att starta emulatormiljön:

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

InstÀllning av debug-konfiguration

I Eclipse vĂ€ljer vi menyn Kör — Debug-konfigurationer
 I det öppna fönstret under GDB Hardware Debugging mĂ„ste en ny konfiguration lĂ€ggas till, varefter aktuellt projekt och applikation för debugging anges i fliken "Main":

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

I fliken "Debugger" mÄste GDB-kommandot anges:
${openstm32_compiler_path}arm-none-eabi-gdb

Och Àven ange parametrar för att ansluta till GDB-servern (vÀrd och port):

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

I fliken "Startup" mÄste följande parametrar anges:

  • aktivera kryssrutan Ladda bild (sĂ„ att den komprimerade firmware-bilden laddas i emulatormiljön);
  • aktivera kryssrutan Ladda symboler;
  • lĂ€gg till startkommando: set $pc = *0x08000004 (sĂ€tta PC-registret till vĂ€rde frĂ„n minne pĂ„ adress 0x08000004 — dĂ€r adressen lagras ResetHandler).

Observera, om du inte vill ladda firmware-filen frÄn Eclipse, sÄ behöver du inte ange parametrar Ladda bild och Kör kommandon behöver inte anges.

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Efter att ha tryckt pÄ Debug kan du arbeta i felsökningslÀge:

  • steg-för-steg körning av kod
    Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn
  • interaktion med brytpunkter
    Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

AnmÀrkning. I Eclipse finns det, hmm... vissa egenskaper... och man fÄr leva med dem. Till exempel, om ett meddelande "Ingen kÀlla tillgÀnglig för "0x0"" visas vid start av felsökaren, kör kommandot Steg (F5)

Noshörning inuti katten – vi startar firmware i Kopycat-emulatorn

Avslutande

Emulering av nativ kod Àr en mycket intressant uppgift. För en enhetsutvecklare öppnar det möjlighet att felsöka firmware utan verklig enhet. För en forskare erbjuder det möjlighet att göra dynamisk kodanalys, vilket inte alltid Àr möjligt ens med en enhet tillgÀnglig.

Vi vill ge specialister ett verktyg som Àr bekvÀmt, relativt enkelt och inte tar mycket tid och kraft för att stÀlla in och köra.

Skriv i kommentarerna om din erfarenhet av att anvÀnda hÄrdvaru-emulatorer. Vi vÀlkomnar diskussion och svarar gÀrna pÄ frÄgor.

Endast registrerade anvÀndare kan delta i omröstningen. Logga in, tack.

Vad anvÀnder du emulatören till?

  • utvecklar (felsöker) firmware

  • undersöker firmware

  • kör spel (Dendi, Sega, PSP)

  • nĂ„got annat (skriv i kommentarerna)

7 anvÀndare har röstat. 2 anvÀndare avstod.

Vilken mjukvara anvÀnder du för emulering av nativ kod?

  • QEMU

  • Unicorn engine

  • Proteus

  • nĂ„got annat (skriv i kommentarerna)

6 anvÀndare har röstat. 2 anvÀndare avstod.

Vad skulle du vilja förbÀttra i den anvÀnda emulatören?

  • jag vill ha mer hastighet

  • jag vill ha mer bekvĂ€mlighet i instĂ€llningar/start

  • jag vill ha fler interaktionsmöjligheter med emulatören (API, hooks)

  • jag Ă€r nöjd med allt

  • nĂ„got annat (skriv i kommentarerna)

8 anvÀndare har röstat. 1 anvÀndare avstod.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster