Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Isip kabahin sa miting 0x0A DC7831 DEF CON Nizhny Novgorod Kaniadtong Pebrero 16, gipresentar namon ang usa ka taho sa sukaranang mga prinsipyo sa binary code emulation ug among kaugalingon nga pag-uswag - usa ka emulator sa platform sa hardware Copycat.

Niini nga artikulo atong ihulagway kung giunsa pagpadagan ang firmware sa device sa emulator, pagpakita sa interaksyon sa debugger, ug paghimo og gamay nga dinamikong pagtuki sa firmware.

sa naunang kasaysayan

Dugay na nga panahon sa usa ka galaxy nga layo sa layo

Pipila ka tuig ang milabay sa among laboratoryo kinahanglan nga imbestigahan ang firmware sa usa ka aparato. Ang firmware gi-compress ug gi-unpack gamit ang bootloader. Gibuhat niya kini sa usa ka komplikado kaayo nga paagi, gibalhin ang data sa memorya sa daghang mga higayon. Ug ang firmware mismo dayon aktibo nga nakig-uban sa mga peripheral. Ug kining tanan sa MIPS core.

Alang sa katuyoan nga mga hinungdan, ang magamit nga mga emulator dili angay kanamo, apan gusto namon nga ipadagan ang code. Dayon nakahukom kami sa paghimo sa among kaugalingong emulator, nga maghimo sa minimum ug tugotan kami sa pag-unpack sa nag-unang firmware. Gisulayan namon kini ug kini nagtrabaho. Naghunahuna kami, unsa kaha kung magdugang kami mga peripheral aron mahimo usab ang panguna nga firmware. Dili kini kaayo masakit - ug kini milampos usab. Naghunahuna kami pag-usab ug nakahukom nga maghimo usa ka hingpit nga emulator.

Ang resulta mao ang usa ka computer system emulator Copycat.

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator
Nganong Kopycat?

Adunay dula sa mga pulong.

  1. copycat (Iningles, nombre [ˈkɒpɪkæt]) - tigsundog, tigsundog
  2. Iring (Iningles, noun [ˈkæt]) - iring, iring - ang paboritong hayop sa usa sa mga tiglalang sa proyekto
  3. Ang letra nga "K" gikan sa Kotlin programming language

Copycat

Sa paghimo sa emulator, piho kaayo nga mga tumong ang gitakda:

  • ang abilidad sa dali nga paghimo og bag-ong mga peripheral, modules, processor cores;
  • ang abilidad sa pag-assemble sa usa ka virtual nga aparato gikan sa lainlaing mga module;
  • ang abilidad sa pag-load sa bisan unsa nga binary data (firmware) ngadto sa panumduman sa usa ka virtual device;
  • abilidad sa pagtrabaho uban sa mga snapshot (mga snapshot sa kahimtang sa sistema);
  • ang abilidad sa pagpakig-uban sa emulator pinaagi sa built-in debugger;
  • nindot nga modernong pinulongan alang sa kalamboan.

Ingon usa ka sangputanan, gipili si Kotlin alang sa pagpatuman, ang arkitektura sa bus (kini kung ang mga module nakigsulti sa usag usa pinaagi sa mga virtual data bus), JSON ingon format sa paghulagway sa aparato, ug GDB RSP ingon protocol alang sa interaksyon sa debugger.

Ang pag-uswag nagpadayon sulod sa kapin sa duha ka tuig ug aktibo nga nagpadayon. Niini nga panahon, ang MIPS, x86, V850ES, ARM, ug PowerPC processor cores gipatuman.

Ang proyekto nagkadako ug panahon na nga ipresentar kini sa mas lapad nga publiko. Magbuhat kami usa ka detalyado nga paghulagway sa proyekto sa ulahi, apan sa pagkakaron magpunting kami sa paggamit sa Kopycat.

Alang sa labing walay pasensya, ang usa ka promo nga bersyon sa emulator mahimong ma-download gikan sa link.

Rhino sa emulator

Atong hinumdoman nga sa sayo pa alang sa SMARTHINO-2018 nga komperensya, usa ka test device nga "Rhinoceros" ang gimugna alang sa pagtudlo sa mga kahanas sa reverse engineering. Ang proseso sa static firmware analysis gihulagway sa kini nga artikulo.

Karon atong sulayan nga idugang ang "mga mamumulong" ug ipadagan ang firmware sa emulator.

Kinahanglan namon:
1) Java 1.8
2) Python ug module Si Jep sa paggamit sa Python sulod sa emulator. Mahimo nimong tukuron ang WHL module nga Jep para sa Windows download dinhi.

Alang sa Windows:
1) com0com
2) PuTTY

Alang sa Linux:
1) socat

Mahimo nimong gamiton ang Eclipse, IDA Pro o radare2 isip kliyente sa GDB.

Unsang paagi kini sa trabaho?

Aron mahimo ang firmware sa emulator, kinahanglan nga "magtipon" sa usa ka virtual nga aparato, nga usa ka analogue sa usa ka tinuud nga aparato.

Ang tinuod nga device (“rhino”) mahimong ipakita sa block diagram:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Ang emulator adunay modular nga istruktura ug ang katapusang virtual device mahimong mahulagway sa usa ka JSON file.

JSON 105 nga mga linya

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

Hatagi'g pagtagad ang parameter firmware seksyon params mao ang ngalan sa usa ka file nga mahimong ikarga sa usa ka virtual device isip firmware.

Ang virtual device ug ang interaksyon niini sa main operating system mahimong irepresentar sa mosunod nga diagram:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Ang kasamtangan nga pagsulay nga pananglitan sa emulator naglakip sa interaksyon sa mga COM port sa main OS (debug UART ug UART alang sa Bluetooth module). Mahimo kini nga tinuod nga mga pantalan diin ang mga aparato konektado o mga virtual nga COM port (alang niini kinahanglan nimo com0com/socat).

Sa pagkakaron adunay duha ka nag-unang mga paagi sa pagpakig-uban sa emulator gikan sa gawas:

  • GDB RSP protocol (sumala, ang mga himan nga nagsuporta niini nga protocol mao ang Eclipse / IDA / radare2);
  • internal nga emulator command line (Argparse o Python).

Virtual COM nga mga pantalan

Aron makig-uban sa UART sa usa ka virtual device sa lokal nga makina pinaagi sa usa ka terminal, kinahanglan ka nga maghimo usa ka pares sa mga kauban nga virtual COM port. Sa among kaso, usa ka port ang gigamit sa emulator, ug ang ikaduha gigamit sa terminal program (PuTTY o screen):

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Gamit ang com0com

Ang mga virtual COM ports gi-configure gamit ang setup utility gikan sa com0com kit (console version - C:Program Files (x86)com0comsetupс.exe, o GUI nga bersyon - C:Program Files (x86)com0comsetupg.exe):

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Susiha ang mga kahon i-enable ang buffer overrun alang sa tanan nga gibuhat nga virtual nga mga pantalan, kung dili ang emulator maghulat alang sa tubag gikan sa COM port.

Paggamit sa socat

Sa mga sistema sa UNIX, ang mga virtual nga COM port awtomatik nga gihimo sa emulator gamit ang socat utility; aron mahimo kini, itakda lang ang prefix sa ngalan sa port kung magsugod ang emulator socat:.

Internal nga command line interface (Argparse o Python)

Tungod kay ang Kopycat usa ka console nga aplikasyon, ang emulator naghatag og duha ka command line interface nga mga opsyon alang sa pagpakig-uban sa mga butang ug mga variable niini: Argparse ug Python.

Ang Argparse usa ka CLI nga gitukod sa Kopycat ug kanunay nga magamit sa tanan.

Ang alternatibong CLI mao ang Python interpreter. Aron magamit kini, kinahanglan nimo nga i-install ang module nga Jep Python ug i-configure ang emulator aron magtrabaho kauban ang Python (ang Python interpreter nga gi-install sa panguna nga sistema sa gumagamit ang gamiton).

Pag-instalar sa Python module nga Jep

Ubos sa Linux Jep mahimong ma-install pinaagi sa pip:

pip install jep

Aron ma-install ang Jep sa Windows, kinahanglan nimo una nga i-install ang Windows SDK ug ang katugbang nga Microsoft Visual Studio. Gihimo namo kini nga mas sayon ​​​​alang kanimo ug Nagtukod ang WHL JEP alang sa kasamtangan nga mga bersyon sa Python para sa Windows, aron ang module mahimong ma-install gikan sa file:

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

Aron masusi ang pag-instalar sa Jep, kinahanglan nimo nga modagan sa command line:

python -c "import jep"

Ang mosunod nga mensahe kinahanglang madawat isip tubag:

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

Sa emulator batch file para sa imong sistema (copycat.bat - alang sa Windows, copycat - alang sa Linux) sa lista sa mga parameter DEFAULT_JVM_OPTS pagdugang usa ka dugang nga parameter Djava.library.path — kini kinahanglan nga adunay sulud nga agianan padulong sa na-install nga module sa Jep.

Ang resulta alang sa Windows kinahanglan nga usa ka linya nga sama niini:

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

Paglansad sa Kopycat

Ang emulator kay usa ka console JVM application. Ang paglansad gihimo pinaagi sa operating system command line script (sh/cmd).

Sugo nga modagan ubos sa Windows:

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

Sugo nga modagan ubos sa Linux gamit ang socat utility:

./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 nga bukas para sa access sa GDB server;
  • -n rhino - ngalan sa nag-unang module sa sistema (nagpundok nga aparato);
  • -l user — ngalan sa librarya aron pangitaon ang main module;
  • -y library - dalan sa pagpangita alang sa modules nga gilakip sa device;
  • firmwarerhino_pass.bin - dalan sa firmware file;
  • Ang COM26 ug COM28 mga virtual nga COM port.

Ingon usa ka sangputanan, usa ka prompt ang ipakita Python > (o 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 >

Interaksyon sa IDA Pro

Aron pasimplehon ang pagsulay, gigamit namon ang Rhino firmware ingon gigikanan nga file alang sa pagtuki sa IDA sa porma ELF file (meta impormasyon gitipigan didto).

Mahimo usab nimo gamiton ang nag-unang firmware nga walay impormasyon sa meta.

Pagkahuman sa paglansad sa Kopycat sa IDA Pro, sa menu sa Debugger adto sa aytem nga "Ibalhin ang debugger…"Ug pilia"Hilit nga GDB debugger". Sunod, i-set up ang koneksyon: menu Debugger - Mga kapilian sa proseso…

Ibutang ang mga bili:

  • Aplikasyon - bisan unsang kantidad
  • Hostname: 127.0.0.1 (o ang IP address sa hilit nga makina diin nagdagan ang Kopycat)
  • Port: 23946

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Karon ang debugging button mahimong magamit (F9 key):

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

I-klik kini aron makonektar sa debugger module sa emulator. Ang IDA moadto sa debugging mode, dugang nga mga bintana mahimong magamit: kasayuran bahin sa mga rehistro, bahin sa stack.

Karon magamit na nato ang tanang standard features sa debugger:

  • sunodsunod nga pagpatuman sa mga instruksiyon (Lakang sa и Lakang sa ibabaw - mga yawe F7 ug F8, matag usa);
  • pagsugod ug paghunong sa pagpatay;
  • paghimo og mga breakpoint alang sa code ug data (F2 key).

Ang pagkonektar sa usa ka debugger wala magpasabot sa pagpadagan sa firmware code. Ang kasamtangan nga posisyon sa pagpatay kinahanglan mao ang adres 0x08006A74 - pagsugod sa function Reset_Handler. Kung mag-scroll ka paubos sa listahan, imong makita ang function call nag-unang. Mahimo nimong ibutang ang cursor niini nga linya (address 0x08006ABE) ug ipahigayon ang operasyon Pagdagan hangtod sa cursor (key F4).

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Sunod, mahimo nimong ipadayon ang F7 aron makasulod sa function nag-unang.

Kung gipadagan nimo ang mando Ipadayon ang proseso (F9 key), unya ang "Palihug paghulat" nga bintana makita nga adunay usa ka buton Suspendido:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Sa imong pagpindot Suspendido Ang pagpatuman sa firmware code gisuspinde ug mahimong ipadayon gikan sa samang adres sa code diin kini nabalda.

Kung magpadayon ka sa pagpatuman sa code, imong makita ang mosunod nga mga linya sa mga terminal nga konektado sa virtual COM ports:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Ang presensya sa linya sa "state bypass" nagpakita nga ang virtual Bluetooth module mibalhin sa mode sa pagdawat sa datos gikan sa COM port sa user.

Karon sa Bluetooth terminal (COM29 sa hulagway) makasulod ka sa mga sugo subay sa Rhino protocol. Pananglitan, ang "MEOW" nga sugo ibalik ang string nga "mur-mur" sa Bluetooth terminal:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Sundoga ako dili sa hingpit

Kung magtukod usa ka emulator, mahimo nimong pilion ang lebel sa detalye / emulasyon sa usa ka partikular nga aparato. Pananglitan, ang Bluetooth module mahimong sundon sa lainlaing mga paagi:

  • ang himan hingpit nga gisundog sa usa ka bug-os nga hugpong sa mga sugo;
  • Ang mga sugo sa AT gisundog, ug ang data stream nadawat gikan sa COM port sa main system;
  • ang virtual device naghatag og kompleto nga data redirection ngadto sa tinuod nga device;
  • isip usa ka yano nga stub nga kanunay nagbalik nga "OK".

Ang kasamtangan nga bersyon sa emulator naggamit sa ikaduha nga pamaagi - ang virtual nga Bluetooth module naghimo sa pag-configure, pagkahuman kini mobalhin sa mode sa "proxying" nga datos gikan sa COM port sa main system ngadto sa UART port sa emulator.

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Atong tagdon ang posibilidad sa yano nga instrumento sa code kung adunay pipila ka bahin sa periphery nga wala gipatuman. Pananglitan, kung ang usa ka timer nga responsable sa pagkontrol sa pagbalhin sa data sa DMA wala pa nahimo (ang pagsusi gihimo sa function ws2812b_paghulatnahimutang sa 0x08006840), unya ang firmware kanunay maghulat alang sa bandila nga i-reset busynahimutang sa 0x200004C4nga nagpakita sa occupancy sa DMA data line:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Masulbad nato kini nga sitwasyon pinaagi sa manual nga pag-reset sa bandila busy diha-diha dayon human sa pag-instalar niini. Sa IDA Pro, makahimo ka og Python function ug tawgon kini sa usa ka breakpoint, ug ibutang ang breakpoint mismo sa code human isulat ang value 1 sa flag busy.

Handler sa breakpoint

Una, maghimo kita ug Python function sa IDA. Menu File - Script nga sugo...

Pagdugang og bag-ong snippet sa lista sa wala, hatagi kini og ngalan (pananglitan, Ang BPT),
Sa text field sa tuo, isulod ang function code:

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

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Human niana kami mopadayon run ug isira ang script window.

Karon adto ta sa code sa 0x0800688A, pagbutang ug breakpoint (F2 key), i-edit kini (context menu I-edit ang breakpoint...), ayaw kalimti ang pagbutang sa tipo sa script sa Python:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator
Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Kung ang karon nga kantidad sa bandila busy katumbas sa 1, nan kinahanglan nimo nga ipatuman ang function laktawan_dma sa linya sa script:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Kung gipadagan nimo ang firmware alang sa pagpatuman, ang pag-trigger sa breakpoint handler code makita sa bintana sa IDA output pinaagi sa linya Skipping wait ws2812.... Karon ang firmware dili maghulat alang sa bandila nga i-reset busy.

Interaksyon sa emulator

Ang pagsundog alang sa pag-ulog-ulog lagmit dili makahatag kalipay ug kalipay. Kini labi ka makapaikag kung ang emulator makatabang sa tigdukiduki nga makita ang datos sa panumduman o matukod ang interaksyon sa mga hilo.

Ipakita namon kanimo kung giunsa ang dinamikong pag-establisar sa interaksyon tali sa mga buluhaton sa RTOS. Kinahanglan nimo nga ihunong una ang pagpatuman sa code kung kini nagdagan. Kung moadto ka sa function bluetooth_task_entry sa pagproseso nga sanga sa "LED" nga sugo (address 0x080057B8), unya makita nimo kung unsa ang una nga gibuhat ug dayon ipadala sa pila sa sistema ledControlQueueHandle pipila ka mensahe.

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Kinahanglan ka nga magbutang usa ka breakpoint aron ma-access ang variable ledControlQueueHandlenahimutang sa 0x20000624 ug ipadayon ang pagpatuman sa code:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Ingon usa ka sangputanan, ang paghunong mahitabo una sa adres 0x080057CA sa wala pa tawagan ang function osMailAlloc, dayon sa adres 0x08005806 sa wala pa tawagan ang function osMailPut, unya pagkahuman sa usa ka panahon - sa adres 0x08005BD4 (sa wala pa tawagan ang function osMailGet), nga nahisakop sa function leds_task_entry (LED-task), nga mao, ang mga buluhaton gibalhin, ug karon ang LED-task nakadawat og kontrol.

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Niining yano nga paagi maestablisar nimo kung giunsa ang mga buluhaton sa RTOS nakig-uban sa usag usa.

Siyempre, sa pagkatinuod, ang interaksyon sa mga buluhaton mahimong mas komplikado, apan gamit ang usa ka emulator, ang pagsubay niini nga interaksyon mahimong dili kaayo hago.

dinhi Mahimo nimong tan-awon ang usa ka mubo nga video sa paglansad ug pag-interact sa emulator sa IDA Pro.

Ilunsad uban sa Radare2

Dili nimo mabalewala ang usa ka unibersal nga himan sama sa Radare2.

Aron makonektar sa emulator gamit ang r2, ang command ingon niini:

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

Ang paglusad magamit na karon (dc) ug ihunong ang pagpatuman (Ctrl+C).

Ikasubo, sa pagkakaron, ang r2 adunay mga problema kung nagtrabaho kauban ang hardware gdb server ug layout sa memorya; tungod niini, ang mga breakpoint ug Mga Lakang wala molihok (sugo ds). Kami naglaum nga kini masulbad sa dili madugay.

Nagdagan uban ang Eclipse

Usa sa mga kapilian sa paggamit sa emulator mao ang pag-debug sa firmware sa device nga giugmad. Alang sa katin-awan, gamiton usab namo ang Rhino firmware. Mahimo nimong i-download ang mga gigikanan sa firmware gikan dinhi.

Atong gamiton ang Eclipse gikan sa set isip IDE System Workbench alang sa STM32.

Aron ma-load sa emulator ang firmware nga direkta nga giipon sa Eclipse, kinahanglan nimo nga idugang ang parameter firmware=null sa emulator launch command:

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

Pag-set up sa debug configuration

Sa Eclipse, pilia ang menu Run - Debug Configuration... Sa bintana nga nagbukas, sa seksyon GDB Hardware Debugging kinahanglan nimong idugang ang usa ka bag-ong configuration, unya sa tab nga "Main" ipiho ang kasamtangan nga proyekto ug aplikasyon alang sa pag-debug:

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Sa tab nga "Debugger" kinahanglan nimo nga ipiho ang mando sa GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

Ug isulod usab ang mga parameter alang sa pagkonektar sa GDB server (host ug port):

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Sa tab nga "Startup", kinahanglan nimo nga ipiho ang mosunod nga mga parameter:

  • i-enable ang checkbox Ikarga ang hulagway (aron ang gitigum nga imahe sa firmware gikarga sa emulator);
  • i-enable ang checkbox Ikarga ang mga simbolo;
  • idugang ang mando sa paglansad: set $pc = *0x08000004 (ibutang ang rehistro sa PC sa kantidad gikan sa memorya sa adres 0x08000004 - ang adres gitipigan didto ResetHandler).

Pagtagad, kung dili nimo gusto nga i-download ang firmware file gikan sa Eclipse, unya ang mga kapilian Ikarga ang hulagway и Pagdalag mga sugo dili kinahanglan nga ipahibalo.

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Human sa pag-klik sa Debug, mahimo kang magtrabaho sa debugger mode:

  • lakang sa lakang nga pagpatuman sa code
    Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator
  • nakig-uban sa mga breakpoints
    Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Примечание. Ang Eclipse adunay, hmm ... pipila ka mga quirks ... ug kinahanglan ka nga mopuyo uban kanila. Pananglitan, kung sa pagsugod sa debugger ang mensahe nga "Walay tinubdan nga magamit alang sa" 0x0 "" makita, unya ipatuman ang Lakang sugo (F5)

Rhinoceros sulod sa usa ka iring - ipadagan ang firmware sa Kopycat emulator

Kay sa usa ka konklusyon

Ang pagsundog sa lumad nga code usa ka makapaikag kaayo nga butang. Mahimong posible alang sa usa ka developer sa device nga i-debug ang firmware nga walay tinuod nga device. Alang sa usa ka tigdukiduki, kini usa ka oportunidad sa pagpahigayon sa dinamikong pagtuki sa code, nga dili kanunay posible bisan sa usa ka aparato.

Gusto namon nga hatagan ang mga espesyalista sa usa ka himan nga kombenyente, kasarangan nga yano ug wala magkinahanglan daghang paningkamot ug oras sa pag-set up ug pagdagan.

Isulat sa mga komento bahin sa imong kasinatian sa paggamit sa mga emulator sa hardware. Kami nagdapit kanimo sa paghisgot ug malipay sa pagtubag sa mga pangutana.

Ang mga rehistradong tiggamit lamang ang makaapil sa survey. Sign in, walay sapayan.

Unsa imong gamit sa emulator?

  • Nag-develop ko (debug) firmware

  • Nag-research ko sa firmware

  • Naglunsad ko og mga dula (Dendi, Sega, PSP)

  • lain pa (isulat sa mga komento)

7 ka tiggamit ang miboto. 2 ka tiggamit ang nag- abstain.

Unsa nga software ang imong gigamit sa pagsundog sa lumad nga code?

  • QEMU

  • Unicorn nga makina

  • Proteus

  • lain pa (isulat sa mga komento)

6 ka tiggamit ang miboto. 2 ka tiggamit ang nag- abstain.

Unsa ang gusto nimong pauswagon sa emulator nga imong gigamit?

  • Gusto ko nga paspas

  • Gusto nako ang kadali sa pag-setup / paglansad

  • Gusto ko og dugang nga mga kapilian sa pagpakig-uban sa emulator (API, mga kaw-it)

  • Nalipay ko sa tanan

  • lain pa (isulat sa mga komento)

8 user ang nagboto. 1 user ang ni- abstain.

Source: www.habr.com

Idugang sa usa ka comment