Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Bħala parti mil-laqgħa 0x0A DC7831 DEF CON Nizhny Novgorod Fis-16 ta' Frar, ippreżentajna rapport dwar il-prinċipji bażiċi tal-emulazzjoni tal-kodiċi binarju u l-iżvilupp tagħna stess - emulatur tal-pjattaforma tal-ħardwer Copycat.

F'dan l-artikolu ser niddeskrivu kif tħaddem il-firmware tal-apparat fl-emulator, nuru l-interazzjoni mad-debugger, u nwettqu analiżi dinamika żgħira tal-firmware.

preistorja

Żmien twil ilu f'galaxie 'l bogħod

Ftit snin ilu fil-laboratorju tagħna kien hemm bżonn li jiġi investigat il-firmware ta 'apparat. Il-firmware kien ikkompressat u mhux ippakkjat b'bootloader. Huwa għamel dan b'mod ikkumplikat ħafna, biddel id-data fil-memorja diversi drabi. U l-firmware innifsu mbagħad interaġixxa b'mod attiv mal-periferali. U dan kollu fuq il-qalba tal-MIPS.

Għal raġunijiet oġġettivi, l-emulaturi disponibbli ma kinux adattati għalina, iżda xorta ridna nħaddmu l-kodiċi. Imbagħad iddeċidejna li nagħmlu l-emulatur tagħna stess, li jagħmel il-minimu u jippermettilna li nispakkjaw il-firmware prinċipali. Ippruvajna u ħadem. Ħsibna, x'jiġri jekk inżidu periferali biex iwettqu wkoll il-firmware prinċipali. Ma weġġgħetx ħafna - u ħadmet ukoll. Erġajna ħsibna u ddeċidejna li nagħmlu emulatur sħiħ.

Ir-riżultat kien emulatur tas-sistemi tal-kompjuter Copycat.

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat
Għaliex Kopycat?

Hemm logħob tal-kliem.

  1. kopjatur (Ingliż, nom [ˈkɒpɪkæt]) - imitatur, imitatur
  2. qattus (Ingliż, nom [ˈkæt]) - qattus, qattus - l-annimal favorit ta’ wieħed mill-ħallieqa tal-proġett
  3. L-ittra "K" hija mil-lingwa ta 'programmar Kotlin

Copycat

Meta ħoloq l-emulator, ġew stabbiliti miri speċifiċi ħafna:

  • l-abbiltà li toħloq malajr periferali, moduli, cores tal-proċessuri ġodda;
  • l-abbiltà li tiġbor apparat virtwali minn diversi moduli;
  • l-abbiltà li tagħbija kwalunkwe data binarja (firmware) fil-memorja ta 'apparat virtwali;
  • abbiltà li taħdem ma 'snapshots (snapshots ta' l-istat tas-sistema);
  • l-abbiltà li jinteraġixxu ma 'l-emulator permezz tad-debugger inkorporat;
  • lingwaġġ modern sabiħ għall-iżvilupp.

Bħala riżultat, Kotlin intgħażel għall-implimentazzjoni, l-arkitettura tax-xarabank (dan huwa meta l-moduli jikkomunikaw ma 'xulxin permezz ta' xarabanks tad-dejta virtwali), JSON bħala l-format tad-deskrizzjoni tal-apparat, u GDB RSP bħala l-protokoll għall-interazzjoni mad-debugger.

L-iżvilupp ilu għaddej għal ftit aktar minn sentejn u għaddej b'mod attiv. Matul dan iż-żmien, ġew implimentati cores tal-proċessuri MIPS, x86, V850ES, ARM, u PowerPC.

Il-proġett qed jikber u wasal iż-żmien li jiġi ppreżentat lill-pubbliku usa’. Se nagħmlu deskrizzjoni dettaljata tal-proġett aktar tard, iżda għalissa se niffukaw fuq l-użu tal-Kopycat.

Għall-aktar paċenzja, verżjoni promozzjonali tal-emulator tista 'titniżżel minn rabta.

Rhino fl-emulator

Ejja nfakkru li aktar kmieni għall-konferenza SMARTRHINO-2018, inħoloq apparat tat-test "Rhinoceros" għat-tagħlim tal-ħiliet tal-inġinerija inversa. Il-proċess tal-analiżi statika tal-firmware ġie deskritt fi Dan l-artikolu.

Issa ejja nippruvaw inżidu "kelliema" u tħaddem il-firmware fl-emulator.

Ikollna bżonn:
1) Java 1.8
2) Python u modulu Ġep biex tuża Python ġewwa l-emulator. Tista 'tibni l-modulu WHL Jep għall-Windows tniżżel hawn.

Għal Windows:
1) com0com
2) IPPUT

Għal Linux:
1) socat

Tista' tuża Eclipse, IDA Pro jew radare2 bħala klijent GDB.

Kif taħdem?

Sabiex twettaq il-firmware fl-emulator, huwa meħtieġ li "jiġbor" apparat virtwali, li huwa analogu ta 'apparat reali.

L-apparat reali ("rhino") jista' jintwera fid-dijagramma blokk:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

L-emulator għandu struttura modulari u l-apparat virtwali finali jista 'jiġi deskritt f'fajl JSON.

JSON 105 linji

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

Oqgħod attent għall-parametru Firmware fit-taqsima parametri huwa l-isem ta' fajl li jista' jitgħabba f'apparat virtwali bħala firmware.

L-apparat virtwali u l-interazzjoni tiegħu mas-sistema operattiva ewlenija jistgħu jiġu rappreżentati bid-dijagramma li ġejja:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

L-istanza attwali tat-test tal-emulator tinvolvi interazzjoni mal-portijiet COM tal-OS prinċipali (iddebug UART u UART għall-modulu Bluetooth). Dawn jistgħu jkunu portijiet reali li magħhom huma konnessi l-apparati jew portijiet COM virtwali (għal dan għandek bżonn biss com0com/socat).

Bħalissa hemm żewġ modi ewlenin biex jinteraġixxu ma 'l-emulator minn barra:

  • Protokoll GDB RSP (konsegwentement, l-għodod li jappoġġjaw dan il-protokoll huma Eclipse / IDA / radare2);
  • linja ta 'kmand emulatur intern (Argparse jew Python).

Portijiet COM virtwali

Sabiex jinteraġixxu mal-UART ta 'apparat virtwali fuq il-magna lokali permezz ta' terminal, għandek bżonn toħloq par ta 'portijiet COM virtwali assoċjati. Fil-każ tagħna, port wieħed jintuża mill-emulatur, u t-tieni jintuża minn programm terminali (PuTTY jew skrin):

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Uża com0com

Il-portijiet COM virtwali huma kkonfigurati bl-użu tal-utilità tas-setup mill-kit com0com (verżjoni tal-konsole - C:Fajls tal-Programm (x86)com0comsetupс.exe, jew verżjoni GUI - C:Fajls tal-Programm (x86)com0comsetupg.exe):

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Iċċekkja l-kaxxi jippermetti buffer overrun għall-portijiet virtwali kollha maħluqa, inkella l-emulator se jistenna rispons mill-port COM.

Uża socat

Fuq sistemi UNIX, portijiet COM virtwali huma maħluqa awtomatikament mill-emulatur bl-użu tal-utilità socat; biex tagħmel dan, speċifika l-prefiss fl-isem tal-port meta tibda l-emulatur socat:.

Interface tal-linja tal-kmand interna (Argparse jew Python)

Peress li Kopycat hija applikazzjoni tal-console, l-emulatur jipprovdi żewġ għażliet ta 'interface tal-linja tal-kmand biex jinteraġixxu mal-oġġetti u l-varjabbli tiegħu: Argparse u Python.

Argparse huwa CLI mibni f'Kopycat u huwa dejjem disponibbli għal kulħadd.

CLI alternattiva hija l-interpretu Python. Biex tużah, trid tinstalla l-modulu Jep Python u tikkonfigura l-emulatur biex jaħdem ma 'Python (se jintuża l-interpretu Python installat fis-sistema ewlenija tal-utent).

Installazzjoni tal-modulu Python Jep

Taħt Linux Jep jista 'jiġi installat permezz ta' pip:

pip install jep

Biex tinstalla Jep fuq Windows, l-ewwel trid tinstalla l-Windows SDK u l-Microsoft Visual Studio korrispondenti. Għamilna ftit aktar faċli għalik u WHL tibni JEP għall-verżjonijiet attwali ta 'Python għall-Windows, sabiex il-modulu jista' jiġi installat mill-fajl:

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

Biex tiċċekkja l-installazzjoni ta 'Jep, għandek bżonn taħdem fuq il-linja tal-kmand:

python -c "import jep"

Il-messaġġ li ġej għandu jasal bi tweġiba:

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

Fil-fajl tal-lott tal-emulatur għas-sistema tiegħek (copycat.bat - għall-Windows, kopjatur - għal Linux) għal-lista ta' parametri DEFAULT_JVM_OPTS żid parametru addizzjonali Djava.library.path — għandu jkun fiha l-mogħdija għall-modulu Jep installat.

Ir-riżultat għall-Windows għandu jkun linja bħal din:

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

Tnedija Kopycat

L-emulator huwa applikazzjoni JVM tal-console. It-tnedija titwettaq permezz tal-iskript tal-linja tal-kmand tas-sistema operattiva (sh/cmd).

Kmand biex taħdem taħt Windows:

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

Kmand biex taħdem taħt Linux billi tuża l-utilità 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 — Port TCP li se jkun miftuħ għall-aċċess għas-server GDB;
  • -n rhino — isem il-modulu tas-sistema prinċipali (apparat immuntat);
  • -l user — isem il-librerija biex tfittex il-modulu prinċipali;
  • -y library — mogħdija għat-tfittxija għal moduli inklużi fl-apparat;
  • firmwarerhino_pass.bin — mogħdija għall-fajl tal-firmware;
  • COM26 u COM28 huma portijiet COM virtwali.

Bħala riżultat, se jintwera pront Python > (Jew 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 >

Interazzjoni ma' IDA Pro

Biex tissimplifika l-ittestjar, nużaw il-firmware Rhino bħala l-fajl tas-sors għall-analiżi f'IDA fil-forma Fajl ELF (meta informazzjoni hija maħżuna hemmhekk).

Tista 'wkoll tuża l-firmware prinċipali mingħajr meta informazzjoni.

Wara li tniedi Kopycat f'IDA Pro, fil-menu tad-Debugger mur l-oġġett "Aqleb id-debugger..." u agħżel "Debugger GDB mill-bogħod". Sussegwentement, waqqaf il-konnessjoni: menu Debugger - Għażliet tal-proċess...

Issettja l-valuri:

  • Applikazzjoni - kwalunkwe valur
  • Hostname: 127.0.0.1 (jew l-indirizz IP tal-magna remota fejn qed jaħdem Kopycat)
  • Port: 23946

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Issa l-buttuna tad-debugging issir disponibbli (ċavetta F9):

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Ikklikkjaha biex tikkonnettja mal-modulu tad-debugger fl-emulator. IDA tidħol fil-mod ta 'debugging, twieqi addizzjonali jsiru disponibbli: informazzjoni dwar reġistri, dwar il-munzell.

Issa nistgħu nużaw il-karatteristiċi standard kollha tad-debugger:

  • eżekuzzjoni pass pass tal-istruzzjonijiet (Pass ġewwa и Pass fuq — ċwievet F7 u F8, rispettivament);
  • jibda u jwaqqaf l-eżekuzzjoni;
  • ħolqien ta' breakpoints kemm għall-kodiċi kif ukoll għad-data (ċavetta F2).

Il-konnessjoni ma' debugger ma jfissirx li tħaddem il-kodiċi tal-firmware. Il-pożizzjoni tal-eżekuzzjoni attwali għandha tkun l-indirizz 0x08006A74 — bidu tal-funzjoni Reset_Handler. Jekk tiskrollja 'l isfel fil-lista, tista' tara s-sejħa tal-funzjoni prinċipali. Tista' tpoġġi l-cursor fuq din il-linja (indirizz 0x08006ABE) u wettaq l-operazzjoni Mexxi sal-cursor (ċavetta F4).

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Sussegwentement, tista 'tagħfas F7 biex tidħol fil-funzjoni prinċipali.

Jekk tmexxi l-kmand Kompli proċess (ċavetta F9), imbagħad it-tieqa "Jekk jogħġbok stenna" tidher b'buttuna waħda Issospendi:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Meta tagħfas Issospendi l-eżekuzzjoni tal-kodiċi tal-firmware hija sospiża u tista' titkompla mill-istess indirizz fil-kodiċi fejn ġie interrott.

Jekk tkompli tesegwixxi l-kodiċi, tara l-linji li ġejjin fit-terminals konnessi mal-portijiet COM virtwali:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Il-preżenza tal-linja "bypass tal-istat" tindika li l-modulu Bluetooth virtwali qaleb għall-mod li jirċievi data mill-port COM tal-utent.

Issa fit-terminal Bluetooth (COM29 fl-istampa) tista 'tidħol kmandi skont il-protokoll Rhino. Pereżempju, il-kmand "MEOW" se jirritorna s-sekwenza "mur-mur" lit-terminal Bluetooth:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Emula lili mhux kompletament

Meta tibni emulatur, tista 'tagħżel il-livell ta' dettall/emulazzjoni ta 'apparat partikolari. Pereżempju, il-modulu Bluetooth jista 'jiġi imitat b'modi differenti:

  • l-apparat huwa emulat bis-sħiħ b'sett sħiħ ta 'kmandi;
  • Kmandi AT huma emulati, u n-nixxiegħa tad-dejta tiġi riċevuta mill-port COM tas-sistema prinċipali;
  • l-apparat virtwali jipprovdi direzzjoni mill-ġdid tad-dejta kompleta għall-apparat reali;
  • bħala stub sempliċi li dejjem jirritorna "OK".

Il-verżjoni attwali tal-emulatur tuża t-tieni approċċ - il-modulu Bluetooth virtwali jwettaq konfigurazzjoni, u wara jaqleb għall-mod ta '"proxying" data mill-port COM tas-sistema prinċipali għall-port UART tal-emulator.

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Ejja nikkunsidraw il-possibbiltà ta 'strumentazzjoni sempliċi tal-kodiċi f'każ li xi parti tal-periferija ma tiġix implimentata. Pereżempju, jekk ma jkunx inħoloq tajmer responsabbli għall-kontroll tat-trasferiment tad-dejta lid-DMA (il-kontroll isir fil-funzjoni ws2812b_waitli jinsab fi 0x08006840), allura l-firmware dejjem jistenna li l-bandiera tiġi reset busyli jinsab fi 0x200004C4li turi l-okkupazzjoni tal-linja tad-dejta DMA:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Nistgħu nidħlu din is-sitwazzjoni billi nirsetjaw il-bandiera manwalment busy immedjatament wara li tinstallah. F'IDA Pro, tista 'toħloq funzjoni Python u ssejħilha f'punt ta' waqfien, u poġġi l-punt ta 'waqfien innifsu fil-kodiċi wara li tikteb il-valur 1 mal-bandiera busy.

Breakpoint handler

L-ewwel, ejja noħolqu funzjoni Python fl-IDA. Menu Fajl - Kmand tal-iskript...

Żid snippet ġdid fil-lista fuq ix-xellug, agħtiha isem (per eżempju, BPT),
Fil-qasam tat-test fuq il-lemin, daħħal il-kodiċi tal-funzjoni:

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

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Wara dan, ikklikkja Mexxi u agħlaq it-tieqa tal-iskript.

Issa ejja mmorru għall-kodiċi fi 0x0800688A, issettja breakpoint (ċavetta F2), editjah (menu tal-kuntest Editja breakpoint...), tinsiex issettja t-tip ta’ script għal Python:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat
Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Jekk il-valur tal-bandiera kurrenti busy ugwali għal 1, allura għandek tesegwixxi l-funzjoni skip_dma fil-linja tal-iskrittura:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Jekk tmexxi l-firmware għall-eżekuzzjoni, l-iskattar tal-kodiċi tal-immaniġġjar tal-breakpoint jista 'jidher fit-tieqa tal-IDA output bil-linja Skipping wait ws2812.... Issa l-firmware mhux se jistenna li l-bandiera tiġi reset busy.

Interazzjoni ma 'l-emulator

Emulazzjoni għall-fini ta 'emulazzjoni x'aktarx li tikkawża delight u ferħ. Huwa ħafna aktar interessanti jekk l-emulator jgħin lir-riċerkatur biex jara d-dejta fil-memorja jew jistabbilixxi l-interazzjoni tal-ħjut.

Aħna ser nuruk kif dinamikament tistabbilixxi interazzjoni bejn il-kompiti RTOS. L-ewwel għandek twaqqaf l-eżekuzzjoni tal-kodiċi jekk ikun qed jaħdem. Jekk tmur għall-funzjoni dħul_task_bluetooth lill-fergħa tal-ipproċessar tal-kmand "LED" (indirizz 0x080057B8), imbagħad tista 'tara x'inhu maħluq l-ewwel u mbagħad jintbagħat lill-kju tas-sistema ledControlQueueHandle xi messaġġ.

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Għandek tistabbilixxi breakpoint biex taċċessa l-varjabbli ledControlQueueHandleli jinsab fi 0x20000624 u kompli tesegwixxi l-kodiċi:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Bħala riżultat, il-waqfien se jseħħ l-ewwel fl-indirizz 0x080057CA qabel issejjaħ il-funzjoni osMailAlloc, imbagħad fl-indirizz 0x08005806 qabel issejjaħ il-funzjoni osMailPut, imbagħad wara ftit - għall-indirizz 0x08005BD4 (qabel issejjaħ il-funzjoni osMailGet), li tappartjeni għall-funzjoni leds_task_entry (LED-kompitu), jiġifieri, il-kompiti mibdula, u issa l-LED-kompitu rċeviet kontroll.

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

B'dan il-mod sempliċi tista 'tistabbilixxi kif il-kompiti RTOS jinteraġixxu ma' xulxin.

Naturalment, fir-realtà, l-interazzjoni tal-kompiti tista 'tkun aktar ikkumplikata, iżda bl-użu ta' emulatur, it-traċċar ta 'din l-interazzjoni jsir inqas impenjattiv.

Hawnhekk Tista 'tara vidjo qasir ta' l-emulator tnedija u interazzjoni ma 'IDA Pro.

Tnedija b'Radare2

Ma tistax tinjora għodda universali bħal Radare2.

Biex tikkonnettja mal-emulatur billi tuża r2, il-kmand ikun jidher bħal dan:

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

Tnedija disponibbli issa (dc) u waqqaf l-eżekuzzjoni (Ctrl+C).

Sfortunatament, bħalissa, r2 għandu problemi meta jaħdem mal-hardware gdb server u t-tqassim tal-memorja; minħabba dan, breakpoints u Steps ma jaħdmux (kmand ds). Nittamaw li dan jiġi rranġat dalwaqt.

Tiġri bl-Eclipse

Waħda mill-għażliet għall-użu tal-emulator hija li tiddibaggja l-firmware tal-apparat li qed jiġi żviluppat. Għaċ-ċarezza, se nużaw ukoll il-firmware Rhino. Tista 'tniżżel is-sorsi tal-firmware għalhekk.

Se nużaw Eclipse mis-sett bħala IDE Workbench tas-Sistema għal STM32.

Sabiex l-emulator jgħabbi l-firmware miġbura direttament f'Eclipse, trid iżżid il-parametru firmware=null għall-kmand tat-tnedija tal-emulatur:

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

Twaqqif tal-konfigurazzjoni tad-debug

F'Eclipse, agħżel il-menu Mexxi - Debug Konfigurazzjonijiet... Fit-tieqa li tiftaħ, fit-taqsima Debugging tal-Hardware GDB għandek bżonn iżżid konfigurazzjoni ġdida, imbagħad fit-tab "Prinċipali" speċifika l-proġett attwali u l-applikazzjoni għad-debugging:

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Fuq it-tab "Debugger" għandek bżonn tispeċifika l-kmand GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

U daħħal ukoll il-parametri għall-konnessjoni mas-server GDB (host u port):

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Fuq it-tab "Startup", trid tispeċifika l-parametri li ġejjin:

  • ippermetti checkbox Tagħbija immaġni (sabiex l-immaġni tal-firmware immuntata titgħabba fl-emulator);
  • ippermetti checkbox Is-simboli tat-tagħbija;
  • żid kmand tat-tnedija: set $pc = *0x08000004 (issettja r-reġistru tal-PC għall-valur mill-memorja fl-indirizz 0x08000004 - l-indirizz huwa maħżun hemm ResetHandler).

Oqgħod attent, Jekk ma tridx tniżżel il-fajl tal-firmware minn Eclipse, allura l-għażliet Tagħbija immaġni и Mexxi kmandi m'hemmx għalfejn tindika.

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Wara li tikklikkja Debug, tista 'taħdem fil-mod debugger:

  • eżekuzzjoni tal-kodiċi pass pass
    Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat
  • jinteraġixxu ma' breakpoints
    Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Innota. Eclipse għandha, hmm... xi kwirkijiet... u trid tgħix magħhom. Pereżempju, jekk meta tibda d-debugger jidher il-messaġġ "L-ebda sors disponibbli għal "0x0"", imbagħad eżegwixxi l-kmand Pass (F5)

Rhinoceros ġewwa qattus - mexxi l-firmware fl-emulator Kopycat

Minflok ma tikkonkludi

L-emulazzjoni tal-kodiċi nattiv hija ħaġa interessanti ħafna. Isir possibbli għal żviluppatur ta 'apparat li jiddebuggja l-firmware mingħajr apparat reali. Għal riċerkatur, hija opportunità li twettaq analiżi tal-kodiċi dinamika, li mhux dejjem hija possibbli anke b'apparat.

Irridu nipprovdu speċjalisti b'għodda li hija konvenjenti, moderatament sempliċi u ma tieħux ħafna sforz u ħin biex titwaqqaf u titħaddem.

Ikteb fil-kummenti dwar l-esperjenza tiegħek billi tuża emulaturi tal-ħardwer. Nistednuk tiddiskuti u nkunu kuntenti li nwieġbu l-mistoqsijiet.

Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.

Għalxiex qed tuża l-emulator?

  • Jien niżviluppa (debug) firmware

  • Qed nirriċerka l-firmware

  • Inniedi logħob (Dendi, Sega, PSP)

  • xi ħaġa oħra (ikteb fil-kummenti)

Ivvutaw 7 utent. 2 utent astjenew.

Liema softwer tuża biex timita l-kodiċi nattiv?

  • QEMU

  • Magna tal-unicorn

  • Proteus

  • xi ħaġa oħra (ikteb fil-kummenti)

Ivvutaw 6 utent. 2 utent astjenew.

X'tixtieq ittejjeb fl-emulator li qed tuża?

  • Irrid veloċità

  • Irrid faċilità ta 'setup/tnedija

  • Irrid aktar għażliet għall-interazzjoni mal-emulator (API, ganċijiet)

  • Jien kuntent b’kollox

  • xi ħaġa oħra (ikteb fil-kummenti)

Ivvutaw 8-il utent. utent 1 astjena.

Sors: www.habr.com

Żid kumment