Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

V rámci stretnutia 0x0A DC7831 DEF CON Nižný Novgorod 16. februára sme predstavili prezentáciu o základných princípoch emulácie binárneho kódu a našom vlastnom riešení – emulátore hardvérových platforiem. Kopycat.

V článku poskytneme popis spustenia firmvéru zariadenia v emulátore, predvedieme interakciu s ladením a vykonáme malú dynamickú analýzu firmvéru.

Pozadie

Kedysi dávno v galaxii ďaleko, ďaleko odtiaľ

Pred pár rokmi v našej laboratórii vznikla potreba preskúmať firmvér zariadenia. Firmvér bol komprimovaný, rozbaloval ho bootloader. Robil to veľmi zložitým spôsobom, niekoľkokrát presúval dáta v pamäti. Samotný firmvér potom aktívne interagoval s perifériami. A to všetko na jadre MIPS.

Existujúce emulátory nás z objektívnych dôvodov neuspokojili, a chceli sme predsa len spustiť kód. Rozhodli sme sa teda vytvoriť vlastný emulátor, ktorý vygeneruje minimum a umožní rozbaliť hlavný firmvér. Skúsili sme – podarilo sa. Potom sme si povedali, a čo ak pridáme periférie, aby sme mohli spustiť aj hlavný firmvér. Nebolo to veľmi bolestivé – a tiež sa to podarilo. Znova sme rozmýšľali a rozhodli sa urobiť plnohodnotný emulátor.

Nakoniec vznikol emulátor výpočtových systémov. Kopycat.

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat
Prečo Kopycat?

Ide o hru so slovami.

  1. copycat (angl., podstatné meno [ˈkɒpɪkæt]) – napodobniteľ, imitátor
  2. cat (angl., podstatné meno [ˈkæt]) – mačka, kocúr – obľúbené zviera jedného z tvorcov projektu
  3. Písmeno „K“ – z programovacieho jazyka Kotlin

Kopycat

Pri vytváraní emulátora sme si stanovili niekoľko konkrétnych cieľov:

  • možnosť dostatočne rýchlo vytvoriť nové periférie, modul, procesorové jadro;
  • možnosť zostaviť virtuálne zariadenie z rôznych modulov;
  • možnosť načítať do pamäte virtuálneho zariadenia akékoľvek binárne dáta (firmvér);
  • možnosť práce so snapshotmi (snímky stavu systému);
  • možnosť interakcie s emulátorom cez zabudovaný debugger;
  • príjemný moderný jazyk pre vývoj.

Nakoniec bol zvolený Kotlin, zbernicová architektúra (to je, keď sa moduly spájajú medzi sebou cez virtuálne dátové zbernice), JSON – ako formát na popis zariadenia, a GDB RSP – ako protokol interakcie s debuggerom.

Vývoj trvá už viac ako dva roky a aktívne pokračuje. Počas tohto obdobia boli implementované procesorové jadrá MIPS, x86, V850ES, ARM, PowerPC.

Projekt rastie a nastal čas predstaviť ho širokej verejnosti. Podrobné opísanie projektu pripravíme neskôr, zatiaľ sa zameriame na využívanie Kopycat.

Pre tých najnetrpezlivejších - promo verziu emulátora si môžete stiahnuť na odkaze.

Nosorožec v emulátore

Pripomíname, že pred konferenciou SMARTRHINO-2018 bolo vytvorené testovacie zariadenie „Nosorožec“ na učenie zručností reverzného inžinierstva. Proces statickej analýzy firmvéru bol popísaný v tomto článku.

Teraz sa pokúsime pridať „dynamičnosť“ a spustíme firmvér v emulátore.

Budeme potrebovať:
1) Java 1.8
2) Python a modul Jep na používanie Pythonu vo vnútri emulátora. WHL balík modulu Jep pre Windows je možné stiahnuť tu.

Pre Windows:
1) com0com
2) PuTTY

Pre Linux:
1) socat

Ako GDB klienta možno použiť Eclipse, IDA Pro alebo radare2.

Ako to funguje?

Aby bolo možné vykonávať firmvér v emulátore, je potrebné „zhromaždiť“ virtuálne zariadenie, ktoré predstavuje ekvivalent reálneho zariadenia.

Reálne zariadenie („nosorožec“) je možné znázorniť na štruktúrnej schéme:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Emulátor má modulárnu štruktúru a konečné virtuálne zariadenie je možné opísať v JSON súbore.

JSON má 105 riadkov

{
  "top": true,

  // Názov pluginu by mal byť rovnaký ako názov súboru (alebo úplná cesta od začiatku knižnice)
  "plugin": "rhino",

  // Adresár, kde plugin umiestňuje
  "library": "user",

  // Parametre pluginu (parametre konštruktora, ak ide o jar-plugin)
  "params": [
    { "name": "tty_dbg", "type": "String"},
    { "name": "tty_bt", "type": "String"},
    { "name": "firmware", "type": "String", "default": "NUL"}
  ],

  // Vonkajšie porty pluginu
  "ports": [  ],

  // Interné zbernice pluginu
  "buses": [
    { "name": "mem", "size": "BUS30" },
    { "name": "nand", "size": "4" },
    { "name": "gpio", "size": "BUS32" }
  ],

  // Interné komponenty pluginu
  "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" }
  ],

  // Prepojenie pluginu medzi komponentmi
  "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"]
  ]
}

Vezmite prosím na vedomie parameter firmware v sekcii params — to je názov súboru, ktorý je možné nahrať do virtuálneho zariadenia ako firmvér.

Virtuálne zariadenie a jeho interakcia s hlavnou operačnou systémou môžu byť znázornené nasledovným schémou:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Aktuálny testovací príklad emulátora zahŕňa interakciu s COM portami hlavnej OS (odladovací UART a UART pre Bluetooth modul). Tieto môžu byť reálne porty, ku ktorým sú pripojené zariadenia, alebo virtuálne COM porty (na to je potrebné com0com / socat).

Pre interakciu s emulátorom zvonka existujú v súčasnosti dva hlavné spôsoby:

  • protokol GDB RSP (nástroje, ktoré tento protokol podporujú — Eclipse / IDA / radare2);
  • vnútorný príkazový riadok emulátora (Argparse alebo Python).

Virtuálne COM porty

Aby ste mohli komunikovať s UART-om virtuálneho zariadenia na lokálnom počítači cez terminál, je potrebné vytvoriť pár prepojených virtuálnych COM portov. V našom prípade jeden port používa emulátor a druhý — program-terminál (PuTTY alebo screen):

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Používanie com0com

Virtuálne COM porty sa nastavujú pomocou setup nástroja zo sady com0com (konzolová verzia — C:Program Files (x86)com0comsetupс.exe, alebo GUI verzia — C:Program Files (x86)com0comsetupg.exe):

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Je potrebné zaškrtnúť políčka enable buffer overrun pre všetky vytvorené virtuálne porty, inak bude emulátor čakať na odpoveď od COM portu.

Používanie socat

Na UNIX systémoch sú virtuálne COM porty automaticky vytvorené emulátorom pomocou nástroja socat. Pre to stačí pri spustení emulátora uviesť prefix v názve portu socat:.

Vnútorné rozhranie príkazového riadku (Argparse alebo Python)

Keďže Kopycat je konzolová aplikácia, pre interakciu so svojimi objektami a premennými emulátor poskytuje dva varianty rozhrania príkazového riadku: Argparse a Python.

Argparse je CLI zabudované v Kopycat, je dostupné vždy a pre všetkých.

Alternatívne CLI — interpretátor Python. Na jeho využitie je potrebné nainštalovať Python modul Jep a nastaviť emulátor na prácu s Python (bude sa používať interpretátor Python nainštalovaný v hlavnom systéme používateľa).

Inštalácia Python modulu Jep

Pod Linuxom môže byť Jep nainštalovaný cez pip:

pip install jep

Pre inštaláciu Jep na Windows je potrebné najprv nainštalovať Windows SDK a príslušný Microsoft Visual Studio. Urobili sme vám úlohu trochu jednoduchšou a vytvorili sme WHL balíky JEP pre aktuálne verzie Python pre Windows, preto sa modul môže nainštalovať z súboru:

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

Na overenie inštalácie Jep je potrebné vykonať v príkazovom riadku:

python -c "import jep"

V odpovedi by sa malo zobraziť správa:

ImportError: Jep nie je podporovaný v samostatnom Pythone, musí byť zabudovaný v Jave.

V príkazovom súbore emulátora pre váš systém (kopycat.bat — pre Windows, kopycat — pre Linux) do zoznamu parametrov DEFAULT_JVM_OPTS pridajte ďalší parameter Djava.library.path — mal by obsahovať cestu k nainštalovanému modulu Jep.

Výsledkom pre Windows by mala byť nasledovná reťazec:

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

Spustenie Kopycat

Emulátor je konzolová JVM aplikácia. Spustenie sa vykonáva cez skript príkazového riadku operačného systému (sh/cmd).

Príkaz na spustenie pod Windows:

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

Príkaz na spustenie pod Linux s použitím nástroja 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, ktorý bude otvorený pre prístup ku GDB serveru;
  • -n rhino — názov hlavného modulu systému (zariadenie v zostave);
  • -l user — názov knižnice na vyhľadanie hlavného modulu;
  • -y library — cesta na vyhľadanie modulov vstupujúcich do zariadenia;
  • firmwarerhino_pass.bin — cesta k súboru s firmvérom;
  • COM26 a COM28 — virtuálne COM porty.

Výsledkom bude zobrazené výzva Python > (alebo Argparse >):

18:07:59 INFO [eFactoryBuilder.create ]: Modul top bol úspešne vytvorený ako top
18:07:59 INFO [ Module.initializeAndRes]: Nastavenie jadra na top.u1_stm32.cortexm0.arm pre top
18:07:59 INFO [ Module.initializeAndRes]: Nastavenie ladenia na top.u1_stm32.dbg pre top
18:07:59 WARN [ Module.initializeAndRes]: Tracer nebol nájdený v top...
18:07:59 INFO [ Module.initializeAndRes]: Inicializácia portov a zberníc...
18:07:59 WARN [ Module.initializePortsA]: POZOR: Niektoré porty majú varovanie, použite printModulesPortsWarnings na zobrazenie...
18:07:59 FINE [ ARMv6CPU.reset ]: Nastavte adresu vstupného bodu na 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Modul top bol úspešne inicializovaný a resetovaný ako horná bunka!
18:07:59 INFO [ Kopycat.open ]: Spúšťanie virtualizácie dosky top[rhino] s arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: Nastavte nový debugger modul top.u1_stm32.dbg pre GDB_SERVER(port=23946,alive=true)
Python >

Interakcia s IDA Pro

Ako vstupný súbor na analýzu v IDA pre zjednodušenie testovania používame firmvér „Nosorožec“ vo forme ELF súboru (tam je uložená meta-informácia).

Môžete tiež použiť hlavnú firmvér bez meta-informácie.

Po spustení Kopycat v IDA Pro v menu Debugger ideme na položku „Switch debugger…„ a vyberieme „Vzdialený GDB debugger«. Potom nastavíme pripojenie: menu Debugger — Možnosti procesu...

Nastavujeme hodnoty:

  • Aplikácia — akákoľvek hodnota
  • Hostname: 127.0.0.1 (alebo IP adresa vzdialeného stroja, kde je spustený Kopycat)
  • Port: 23946

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Teraz je dostupné tlačidlo spustenia ladenia (klávesa F9):

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Stlačíme ho — dochádza k pripojeniu k modulu debugggera v emulátore. IDA prechádza do režimu ladenia, sú dostupné dodatočné okná: informácie o registroch, o zásobníku.

Teraz môžeme využiť všetky štandardné možnosti práce s debuggerom:

  • krokovanie inštrukcií (Krok do a Krok cez — klávesy F7 a F8, príslušne);
  • spustenie a pozastavenie vykonávania;
  • vytváranie bodov zlomu ako na kód, tak aj na dáta (klávesa F2).

Pripojenie k debuggeru neznamená spustenie kódu firmvéru. Aktuálna pozícia pre vykonávanie musí byť adresa 0x08006A74 — začiatok funkcie Reset_Handler. Ak posunieme zoznam nižšie, môžeme vidieť volanie funkcie main. Môžeme umiestniť kurzor na tento riadok (adresa 0x08006ABE) a vykonať operáciu Spustiť až na kurzor (klávesa F4).

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Potom môžeme stlačiť F7, aby sme vstúpili do funkcie main.

Ak vykonáme príkaz Pokračovať v procese (klávesa F9), objaví sa okno „Prosím, čakajte“ s jediným tlačidlom Pozastaviť:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Po stlačení Pozastaviť vykonávanie kódu firmvéru sa pozastaví a môže byť obnovené z tej istej adresy v kóde, kde bolo prerušené.

Ak pokračujeme v vykonávaní kódu, na termináloch pripojených k virtuálnym COM-portom môžeme vidieť nasledujúce riadky:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Prítomnosť riadku „state bypass“ naznačuje, že virtuálny Bluetooth modul prešiel do režimu príjmu údajov z COM-portu používateľa.

Teraz v Bluetooth termináli (na obrázku — COM29) môžeme zadávať príkazy podľa protokolu „Nosorožec“. Napríklad na príkaz „MEOW“ v Bluetooth termináli sa vráti riadok „mur-mur“:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Emuluj ma nie úplne

Pri budovaní emulátora si môžeme vybrať stupeň podrobnosti/emulácie daného zariadenia. Napríklad modul Bluetooth sa môže emulovať rôznymi spôsobmi:

  • emuluje sa celé zariadenie s kompletnou sadou príkazov;
  • emulujú sa AT-príkazy, pričom tok dát sa prijíma z COM-portu hlavného systému;
  • virtuálne zariadenie zaisťuje kompletné presmerovanie dát na reálne zariadenie;
  • vo forme jednoduchého zástupcu, ktorý vždy vracia „OK“.

V aktuálnej verzii emulátora sa používa druhý prístup — virtuálny Bluetooth modul vykonáva konfiguráciu, po ktorej prechádza do režimu „proxy“ dát z COM portu hlavného systému do UART portu emulátora.

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Zvážme možnosť jednoduchej nástroje na inštrumentáciu kódu v prípade, že nebola implementovaná nejaká časť periférie. Napríklad, ak nebol vytvorený časovač, ktorý zodpovedá za kontrolu prenosu dát v DMA (kontrola sa vykonáva v funkcii ws2812b_wait, nachádzajúcej sa na adrese 0x08006840), potom firmware vždy čaká na resetovanie príznaku busy, nachádzajúceho sa na adrese 0x200004C4, ktorý ukazuje zaneprázdnenosť dátovej linky DMA:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Túto situáciu môžeme obísť „ručne“ resetovaním príznaku busy ihneď po jeho nastavení. V IDA Pro môžeme vytvoriť Python funkciu a vyvolať ju v breakpoint-e, pričom samotný breakpoint umiestnime v kóde po zapísaní hodnoty 1 do príznaku busy.

Breakpoint handler

Najskôr vytvoríme Python funkciu v IDA. Menu File — Script command…

Pridáme nový snippet do zoznamu vľavo, dáme mu meno (napríklad, BPT),
do textového poľa vpravo zadávame kód funkcie:

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

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Potom klikneme na Spustiť a zavrieme okno skriptov.

Teraz prejdeme do kódu na adrese 0x0800688A, nastavíme breakpoint (klávesa F2), upravíme ho (kontextové menu Edit breakpoint…), nezabudnime nastaviť typ skriptu – Python:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat
Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Ak je aktuálna hodnota príznaku busy rovná 1, potom by sa mala vykonať funkcia skip_dma v riadku skriptov:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Ak sa spustí firmware na vykonanie, je možné zaznamenať spustenie kódu breakpoint handler-a v IDA v okne Output na riadku Skipping wait ws2812.... Teraz firmware nebude čakať na resetovanie príznaku. busy.

Interakcia s emulátorom

Emulácia len pre emuláciu pravdepodobne nevzbudí nadšenie a radosť. Omnoho zaujímavejšie je, ak emulátor pomôže výskumníkovi vidieť dáta v pamäti alebo nastaviť interakciu medzi vláknami.

Ukážeme, ako dynamicky nastaviť interakciu RTOS úloh. Predtým je potrebné pozastaviť vykonávanie kódu, ak je spustené. Ak prejdeme do funkcie bluetooth_task_entry v vetve spracovania príkazu „LED“ (adresa 0x080057B8), môžeme vidieť, že najskôr sa vytvorí a potom sa odošle do systémovej fronty ledControlQueueHandle určité správy.

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Je potrebné nastaviť breakpoint pri prístupe k premennej ledControlQueueHandle, nachádzajúcej sa na adrese 0x20000624 a pokračovať vo vykonávaní kódu:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Až to spôsobí zastavenie na adrese 0x080057CA pred volaním funkcie osMailAlloc, potom na adrese 0x08005806 pred volaním funkcie osMailPut, neskôr po určitom čase—na adrese 0x08005BD4 (pred volaním funkcie osMailGet), ktorá patrí funkcii leds_task_entry (LED úloha), teda došlo k prepnúť úloh, a teraz riadenie prešlo na LED úlohu.

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Týmto jednoduchým spôsobom možno určiť, ako si úlohy RTOS vymieňajú informácie.

Samozrejme, v skutočnosti môže byť interakcia úloh zložitejšia, ale s použitím emulátora je sledovanie tejto interakcie menej prácne.

Tu Môžete si pozrieť krátke video o spustení emulátora a jeho interakcii s IDA Pro.

Spustenie s Radare2

Nie je možné obísť taký univerzálny nástroj ako Radare2.

Aby ste sa pripojili k emulátoru pomocou r2, príkaz bude vyzerať takto:

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

Momentálne sú k dispozícii spustenie (dc) a pozastavenie vykonávania (Ctrl+C).

Bohužiaľ, momentálne má r2 problémy pri práci s hardvérovým gdb serverom a rozložením pamäte, kvôli čomu nefungujú lapače a kroky (príkaz ds). Dúfame, že to bude čoskoro opravené.

Spustenie s Eclipse

Jedným z variantov použitia emulátora je ladenie firmvéru vyvíjaného zariadenia. Pre prehľadnosť použijeme aj firmvér „Nohoch“. Zdrojové súbory firmvéru si môžete stiahnuť odtiaľto.

Ako IDE budeme používať Eclipse z balíka System Workbench for STM32.

Aby sa do emulátora nahrával firmvér priamo zostavený v Eclipse, je potrebné pridať parameter firmware=null do príkazu na spustenie emulátora:

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

Nastavenie debug konfigurácie

V Eclipse vyberte menu Run — Debug Configurations… V otvorenom okne v sekcii GDB Hardware Debugging je potrebné pridať novú konfiguráciu, potom na karte „Main“ uviesť aktuálny projekt a aplikáciu na ladenie:

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Na karte „Debugger“ je potrebné uviesť GDB príkaz:
${openstm32_compiler_path}arm-none-eabi-gdb

A tiež zadať parametre na pripojenie k GDB serveru (host a port):

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Na karte „Startup“ je potrebné uviesť nasledujúce parametre:

  • zaškrtnúť políčko Load image (aby sa nahrával do emulátora zostavený obraz firmvéru);
  • zaškrtnúť políčko Load symbols;
  • pridať príkaz na spustenie: set $pc = *0x08000004 (nastavit hodnotu z paměti na adresu PC 0x08000004 — zde se nachází adresa ResetHandler’a).

Všimnite si, pokud nechcete načítat soubor firmwaru z Eclipse, pak parametry Load image a Spustit příkazy nejsou nutné.

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Po stisknutí Debug můžete pracovat v režimu debuggeru:

  • krokování kódu
    Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat
  • interakce s body zlomů
    Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Poznámka. V Eclipse jsou, hm… některé zvláštnosti… a s těmi se musíme smířit. Například, pokud při spuštění debuggeru dostanete zprávu „No source available for „0x0″“, pak proveďte příkaz Step (F5)

Nosorožec vnútri mačky – spúšťame firmware v emulátore Kopycat

Na záver

Emulace nativního kódu je velmi zajímavá záležitost. Pro vývojáře zařízení se objevuje možnost ladit firmware bez skutečného zařízení. Pro výzkumníka je to možnost provádět dynamickou analýzu kódu, což není vždy možné ani při dostupnosti zařízení.

Chceme poskytnout specialistům nástroj, který by byl pohodlný, přiměřeně jednoduchý a nevyžadoval mnoho sil a času na svou konfiguraci a spuštění.

Napište v komentářích o svých zkušenostech s hardwarovými emulátory. Zveme k diskuzi a rádi odpovíme na otázky.

Len registrovaní používatelia sa môžu zúčastniť prieskumu. Prihláste sa, prosím.

K čemu používáte emulátor?

  • vyvinuji (ladím) firmware

  • zkoumám firmware

  • spouštím hry (Dendi, Sega, PSP)

  • něco jiného (napište v komentáři)

Hlasovalo 7 uživatelů. Zdrželo se 2 uživatelů.

Jaký software používáte pro emulaci nativního kódu?

  • QEMU

  • Unicorn engine

  • Proteus

  • něco jiného (napište v komentáři)

Hlasovalo 6 uživatelů. Zdrželo se 2 uživatelů.

Co byste chtěli zlepšit v používaném emulátoru?

  • chtěl bych rychlost

  • chtěl bych pohodlí nastavení/spuštění

  • chtěl bych více možností interakce s emulátorem (API, hooky)

  • jsem spokojen se vším

  • něco jiného (napište v komentáři)

Hlasovalo 8 používateľov. Zdržal sa 1 používateľ.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster