Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Sem hluti af fundinum 0x0A DC7831 DEF CON Nizhny Novgorod Þann 16. febrúar kynntum við skýrslu um grundvallarreglur tvíundarkóðahermi og eigin þróun okkar - vélbúnaðarvettvangshermi. Copycat.

Í þessari grein munum við lýsa því hvernig á að keyra fastbúnað tækisins í keppinautnum, sýna fram á samskipti við kembiforritið og framkvæma smá kraftmikla greiningu á fastbúnaðinum.

Forsaga

Langt síðan í vetrarbraut langt langt í burtu

Fyrir nokkrum árum á rannsóknarstofu okkar var þörf á að rannsaka fastbúnað tækis. Fastbúnaðinum var þjappað og pakkað upp með ræsiforriti. Hann gerði þetta á mjög flókinn hátt og færði gögnin í minni nokkrum sinnum. Og vélbúnaðinn sjálfur hafði síðan virkan samskipti við jaðartækin. Og allt þetta á MIPS kjarnanum.

Af hlutlægum ástæðum hentuðu tiltækir hermir okkur ekki, en við vildum samt keyra kóðann. Síðan ákváðum við að búa til okkar eigin keppinaut, sem myndi gera lágmarkið og gera okkur kleift að taka upp aðal fastbúnaðinn. Við prófuðum það og það virkaði. Við hugsuðum, hvað ef við bætum við jaðartækjum til að framkvæma einnig aðal fastbúnaðinn. Það var ekki mjög sárt - og það tókst líka. Við hugsuðum aftur og ákváðum að búa til fullgildan hermir.

Útkoman var tölvukerfahermi Copycat.

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum
Af hverju Kopycat?

Þar er leikið að orðum.

  1. apaköttur (enska, nafnorð [ˈkɒpɪkæt]) - eftirherma, eftirherma
  2. köttur (enska, nafnorð [ˈkæt]) - köttur, köttur - uppáhaldsdýr eins af höfundum verkefnisins
  3. Stafurinn „K“ er frá Kotlin forritunarmálinu

Copycat

Þegar keppinauturinn var búinn til voru mjög ákveðin markmið sett:

  • getu til að búa til fljótt ný jaðartæki, einingar, örgjörvakjarna;
  • getu til að setja saman sýndartæki úr ýmsum einingum;
  • getu til að hlaða hvaða tvíundargögnum (fastbúnaði) sem er í minni sýndartækis;
  • hæfni til að vinna með skyndimyndir (myndir af kerfisástandi);
  • getu til að hafa samskipti við keppinautinn í gegnum innbyggða villuleitarforritið;
  • gott nútímamál fyrir þroska.

Fyrir vikið var Kotlin valinn fyrir innleiðingu, strætóarkitektúrinn (þetta er þegar einingar hafa samskipti sín á milli í gegnum sýndargagnarútur), JSON sem tækjalýsingarsnið og GDB RSP sem samskiptareglur fyrir samskipti við kembiforritið.

Þróun hefur staðið yfir í rúm tvö ár og er í fullum gangi. Á þessum tíma voru MIPS, x86, V850ES, ARM og PowerPC örgjörva kjarna útfærð.

Verkefnið fer vaxandi og það er kominn tími til að kynna það fyrir almenningi. Við munum gera nákvæma lýsingu á verkefninu síðar, en í bili munum við einbeita okkur að því að nota Kopycat.

Fyrir þá óþolinmóðustu er hægt að hlaða niður kynningarútgáfu af keppinautnum frá tengill.

Rhino í keppinautnum

Við skulum minnast þess að fyrr fyrir SMARTRHINO-2018 ráðstefnuna var búið til prófunartæki „Rhinoceros“ til að kenna öfugt verkfræðikunnáttu. Ferli kyrrstöðugreiningar fastbúnaðar var lýst í Þessi grein.

Nú skulum við reyna að bæta við „hátölurum“ og keyra fastbúnaðinn í keppinautnum.

Við munum þurfa:
1) Java 1.8
2) Python og mát Jebb að nota Python inni í keppinautnum. Þú getur smíðað WHL eininguna Jep fyrir Windows sækja hér.

Fyrir Windows:
1) com0com
2) PUTTY

Fyrir Linux:
1) socat

Þú getur notað Eclipse, IDA Pro eða radare2 sem GDB viðskiptavin.

Hvernig virkar það?

Til þess að framkvæma fastbúnað í keppinautnum er nauðsynlegt að „setja saman“ sýndartæki, sem er hliðstæða raunverulegs tækis.

Raunverulega tækið („nashyrningur“) er hægt að sýna á blokkarmyndinni:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Keppinauturinn er með mátbyggingu og endanlegu sýndartækinu er hægt að lýsa í JSON skrá.

JSON 105 línur

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

Gefðu gaum að færibreytunni vélbúnaðar kafla params er nafn skráar sem hægt er að hlaða inn í sýndartæki sem fastbúnað.

Sýndartækið og samskipti þess við aðalstýrikerfið má tákna með eftirfarandi skýringarmynd:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Núverandi prófunartilvik keppinautarins felur í sér samskipti við COM-tengi aðalstýrikerfisins (kemba UART og UART fyrir Bluetooth-eininguna). Þetta geta verið raunveruleg tengi sem tæki eru tengd við eða sýndar COM tengi (til þess þarftu bara com0com/socat).

Sem stendur eru tvær meginleiðir til að hafa samskipti við keppinautinn utan frá:

  • GDB RSP samskiptareglur (samkvæmt því eru verkfærin sem styðja þessa samskiptareglu Eclipse / IDA / radare2);
  • innri hermir skipanalína (Argparse eða Python).

Sýndar COM tengi

Til þess að hafa samskipti við UART sýndartækis á staðbundinni vél í gegnum flugstöð þarftu að búa til par af tengdum sýndar COM tengi. Í okkar tilviki er ein höfn notuð af keppinautnum og önnur er notuð af flugstöðvum (PuTTY eða skjár):

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Notar com0com

Sýndar COM tengi eru stillt með uppsetningarforritinu úr com0com settinu (leikjaútgáfa - C:Program Files (x86)com0comsetupс.exe, eða GUI útgáfa - C:Program Files (x86)com0comsetupg.exe):

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Merktu við reitina virkja umframkeyrslu á biðminni fyrir allar búnar sýndarhöfn, annars bíður keppinauturinn eftir svari frá COM tenginu.

Notar socat

Í UNIX kerfum eru sýndar COM tengi sjálfkrafa búin til af keppinautinum með því að nota socat tólið; til að gera þetta skaltu bara tilgreina forskeytið í gáttarheitinu þegar keppinauturinn er ræstur socat:.

Innra skipanalínuviðmót (Argparse eða Python)

Þar sem Kopycat er stjórnborðsforrit, býður keppinauturinn upp á tvo skipanalínuviðmótsvalkosti til að hafa samskipti við hluti sína og breytur: Argparse og Python.

Argparse er CLI innbyggt í Kopycat og er alltaf í boði fyrir alla.

Annar CLI er Python túlkurinn. Til að nota það þarftu að setja upp Jep Python eininguna og stilla keppinautinn til að vinna með Python (Python túlkurinn sem er uppsettur á aðalkerfi notandans verður notaður).

Uppsetning Python einingarinnar Jep

Undir Linux er hægt að setja Jep upp í gegnum pip:

pip install jep

Til að setja Jep upp á Windows verður þú fyrst að setja upp Windows SDK og samsvarandi Microsoft Visual Studio. Við höfum gert það aðeins auðveldara fyrir þig og WHL byggir JEP fyrir núverandi útgáfur af Python fyrir Windows, þannig að hægt er að setja eininguna upp úr skránni:

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

Til að athuga uppsetningu Jep þarftu að keyra á skipanalínunni:

python -c "import jep"

Eftirfarandi skilaboð ættu að berast sem svar:

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

Í keppinautaskránni fyrir kerfið þitt (copycat.bat - fyrir Windows, eftirlíking - fyrir Linux) á lista yfir færibreytur DEFAULT_JVM_OPTS bæta við viðbótarfæribreytu Djava.library.path — það verður að innihalda slóðina að uppsettu Jep einingunni.

Útkoman fyrir Windows ætti að vera lína eins og þessi:

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

Ræsir Kopycat

Keppinauturinn er console JVM forrit. Ræsingin fer fram í gegnum stýrikerfisskipanalínuforskriftina (sh/cmd).

Skipun til að keyra undir Windows:

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

Skipun til að keyra undir Linux með því að nota socat tólið:

./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 tengi sem verður opið fyrir aðgang að GDB netþjóninum;
  • -n rhino — heiti aðalkerfiseiningarinnar (samsett tæki);
  • -l user — nafn bókasafnsins til að leita að aðaleiningunni;
  • -y library — leið til að leita að einingum sem fylgja tækinu;
  • firmwarerhino_pass.bin — slóð að vélbúnaðarskránni;
  • COM26 og COM28 eru sýndar COM tengi.

Fyrir vikið birtist kvaðningur Python > (Eða 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 >

Samskipti við IDA Pro

Til að einfalda prófun notum við Rhino vélbúnaðinn sem frumskrá fyrir greiningu í IDA í formi ELF skrá (Metaupplýsingar eru geymdar þar).

Þú getur líka notað aðal fastbúnaðinn án metaupplýsinga.

Eftir að Kopycat hefur verið ræst í IDA Pro, í kembiforritinu, farðu í hlutinn "Skipta um villuleit..." og veldu "Fjarlægur GDB kembiforrit". Næst skaltu setja upp tenginguna: valmyndina Villuleitarforrit - vinnsluvalkostir...

Stilltu gildin:

  • Umsókn - hvaða gildi sem er
  • Hýsingarheiti: 127.0.0.1 (eða IP tölu ytri vélarinnar þar sem Kopycat er í gangi)
  • Port: 23946

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Nú verður villuleitarhnappurinn tiltækur (F9 lykill):

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Smelltu á það til að tengjast villuleitareiningunni í keppinautnum. IDA fer í villuleitarham, fleiri gluggar verða tiltækir: upplýsingar um skrár, um stafla.

Nú getum við notað alla staðlaða eiginleika kembiforritsins:

  • skref fyrir skref framkvæmd leiðbeininga (Stígðu inní и Stígðu yfir — lyklar F7 og F8, í sömu röð);
  • hefja og gera hlé á framkvæmd;
  • búa til brotpunkta fyrir bæði kóða og gögn (F2 lykill).

Að tengja við villuleit þýðir ekki að keyra vélbúnaðarkóðann. Núverandi aftökustaða verður að vera heimilisfangið 0x08006A74 — upphaf aðgerða Reset_Handler. Ef þú flettir niður skráninguna geturðu séð aðgerðarkallið helstu. Þú getur sett bendilinn á þessa línu (heimilisfang 0x08006ABE) og framkvæma aðgerðina Hlaupa þar til bendilinn (lykill F4).

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Næst geturðu ýtt á F7 til að slá inn aðgerðina helstu.

Ef þú keyrir skipunina Halda áfram ferli (F9 lykill), þá birtist glugginn „Vinsamlegast bíðið“ með einum hnappi fresta:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Þegar þú ýtir á fresta framkvæmd vélbúnaðarkóða er stöðvuð og hægt er að halda áfram frá sama heimilisfangi í kóðanum þar sem það var truflað.

Ef þú heldur áfram að keyra kóðann muntu sjá eftirfarandi línur í skautunum sem eru tengdar við sýndar COM tengi:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Tilvist „state bypass“ línunnar gefur til kynna að sýndar Bluetooth-einingin hafi skipt yfir í þann hátt að taka á móti gögnum frá COM-tengi notandans.

Nú í Bluetooth útstöðinni (COM29 á myndinni) geturðu slegið inn skipanir í samræmi við Rhino samskiptareglur. Til dæmis mun „MEOW“ skipunin skila strengnum „mur-mur“ í Bluetooth-stöðina:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Herma mig ekki alveg

Þegar þú byggir keppinaut geturðu valið smáatriði/eftirlíkingu tiltekins tækis. Til dæmis er hægt að líkja eftir Bluetooth-einingunni á mismunandi vegu:

  • tækið er að fullu líkt eftir með fullt sett af skipunum;
  • AT skipanir eru herma eftir og gagnastraumurinn er móttekinn frá COM tengi aðalkerfisins;
  • sýndartækið veitir fullkomna gagnaflutning til raunverulegs tækis;
  • sem einfaldur stubbur sem skilar alltaf "OK".

Núverandi útgáfa af keppinautnum notar aðra nálgunina - sýndar-Bluetooth-einingin framkvæmir stillingar, eftir það skiptir hún yfir í „umboðsstillingu“ gagna frá COM-tengi aðalkerfisins yfir í UART-tengi keppinautarins.

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Við skulum íhuga möguleikann á einföldum tækjabúnaði kóðans ef einhver hluti jaðarsins er ekki útfærður. Til dæmis, ef tímamælir sem ber ábyrgð á að stjórna gagnaflutningi til DMA hefur ekki verið búinn til (athugunin er framkvæmd í aðgerðinni ws2812b_bíddustaðsett á 0x08006840), þá mun fastbúnaðurinn alltaf bíða eftir að fáninn verði endurstilltur upptekinnstaðsett á 0x200004C4sem sýnir umráð DMA gagnalínunnar:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Við getum komist í kringum þessar aðstæður með því að endurstilla fánann handvirkt upptekinn strax eftir uppsetningu. Í IDA Pro geturðu búið til Python fall og kallað það í brotpunkt og sett brotpunktinn sjálfan í kóðann eftir að hafa skrifað gildið 1 í fánann upptekinn.

Brotpunktastjórnun

Fyrst skulum við búa til Python aðgerð í IDA. Matseðill File - Script skipun...

Bættu við nýjum búti í listann til vinstri, gefðu honum nafn (td. BPT),
Í textareitnum til hægri, sláðu inn aðgerðakóðann:

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

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Eftir það ýtum við á Hlaupa og lokaðu handritsglugganum.

Nú skulum við fara í kóðann kl 0x0800688A, stilltu brotpunkt (F2 lykill), breyttu því (samhengisvalmynd Breyta brotpunkti...), ekki gleyma að stilla handritsgerðina á Python:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum
Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Ef núverandi fánagildi upptekinn jafngildir 1, þá ættir þú að framkvæma aðgerðina skip_dma í handritslínunni:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Ef þú keyrir fastbúnaðinn til keyrslu geturðu séð kveikjuna á brotpunktastjórnunarkóðanum í IDA glugganum Output eftir línu Skipping wait ws2812.... Nú mun fastbúnaðurinn ekki bíða eftir að fáninn verði endurstilltur upptekinn.

Samskipti við keppinautinn

Ólíklegt er að eftirlíking til eftirbreytni valdi gleði og gleði. Það er miklu áhugaverðara ef keppinauturinn hjálpar rannsakandanum að sjá gögnin í minni eða koma á samspili þráða.

Við munum sýna þér hvernig á að koma á virkum samskiptum milli RTOS verkefna. Þú ættir fyrst að gera hlé á keyrslu kóðans ef hann er í gangi. Ef þú ferð í aðgerðina bluetooth_task_entry í vinnslugrein „LED“ skipunarinnar (heimilisfang 0x080057B8), þá geturðu séð hvað er fyrst búið til og síðan sent í kerfisröðina ledControlQueueHandle einhver skilaboð.

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Þú ættir að setja brotpunkt til að fá aðgang að breytunni ledControlQueueHandlestaðsett á 0x20000624 og haltu áfram að keyra kóðann:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Þar af leiðandi mun stöðvunin fyrst eiga sér stað á heimilisfangi 0x080057CA áður en þú hringir í aðgerðina osMailAlloc, síðan á heimilisfangið 0x08005806 áður en þú hringir í aðgerðina osMailPut, svo eftir smá stund - á heimilisfangið 0x08005BD4 (áður en þú hringir í aðgerðina osMailGet), sem tilheyrir fallinu leds_task_entry (LED-verkefni), það er að segja að skipt var um verkefni, og nú fékk LED-verkefnið stjórn.

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Á þennan einfalda hátt geturðu komist að því hvernig RTOS verkefni hafa samskipti sín á milli.

Auðvitað, í raun og veru, getur samspil verkefna verið flóknara, en með því að nota keppinaut verður það minna fyrirhafnarsamt að fylgjast með þessu samspili.

Тут Þú getur horft á stutt myndband af keppinautnum sem er ræstur og hefur samskipti við IDA Pro.

Ræstu með Radare2

Þú getur ekki hunsað svona alhliða tól eins og Radare2.

Til að tengjast keppinautnum með r2 myndi skipunin líta svona út:

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

Ræsing í boði núna (dc) og gera hlé á framkvæmd (Ctrl+C).

Því miður, eins og er, á r2 í vandræðum þegar unnið er með gdb vélbúnaðarþjóninum og minnisuppsetningu; vegna þessa virka brotpunktar og skref ekki (skipun ds). Við vonum að þetta verði lagað fljótlega.

Að keyra með Eclipse

Einn af valkostunum til að nota keppinautinn er að kemba vélbúnaðar tækisins sem verið er að þróa. Til glöggvunar munum við einnig nota Rhino vélbúnaðinn. Þú getur halað niður vélbúnaðarheimildum þess vegna.

Við munum nota Eclipse úr settinu sem IDE Kerfisvinnubekkur fyrir STM32.

Til þess að keppinauturinn geti hlaðið fastbúnaði beint saman í Eclipse þarftu að bæta við breytu firmware=null í ræsingarskipun keppinautarins:

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

Að setja upp villuleitarstillingar

Í Eclipse skaltu velja valmyndina Keyra - villuleitarstillingar... Í glugganum sem opnast, í hlutanum GDB vélbúnaðar villuleit þú þarft að bæta við nýrri stillingu, síðan á „Aðal“ flipanum tilgreindu núverandi verkefni og forrit fyrir villuleit:

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Á flipanum „Kembiforrit“ þarftu að tilgreina GDB skipunina:
${openstm32_compiler_path}arm-none-eabi-gdb

Og sláðu líka inn færibreytur fyrir tengingu við GDB netþjóninn (gestgjafi og höfn):

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Á „Startup“ flipanum verður þú að tilgreina eftirfarandi færibreytur:

  • virkja gátreitinn Hlaða mynd (svo að samsetta vélbúnaðarmyndinni sé hlaðið inn í keppinautinn);
  • virkja gátreitinn Hlaða tákn;
  • bæta við ræsiskipun: set $pc = *0x08000004 (stilltu tölvuskrána á gildið úr minni á heimilisfangi 0x08000004 - heimilisfangið er geymt þar ResetHandler).

Borgaðu eftirtekt, ef þú vilt ekki hlaða niður vélbúnaðarskránni frá Eclipse, þá eru valkostirnir Hlaða mynd и Keyra skipanir óþarfi að gefa til kynna.

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Eftir að hafa smellt á Debug geturðu unnið í villuleitarham:

  • skref fyrir skref kóða framkvæmd
    Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum
  • samskipti við brotpunkta
    Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Athugið. Eclipse hefur, hmm... nokkra sérkenni... og þú verður að lifa með þeim. Til dæmis, ef þegar kembiforritið er ræst birtast skilaboðin „Engin uppspretta tiltæk fyrir „0x0″“, þá skaltu framkvæma Step skipunina (F5)

Nashyrningur inni í kötti - keyrðu fastbúnaðinn í Kopycat keppinautnum

Í stað þess að niðurstöðu

Að líkja eftir innfæddum kóða er mjög áhugavert. Það verður mögulegt fyrir tækjaframleiðanda að kemba fastbúnaðinn án raunverulegs tækis. Fyrir rannsakanda er það tækifæri til að framkvæma kraftmikla kóðagreiningu, sem er ekki alltaf mögulegt jafnvel með tæki.

Við viljum veita sérfræðingum tæki sem er þægilegt, í meðallagi einfalt og tekur ekki mikla fyrirhöfn og tíma að setja upp og keyra.

Skrifaðu í athugasemdirnar um reynslu þína af því að nota vélbúnaðarhermi. Við hvetjum þig til að ræða málin og svörum með ánægju spurningum.

Aðeins skráðir notendur geta tekið þátt í könnuninni. Skráðu þig inn, takk.

Í hvað ertu að nota emulator?

  • Ég þróa (kemba) fastbúnað

  • Ég er að rannsaka fastbúnað

  • Ég kynni leiki (Dendi, Sega, PSP)

  • eitthvað annað (skrifaðu í athugasemdir)

7 notendur greiddu atkvæði. 2 notendur sátu hjá.

Hvaða hugbúnað notar þú til að líkja eftir innfæddum kóða?

  • QEMU

  • Unicorn vél

  • Proteus

  • eitthvað annað (skrifaðu í athugasemdir)

6 notendur greiddu atkvæði. 2 notendur sátu hjá.

Hvað viltu bæta í hermi sem þú ert að nota?

  • Ég vil hraða

  • Ég vil auðvelda uppsetningu/ræsingu

  • Ég vil fleiri möguleika til að hafa samskipti við keppinautinn (API, krókar)

  • Ég er ánægður með allt

  • eitthvað annað (skrifaðu í athugasemdir)

8 notendur kusu. 1 notandi sat hjá.

Heimild: www.habr.com

Bæta við athugasemd