Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Fel rhan o'r cyfarfod 0x0A DC7831 DEF CON Nizhny Novgorod Ar Chwefror 16, fe wnaethom gyflwyno adroddiad ar egwyddorion sylfaenol efelychu cod deuaidd a'n datblygiad ein hunain - efelychydd platfform caledwedd Copryn.

Yn yr erthygl hon byddwn yn disgrifio sut i redeg cadarnwedd y ddyfais yn yr efelychydd, dangos rhyngweithio â'r dadfygiwr, a pherfformio dadansoddiad deinamig byr o'r firmware.

cynhanes

Amser maith yn ôl mewn galaeth bell bell i ffwrdd

Ychydig flynyddoedd yn ôl yn ein labordy roedd angen ymchwilio i gadarnwedd dyfais. Roedd y firmware wedi'i gywasgu a'i ddadbacio â bootloader. Gwnaeth hyn mewn ffordd gymhleth iawn, gan symud y data yn y cof sawl gwaith. Ac yna roedd y firmware ei hun yn rhyngweithio'n weithredol â'r perifferolion. A hyn i gyd ar graidd MIPS.

Am resymau gwrthrychol, nid oedd yr efelychwyr sydd ar gael yn addas i ni, ond roeddem yn dal eisiau rhedeg y cod. Yna fe benderfynon ni wneud ein efelychydd ein hunain, a fyddai'n gwneud y lleiafswm ac yn caniatáu inni ddadbacio'r prif firmware. Fe wnaethon ni roi cynnig arno ac fe weithiodd. Roeddem yn meddwl, beth os ydym yn ychwanegu perifferolion i hefyd gyflawni'r prif firmware. Wnaeth o ddim brifo llawer - ac fe weithiodd allan hefyd. Fe wnaethon ni feddwl eto a phenderfynu gwneud efelychydd llawn.

Y canlyniad oedd efelychydd systemau cyfrifiadurol Copryn.

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat
Pam Kopycat?

Mae drama ar eiriau.

  1. efelychu (Saesneg, enw [ˈkɒpɪkæt]) - imitator, imitator
  2. cat (Saesneg, enw [ˈkæt]) - cath, cath - hoff anifail un o grewyr y prosiect
  3. Daw'r llythyren “K” o iaith raglennu Kotlin

Copryn

Wrth greu'r efelychydd, gosodwyd nodau penodol iawn:

  • y gallu i greu perifferolion, modiwlau, creiddiau prosesydd newydd yn gyflym;
  • y gallu i gydosod dyfais rithwir o fodiwlau amrywiol;
  • y gallu i lwytho unrhyw ddata deuaidd (cadarnwedd) i gof dyfais rithwir;
  • y gallu i weithio gyda chipluniau (cipluniau o gyflwr y system);
  • y gallu i ryngweithio â'r efelychydd trwy'r dadfygiwr adeiledig;
  • iaith fodern braf i'w datblygu.

O ganlyniad, dewiswyd Kotlin i'w weithredu, pensaernïaeth y bysiau (dyma pan fydd modiwlau'n cyfathrebu â'i gilydd trwy fysiau data rhithwir), JSON fel fformat disgrifiad y ddyfais, a GDB RSP fel y protocol ar gyfer rhyngweithio â'r dadfygiwr.

Mae datblygiad wedi bod yn mynd rhagddo ers ychydig dros ddwy flynedd ac mae'n mynd rhagddo. Yn ystod yr amser hwn, gweithredwyd creiddiau prosesydd MIPS, x86, V850ES, ARM, a PowerPC.

Mae'r prosiect yn tyfu ac mae'n bryd ei gyflwyno i'r cyhoedd ehangach. Byddwn yn gwneud disgrifiad manwl o'r prosiect yn ddiweddarach, ond am y tro byddwn yn canolbwyntio ar ddefnyddio Kopycat.

Ar gyfer y rhai mwyaf diamynedd, gellir lawrlwytho fersiwn promo o'r efelychydd o cyswllt.

Rhino yn yr efelychydd

Gadewch inni gofio, yn gynharach ar gyfer cynhadledd SMARTRHINO-2018, fod dyfais brawf “Rhinoceros” wedi'i chreu ar gyfer addysgu sgiliau peirianneg gwrthdro. Disgrifiwyd y broses o ddadansoddi cadarnwedd statig yn Mae'r erthygl hon yn.

Nawr, gadewch i ni geisio ychwanegu "siaradwyr" a rhedeg y firmware yn yr efelychydd.

Bydd angen:
1) Java 1.8
2) Python a modiwl jep i ddefnyddio Python y tu mewn i'r efelychydd. Gallwch chi adeiladu'r modiwl WHL Jep ar gyfer Windows lawrlwythwch yma.

Ar gyfer Windows:
1) com0com
2) PuTTY

Ar gyfer Linux:
1) socat

Gallwch ddefnyddio Eclipse, IDA Pro neu radare2 fel cleient GDB.

Sut mae'n gweithio?

Er mwyn perfformio firmware yn yr efelychydd, mae angen "cydosod" dyfais rithwir, sef analog o ddyfais go iawn.

Gellir dangos y ddyfais go iawn (“rhino”) yn y diagram bloc:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Mae gan yr efelychydd strwythur modiwlaidd a gellir disgrifio'r ddyfais rithwir derfynol mewn ffeil JSON.

JSON 105 o linellau

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

Rhowch sylw i'r paramedr firmware adran paramau yw enw'r ffeil y gellir ei llwytho i mewn i'r ddyfais rithwir fel firmware.

Gellir cynrychioli'r ddyfais rithwir a'i rhyngweithiad â'r brif system weithredu gan y diagram canlynol:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Mae enghraifft prawf cyfredol yr efelychydd yn cynnwys rhyngweithio â phorthladdoedd COM y prif OS (debug UART ac UART ar gyfer y modiwl Bluetooth). Gall y rhain fod yn borthladdoedd go iawn y mae dyfeisiau wedi'u cysylltu â nhw neu'n borthladdoedd COM rhithwir (ar gyfer hyn y cyfan sydd ei angen arnoch chi com0com/socat).

Ar hyn o bryd mae dwy brif ffordd o ryngweithio â'r efelychydd o'r tu allan:

  • Protocol GDB RSP (yn unol â hynny, yr offer sy'n cefnogi'r protocol hwn yw Eclipse / IDA / radare2);
  • llinell orchymyn efelychydd mewnol (Argparse neu Python).

porthladdoedd COM rhithwir

Er mwyn rhyngweithio â UART dyfais rithwir ar y peiriant lleol trwy derfynell, mae angen i chi greu pâr o borthladdoedd COM rhithwir cysylltiedig. Yn ein hachos ni, mae un porthladd yn cael ei ddefnyddio gan yr efelychydd, a'r ail gan raglen derfynell (PuTTY neu sgrin):

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Gan ddefnyddio com0com

Mae porthladdoedd COM rhithwir wedi'u ffurfweddu gan ddefnyddio'r cyfleustodau gosod o'r pecyn com0com (fersiwn consol - C: Ffeiliau Rhaglen (x86) com0comsetupс.exe, neu fersiwn GUI - C: Ffeiliau Rhaglen (x86) com0comsetupg.exe):

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Gwiriwch y blychau galluogi gor-redeg byffer ar gyfer pob porthladd rhithwir a grëwyd, fel arall bydd yr efelychydd yn aros am ymateb gan y porthladd COM.

Defnyddio socat

Ar systemau UNIX, mae pyrth COM rhithwir yn cael eu creu yn awtomatig gan yr efelychydd gan ddefnyddio'r cyfleustodau socat; i wneud hyn, nodwch y rhagddodiad yn enw'r porthladd wrth gychwyn yr efelychydd socat:.

Rhyngwyneb llinell orchymyn mewnol (Argparse neu Python)

Gan fod Kopycat yn gymhwysiad consol, mae'r efelychydd yn darparu dau opsiwn rhyngwyneb llinell orchymyn ar gyfer rhyngweithio â'i wrthrychau a'i newidynnau: Argparse a Python.

Mae Argparse yn CLI sydd wedi'i ymgorffori yn Kopycat ac mae bob amser ar gael i bawb.

CLI amgen yw cyfieithydd Python. Er mwyn ei ddefnyddio, mae angen i chi osod y modiwl Jep Python a ffurfweddu'r efelychydd i weithio gyda Python (bydd y cyfieithydd Python sydd wedi'i osod ar brif system y defnyddiwr yn cael ei ddefnyddio).

Gosod y modiwl Python Jep

O dan Linux Jep gellir ei osod trwy pip:

pip install jep

I osod Jep ar Windows, yn gyntaf rhaid i chi osod y Windows SDK a'r Microsoft Visual Studio cyfatebol. Rydym wedi ei gwneud ychydig yn haws i chi a WHL yn adeiladu JEP ar gyfer fersiynau cyfredol o Python ar gyfer Windows, felly gellir gosod y modiwl o'r ffeil:

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

I wirio gosod Jep, mae angen i chi redeg ar y llinell orchymyn:

python -c "import jep"

Dylid derbyn y neges ganlynol mewn ymateb:

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

Yn y ffeil swp efelychydd ar gyfer eich system (copicat.bat - ar gyfer Windows, copicat - ar gyfer Linux) i'r rhestr o baramedrau DEFAULT_JVM_OPTS ychwanegu paramedr ychwanegol Djava.library.path - rhaid iddo gynnwys y llwybr i'r modiwl Jep sydd wedi'i osod.

Dylai'r canlyniad ar gyfer Windows fod yn llinell fel hyn:

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

Lansio Kopycat

Mae'r efelychydd yn gymhwysiad consol JVM. Cynhelir y lansiad trwy sgript llinell orchymyn y system weithredu (sh/cmd).

Gorchymyn i redeg o dan Windows:

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

Gorchymyn i redeg o dan Linux gan ddefnyddio'r cyfleustodau 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 — Porth TCP a fydd ar agor ar gyfer mynediad i'r gweinydd GDB;
  • -n rhino — enw modiwl y brif system (dyfais wedi'i chydosod);
  • -l user — enw'r llyfrgell i chwilio am y prif fodiwl;
  • -y library — llwybr i chwilio am fodiwlau sydd wedi'u cynnwys yn y ddyfais;
  • firmwarerhino_pass.bin - llwybr i'r ffeil firmware;
  • Mae COM26 a COM28 yn borthladdoedd COM rhithwir.

O ganlyniad, bydd anogwr yn cael ei arddangos Python > (Neu 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 >

Rhyngweithio ag IDA Pro

Er mwyn symleiddio'r profion, rydym yn defnyddio'r firmware Rhino fel y ffeil ffynhonnell i'w dadansoddi yn IDA ar y ffurf Ffeil ELF (mae gwybodaeth meta yn cael ei storio yno).

Gallwch hefyd ddefnyddio'r prif firmware heb wybodaeth meta.

Ar ôl lansio Kopycat yn IDA Pro, yn y ddewislen Debugger ewch i'r eitem “Newid dadfygiwr…"A dewis"Dadfygiwr GDB o bell" . Nesaf, sefydlwch y cysylltiad: ddewislen Dadfygiwr - Opsiynau prosesu…

Gosodwch y gwerthoedd:

  • Cais - unrhyw werth
  • Enw gwesteiwr: 127.0.0.1 (neu gyfeiriad IP y peiriant anghysbell lle mae Kopycat yn rhedeg)
  • Port: 23946

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Nawr mae'r botwm dadfygio ar gael (allwedd F9):

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Cliciwch arno i gysylltu â'r modiwl dadfygiwr yn yr efelychydd. IDA yn mynd i'r modd debugging, ffenestri ychwanegol yn dod ar gael: gwybodaeth am gofrestrau, am y pentwr.

Nawr gallwn ddefnyddio holl nodweddion safonol y dadfygiwr:

  • gweithredu cyfarwyddiadau cam wrth gam (Camu i mewn и Camwch drosodd — allweddi F7 a F8, yn y drefn honno);
  • dechrau ac oedi gweithredu;
  • creu torbwyntiau ar gyfer cod a data (allwedd F2).

Nid yw cysylltu â dadfygiwr yn golygu rhedeg y cod firmware. Rhaid i'r sefyllfa weithredu bresennol fod y cyfeiriad 0x08006A74 - dechrau swyddogaeth Ailosod_Triniwr. Os sgroliwch i lawr y rhestriad, gallwch weld yr alwad swyddogaeth prif. Gallwch chi osod y cyrchwr ar y llinell hon (cyfeiriad 0x08006ABE) a chyflawni'r llawdriniaeth Rhedeg nes cyrchwr (allwedd F4).

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Nesaf, gallwch bwyso F7 i fynd i mewn i'r swyddogaeth prif.

Os ydych chi'n rhedeg y gorchymyn Parhau â'r broses (Allwedd F9), yna bydd y ffenestr “Arhoswch os gwelwch yn dda” yn ymddangos gydag un botwm Seibio:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Pan fyddwch chi'n pwyso Seibio Mae gweithrediad y cod firmware wedi'i atal a gellir ei barhau o'r un cyfeiriad yn y cod lle cafodd ei dorri.

Os byddwch yn parhau i weithredu'r cod, fe welwch y llinellau canlynol yn y terfynellau sy'n gysylltiedig â'r porthladdoedd COM rhithwir:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Mae presenoldeb y llinell “ffordd osgoi cyflwr” yn nodi bod y modiwl rhithwir Bluetooth wedi newid i'r modd o dderbyn data o borthladd COM y defnyddiwr.

Nawr yn y derfynell Bluetooth (COM29 yn y llun) gallwch chi nodi gorchmynion yn unol â'r protocol Rhino. Er enghraifft, bydd y gorchymyn “MEOW” yn dychwelyd y llinyn “mur-mur” i'r derfynell Bluetooth:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Efelychwch fi ddim yn llwyr

Wrth adeiladu efelychydd, gallwch ddewis lefel manylder / efelychiad dyfais benodol. Er enghraifft, gellir efelychu'r modiwl Bluetooth mewn gwahanol ffyrdd:

  • mae'r ddyfais wedi'i hefelychu'n llawn gyda set lawn o orchmynion;
  • Mae gorchmynion AT yn cael eu hefelychu, a derbynnir y llif data o borthladd COM y brif system;
  • mae'r ddyfais rithwir yn darparu ailgyfeirio data cyflawn i'r ddyfais go iawn;
  • fel bonyn syml sydd bob amser yn dychwelyd "OK".

Mae fersiwn gyfredol yr efelychydd yn defnyddio'r ail ddull - mae'r modiwl rhithwir Bluetooth yn perfformio cyfluniad, ac ar ôl hynny mae'n newid i'r modd o “ddirprwyo” data o borthladd COM y brif system i borthladd UART yr efelychydd.

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Gadewch i ni ystyried y posibilrwydd o offeryniaeth syml o'r cod rhag ofn na chaiff rhan o'r cyrion ei gweithredu. Er enghraifft, os nad yw amserydd sy'n gyfrifol am reoli trosglwyddo data i DMA wedi'i greu (gwiriad yn y swyddogaeth ws2812b_aroslleoli yn 0x08006840), yna bydd y firmware bob amser yn aros i'r faner gael ei ailosod prysurlleoli yn 0x200004C4sy'n dangos deiliadaeth y llinell ddata DMA:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Gallwn fynd o gwmpas y sefyllfa hon trwy ailosod y faner â llaw prysur yn syth ar ôl ei osod. Yn IDA Pro, gallwch greu swyddogaeth Python a'i alw mewn torbwynt, a rhoi'r torbwynt ei hun yn y cod ar ôl ysgrifennu'r gwerth 1 i'r faner prysur.

Triniwr torbwynt

Yn gyntaf, gadewch i ni greu swyddogaeth Python yn IDA. Bwydlen Ffeil - Gorchymyn Sgript...

Ychwanegu pyt newydd yn y rhestr ar y chwith, rhowch enw iddo (er enghraifft, BPT),
Yn y maes testun ar y dde, rhowch y cod swyddogaeth:

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

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Ar ôl hynny, cliciwch Run a chau ffenestr y sgript.

Nawr, gadewch i ni fynd at y cod yn 0x0800688A, gosod torbwynt (allwedd F2), ei olygu (dewislen cyd-destun Golygu torbwynt...), peidiwch ag anghofio gosod y math o sgript i Python:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat
Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Os yw'r gwerth baner presennol prysur yn hafal i 1, yna dylech gyflawni'r swyddogaeth sgip_dma yn y llinell sgript:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Os ydych chi'n rhedeg y firmware i'w weithredu, yna gellir gweld sbardun cod y triniwr torbwynt yn y ffenestr IDA Allbwn fesul llinell Skipping wait ws2812.... Nawr ni fydd y firmware yn aros i'r faner gael ei ailosod prysur.

Rhyngweithio â'r efelychydd

Nid yw efelychu er mwyn efelychu yn debygol o achosi hyfrydwch a llawenydd. Mae'n llawer mwy diddorol os yw'r efelychydd yn helpu'r ymchwilydd i weld y data yn y cof neu sefydlu rhyngweithiad edafedd.

Byddwn yn dangos i chi sut i sefydlu rhyngweithio deinamig rhwng tasgau RTOS. Yn gyntaf, dylech oedi cyn gweithredu'r cod os yw'n rhedeg. Os ewch chi i'r swyddogaeth bluetooth_task_mynediad i gangen brosesu'r gorchymyn “LED” (cyfeiriad 0x080057B8), yna gallwch weld beth sy'n cael ei greu gyntaf ac yna ei anfon i'r ciw system ledControlQueueHandle rhyw neges.

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Dylech osod torbwynt i gael mynediad i'r newidyn ledControlQueueHandlelleoli yn 0x20000624 a pharhau i weithredu'r cod:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

O ganlyniad, bydd y stop yn digwydd gyntaf yn y cyfeiriad 0x080057CA cyn galw'r swyddogaeth osMailAlloc, yna yn y cyfeiriad 0x08005806 cyn galw'r swyddogaeth osMailPut, yna ar ôl ychydig - i'r cyfeiriad 0x08005BD4 (cyn galw'r swyddogaeth osMailGet), sy'n perthyn i'r swyddogaeth leds_task_mynediad (LED-tasg), hynny yw, y tasgau newid, ac yn awr y LED-dasg a dderbyniwyd rheolaeth.

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Yn y ffordd syml hon gallwch chi sefydlu sut mae tasgau RTOS yn rhyngweithio â'i gilydd.

Wrth gwrs, mewn gwirionedd, gall rhyngweithio tasgau fod yn fwy cymhleth, ond gan ddefnyddio efelychydd, mae olrhain y rhyngweithio hwn yn dod yn llai llafurus.

Yma Gallwch wylio fideo byr o'r efelychydd yn lansio ac yn rhyngweithio ag IDA Pro.

Lansio gyda Radare2

Ni allwch anwybyddu offeryn mor gyffredinol â Radare2.

I gysylltu â'r efelychydd gan ddefnyddio r2, byddai'r gorchymyn yn edrych fel hyn:

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

Lansio ar gael nawr (dc) ac oedi cyflawni (Ctrl+C).

Yn anffodus, ar hyn o bryd, mae gan r2 broblemau wrth weithio gyda'r gweinydd gdb caledwedd a chynllun cof; oherwydd hyn, nid yw torbwyntiau a Steps yn gweithio (gorchymyn ds). Gobeithiwn y bydd hyn yn cael ei drwsio yn fuan.

Rhedeg gydag Eclipse

Un o'r opsiynau ar gyfer defnyddio'r efelychydd yw dadfygio cadarnwedd y ddyfais sy'n cael ei datblygu. Er eglurder, byddwn hefyd yn defnyddio'r firmware Rhino. Gallwch chi lawrlwytho'r ffynonellau firmware felly.

Byddwn yn defnyddio Eclipse o'r set fel DRhA Mainc Gwaith System ar gyfer STM32.

Er mwyn i'r efelychydd lwytho'r firmware a luniwyd yn uniongyrchol yn Eclipse, mae angen ichi ychwanegu'r paramedr firmware=null i'r gorchymyn lansio efelychydd:

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

Sefydlu cyfluniad dadfygio

Yn Eclipse, dewiswch y ddewislen Rhedeg - Ffurfweddiadau Dadfygio... Yn y ffenestr sy'n agor, yn yr adran Dadfygio Caledwedd GDB mae angen i chi ychwanegu cyfluniad newydd, yna ar y tab “Prif” nodwch y prosiect cyfredol a'r cais am ddadfygio:

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Ar y tab “Debugger” mae angen i chi nodi'r gorchymyn GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

A hefyd nodwch y paramedrau ar gyfer cysylltu â'r gweinydd GDB (gwesteiwr a phorth):

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Ar y tab "Startup", rhaid i chi nodi'r paramedrau canlynol:

  • galluogi blwch ticio Llwytho delwedd (fel bod delwedd y firmware sydd wedi'i ymgynnull yn cael ei lwytho i'r efelychydd);
  • galluogi blwch ticio Llwyth symbolau;
  • ychwanegu gorchymyn lansio: set $pc = *0x08000004 (gosodwch y gofrestr PC i'r gwerth o'r cof yn y cyfeiriad 0x08000004 - mae'r cyfeiriad yn cael ei storio yno AilosodHandler).

Talu sylw, os nad ydych am i lawrlwytho'r ffeil firmware o Eclipse, yna yr opsiynau Llwytho delwedd и Rhedeg gorchmynion dim angen nodi.

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Ar ôl clicio Debug, gallwch weithio yn y modd dadfygiwr:

  • gweithredu cod cam wrth gam
    Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat
  • rhyngweithio â thorbwyntiau
    Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Nodyn. Mae gan Eclipse, hmm... ambell quirks... ac mae'n rhaid i chi fyw gyda nhw. Er enghraifft, os yw'r neges “Dim ffynhonnell ar gael ar gyfer “0x0″” yn ymddangos wrth gychwyn y dadfygiwr, yna gweithredwch y gorchymyn Cam (F5)

Rhinoseros y tu mewn i gath - rhedeg y firmware yn yr efelychydd Kopycat

Yn hytrach na i gasgliad

Mae efelychu cod brodorol yn beth diddorol iawn. Mae'n dod yn bosibl i ddatblygwr dyfais ddadfygio'r firmware heb ddyfais go iawn. I ymchwilydd, mae'n gyfle i gynnal dadansoddiad cod deinamig, nad yw bob amser yn bosibl hyd yn oed gyda dyfais.

Rydym am ddarparu offeryn cyfleus, gweddol syml i arbenigwyr ac nad yw'n cymryd llawer o ymdrech ac amser i'w sefydlu a'i redeg.

Ysgrifennwch y sylwadau am eich profiad gan ddefnyddio efelychwyr caledwedd. Rydym yn eich gwahodd i drafod a byddwn yn hapus i ateb cwestiynau.

Dim ond defnyddwyr cofrestredig all gymryd rhan yn yr arolwg. Mewngofnodios gwelwch yn dda.

Ar gyfer beth ydych chi'n defnyddio'r efelychydd?

  • Rwy'n datblygu (debug) firmware

  • Yr wyf yn ymchwilio cadarnwedd

  • Rwy'n lansio gemau (Dendi, Sega, PSP)

  • rhywbeth arall (ysgrifennwch yn y sylwadau)

Pleidleisiodd 7 o ddefnyddwyr. Ymataliodd 2 o ddefnyddwyr.

Pa feddalwedd ydych chi'n ei ddefnyddio i efelychu cod brodorol?

  • QEMU

  • Injan unicorn

  • Proteus

  • rhywbeth arall (ysgrifennwch yn y sylwadau)

Pleidleisiodd 6 o ddefnyddwyr. Ymataliodd 2 o ddefnyddwyr.

Beth hoffech chi ei wella yn yr efelychydd rydych chi'n ei ddefnyddio?

  • Dwi eisiau cyflymder

  • Dwi eisiau rhwyddineb gosod/lansio

  • Dwi eisiau mwy o opsiynau ar gyfer rhyngweithio gyda'r efelychydd (API, bachau)

  • Rwy'n hapus gyda phopeth

  • rhywbeth arall (ysgrifennwch yn y sylwadau)

Pleidleisiodd 8 o ddefnyddwyr. Ymatalodd 1 defnyddiwr.

Ffynhonnell: hab.com

Ychwanegu sylw