Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ma ke ʻano o ka hālāwai 0x0A DC7831 DEF CON Nizhny Novgorod Ma ka lā 16 o Pepeluali, ua hōʻike mākou i kahi hōʻike e pili ana i nā loina kumu o ka hoʻohālikelike code binary a me kā mākou hoʻomohala ponoʻī - he emulator platform hardware. kope kope.

Ma kēia ʻatikala e wehewehe mākou i ka holo ʻana o ka polokalamu firmware i ka emulator, hōʻike i ka pilina me ka debugger, a hana i kahi loiloi liʻiliʻi o ka firmware.

prehistory

He wā lōʻihi i hala ma kahi galaxy mamao loa

ʻElua mau makahiki i hala aku nei i loko o kā mākou hale hana pono e noiʻi i ka firmware o kahi hāmeʻa. Hoʻopili ʻia ka firmware a wehe ʻia me kahi bootloader. Ua hana ʻo ia i kēia ma kahi ala paʻakikī, hoʻololi i ka ʻikepili i ka hoʻomanaʻo i nā manawa he nui. A ʻo ka firmware ponoʻī i hui pū me nā peripheral. A ʻo kēia mau mea āpau ma ka MIPS core.

No nā kumu kumu, ʻaʻole kūpono nā emulators i loaʻa iā mākou, akā makemake mākou e holo i ke code. A laila ua hoʻoholo mākou e hana i kā mākou emulator ponoʻī, e hana i ka mea liʻiliʻi a ʻae iā mākou e wehe i ka firmware nui. Ua ho'āʻo mākou a ua hana. Ua manaʻo mākou, inā mākou e hoʻohui i nā peripheral e hana pū i ka firmware nui. ʻAʻole i ʻeha loa - a ua hana pū kekahi. Noʻonoʻo hou mākou a hoʻoholo e hana i kahi emulator piha.

ʻO ka hopena he emulator ʻōnaehana kamepiula kope kope.

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat
No ke aha ʻo Kopycat?

He pāʻani ma nā huaʻōlelo.

  1. kope kope (English, noun [ˈkɒpɪkæt]) - mea hoʻohālike, hoʻohālike
  2. popoki (English, noun [ˈkæt]) - pōpoki, pōpoki - ka holoholona punahele a kekahi o nā mea nāna i hana i ka papahana.
  3. ʻO ka leka "K" mai ka ʻōlelo papahana Kotlin

kope kope

I ka hana ʻana i ka emulator, ua hoʻonohonoho ʻia nā pahuhopu kikoʻī:

  • ka hiki ke hana wikiwiki i nā peripheral hou, nā modules, nā cores processor;
  • ka hiki ke hōʻuluʻulu i kahi mea virtual mai nā modula like ʻole;
  • ka hiki ke hoʻouka i kekahi ʻikepili binary (firmware) i loko o ka hoʻomanaʻo ʻana o kahi hāmeʻa virtual;
  • hiki ke hana me nā kiʻi paʻi kiʻi (nā kiʻi o ke kūlana ʻōnaehana);
  • ka hiki ke launa pū me ka emulator ma o ka debugger i kūkulu ʻia;
  • maikaʻi ka ʻōlelo hou no ka hoʻomohala ʻana.

ʻO ka hopena, ua koho ʻia ʻo Kotlin no ka hoʻokō ʻana, ka hale kaʻa kaʻa (ʻo ia ka manawa e kamaʻilio pū ai nā modules me kekahi ma o nā kaʻa ʻikepili virtual), ʻo JSON ke ʻano wehewehe wehewehe ʻana, a me GDB RSP ma ke ʻano he protocol no ka launa pū me ka debugger.

Ke hoʻomau nei ka hoʻomohala ʻana ma mua o ʻelua makahiki a ke hoʻomau nei. I loko o kēia manawa, ua hoʻokō ʻia nā cores MIPS, x86, V850ES, ARM, a me PowerPC.

Ke ulu nei ka papahana a ʻo ka manawa kēia e hōʻike aku ai i ka lehulehu. E hana mākou i kahi wehewehe kikoʻī o ka papahana ma hope, akā i kēia manawa e kālele mākou i ka hoʻohana ʻana iā Kopycat.

No ka poʻe hoʻomanawanui, hiki ke hoʻoiho ʻia kahi mana hoʻolaha o ka emulator mai loulou.

Rhino i ka emulator

E hoʻomanaʻo kākou i ka wā ma mua no ka hālāwai SMARTRHINO-2018, ua hana ʻia kahi mea hoʻāʻo "Rhinoceros" no ke aʻo ʻana i nā mākau ʻenekinia hoʻohuli. Ua wehewehe ʻia ke kaʻina hana o ka loiloi firmware static ma kēiaʻatikala.

I kēia manawa e ho'āʻo mākou e hoʻohui i nā "mea ʻōlelo" a holo i ka firmware i ka emulator.

E pono kāua:
1) Java 1.8
2) Python a me ka module ʻO Iep e hoʻohana i ka Python i loko o ka emulator. Hiki iā ʻoe ke kūkulu i ka module WHL Jep no Windows download maanei.

No ka Windows:
1) com0com
2) putty

No Linux:
1) socat

Hiki iā ʻoe ke hoʻohana iā Eclipse, IDA Pro a i ʻole radare2 ma ke ʻano he mea kūʻai aku GDB.

Pehea ia hana?

I mea e hoʻokō ai i ka firmware i ka emulator, pono e "hui" i kahi polokalamu virtual, kahi mea hoʻohālikelike o kahi mea maoli.

Hiki ke hōʻike ʻia ka hāmeʻa maoli (“rhino”) ma ke kiʻikuhi poloka:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

He ʻano modular ka emulator a hiki ke wehewehe ʻia ka hāmeʻa virtual hope ma kahi faila JSON.

JSON 105 laina

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

E hoʻolohe i ka ʻāpana lako polokalamu paʻa ma ka ʻāpana params ʻo ia ka inoa o kahi faila i hiki ke hoʻouka ʻia i loko o kahi mea uila e like me firmware.

Hiki ke hōʻike ʻia ka ʻōnaehana virtual a me kāna pilina me ka ʻōnaehana hana nui e ke kiʻi aʻe:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

ʻO ka hoʻāʻo ʻana i kēia manawa o ka emulator e pili ana i ka pilina me nā awa COM o ka OS nui (debug UART a me UART no ka module Bluetooth). Hiki i kēia ke lilo i mau awa maoli e pili ana i nā polokalamu a i ʻole nā ​​awa COM virtual (no kēia pono ʻoe com0com/socat).

Aia i kēia manawa ʻelua mau ala nui e launa pū me ka emulator mai waho.

  • ʻO ka protocol GDB RSP (e like me nā mea hana e kākoʻo ana i kēia protocol ʻo Eclipse / IDA / radare2);
  • laina kauoha emulator kūloko (Argparse a i ʻole Python).

Nā awa COM maʻamau

I mea e launa pū ai me ka UART o kahi mea virtual ma ka mīkini kūloko ma o kahi pahu, pono ʻoe e hana i ʻelua mau awa COM virtual pili. I kā mākou hihia, hoʻohana ʻia kahi awa e ka emulator, a ʻo ka lua e kahi papahana terminal (PuTTY a i ʻole ka pale):

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ke hoʻohana nei i ka com0com

Hoʻonohonoho ʻia nā awa COM virtual me ka hoʻohana ʻana i ka pono hoʻonohonoho mai ka com0com kit (console version - C: Nā Kōnae Papahana (x86)com0comsetupс.exe, a i ʻole ka mana GUI - C: Nā Kōnae Papahana (x86)com0comsetupg.exe):

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

E nānā i nā pahu hiki ke hoʻokuʻu ʻia no nā awa kūwaho i hana ʻia, inā ʻaʻole e kali ka emulator i ka pane mai ke awa COM.

Ke hoʻohana nei i ka socat

Ma nā ʻōnaehana UNIX, hana ʻia nā awa COM virtual e ka emulator me ka hoʻohana ʻana i ka pono socat e hana i kēia, e kuhikuhi wale i ka prefix ma ka inoa port i ka wā e hoʻomaka ai ka emulator socat:.

Ke kikowaena laina kauoha kūloko (Argparse a i ʻole Python)

ʻOiai ʻo Kopycat kahi noi console, hāʻawi ka emulator i ʻelua mau koho laina kauoha no ka launa pū ʻana me kāna mau mea a me nā ʻano hoʻololi: Argparse a me Python.

ʻO Argparse kahi CLI i kūkulu ʻia i loko o Kopycat a loaʻa mau i nā mea āpau.

ʻO kahi CLI ʻē aʻe ka unuhi ʻōlelo Python. No ka hoʻohana ʻana, pono ʻoe e hoʻokomo i ka module Jep Python a hoʻonohonoho i ka emulator e hana me Python (e hoʻohana ʻia ka unuhi unuhi Python i hoʻokomo ʻia ma ka ʻōnaehana nui o ka mea hoʻohana).

Ke kau nei i ka module Python Jep

Ma lalo o Linux hiki ke hoʻokomo ʻia ʻo Jep ma o ka pip:

pip install jep

No ka hoʻouka ʻana iā Jep ma Windows, pono ʻoe e hoʻokomo i ka Windows SDK a me ka Microsoft Visual Studio e pili ana. Ua maʻalahi mākou iā ʻoe a Ke kūkulu nei ʻo WHL JEP no nā mana hou o Python no Windows, no laila hiki ke hoʻokomo ʻia ka module mai ka faila:

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

No ka nānā ʻana i ka hoʻokomo ʻana o Jep, pono ʻoe e holo ma ka laina kauoha:

python -c "import jep"

Pono e loaʻa kēia memo ma ka pane:

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

Ma ka waihona emulator batch no kāu ʻōnaehana (copycat.bat - no Windows, kope kope - no Linux) i ka papa inoa o nā palena DEFAULT_JVM_OPTS hoʻohui i kahi ʻāpana Djava.library.path - pono e komo ke ala i ka module Jep i hoʻokomo ʻia.

ʻO ka hopena no Windows he laina e like me kēia:

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

Hoʻolaha ʻia ʻo Kopycat

ʻO ka emulator kahi noi JVM console. Lawe ʻia ka hoʻokuʻu ʻana ma o ka palapala kauoha laina kauoha (sh/cmd).

Kauoha e holo ma lalo o Windows:

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

Kauoha e holo ma lalo o Linux me ka hoʻohana ʻana i ka pono 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 — Ua wehe ʻia ke awa TCP no ke komo ʻana i ke kikowaena GDB;
  • -n rhino - inoa o ka ʻōnaehana ʻōnaehana nui (mea hui pū ʻia);
  • -l user - inoa o ka waihona e ʻimi ai i ka module nui;
  • -y library - ala e ʻimi ai i nā modula i hoʻokomo ʻia i loko o ka hāmeʻa;
  • firmwarerhino_pass.bin - ala i ka faila firmware;
  • ʻO COM26 a me COM28 nā awa COM virtual.

ʻO ka hopena, e hōʻike ʻia kahi ʻōkuhi Python > (ai ole 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 >

Ka launa pū me IDA Pro

No ka maʻalahi o ka hoʻāʻo ʻana, hoʻohana mākou i ka firmware Rhino ma ke ʻano he waihona kumu no ka nānā ʻana ma IDA ma ke ʻano faila ELF (mālama ʻia ka ʻike meta ma laila).

Hiki iā ʻoe ke hoʻohana i ka firmware nui me ka ʻole o ka ʻike meta.

Ma hope o ka hoʻokuʻu ʻana iā Kopycat ma IDA Pro, ma ka papa Debugger e hele i ka mea "E hoʻololi i ka debugger…"a koho"Hoʻopau GDB mamao". A laila, hoʻonohonoho i ka pilina: menu Debugger - Nā koho hana…

E hoʻonoho i nā waiwai:

  • Noi - kekahi waiwai
  • Hostname: 127.0.0.1 (a i ʻole ka IP address o ka mīkini mamao kahi e holo ai ʻo Kopycat)
  • Wahi: 23946

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

I kēia manawa ua loaʻa ka pihi debugging (Kī F9):

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Kaomi iā ia e hoʻohui i ka module debugger i ka emulator. Hele ʻo IDA i ke ʻano debugging, loaʻa nā puka makani hou: ʻike e pili ana i nā papa inoa, e pili ana i ka waihona.

I kēia manawa hiki iā mākou ke hoʻohana i nā hiʻohiʻona maʻamau o ka debugger:

  • ka hoʻokō ʻana i nā ʻōlelo kuhikuhi (E komo i loko и ʻEneʻe ma luna - nā kī F7 a me F8, kēlā me kēia);
  • hoʻomaka a hoʻomaha i ka hana;
  • ka hana ʻana i nā haʻihaʻi no nā code a me nā ʻikepili (F2 kī).

ʻO ka hoʻohui ʻana i kahi debugger ʻaʻole ia e holo i ka code firmware. ʻO ke kūlana hoʻokō o kēia manawa ka helu wahi 0x08006A74 - hoʻomaka o ka hana Reset_Handler. Inā ʻoe e kaomi i lalo i ka papa inoa, hiki iā ʻoe ke ʻike i ke kelepona hana ka papa kuhikuhiE. Hiki iā ʻoe ke kau i ka cursor ma kēia laina (address 0x08006ABE) a hana i ka hana Holo a hiki i ka piko (ki F4).

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

A laila, hiki iā ʻoe ke kaomi F7 e komo i ka hana ka papa kuhikuhiE.

Esli vypolnit kauoha E hoʻomau i ka hana (Kī F9), a laila e ʻike ʻia ka pukaaniani "E ʻoluʻolu e kali" me kahi pihi hoʻokahi Hoʻomaha:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ke paʻi ʻoe Hoʻomaha Hoʻokuʻu ʻia ka hoʻokō ʻana i ka code firmware a hiki ke hoʻomau ʻia mai ka helu like i loko o ke code kahi i hoʻopau ʻia ai.

Inā hoʻomau ʻoe i ka hoʻokō ʻana i ke code, e ʻike ʻoe i nā laina aʻe i loko o nā hopena i pili i nā awa COM virtual:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

ʻO ka loaʻa ʻana o ka laina "state bypass" e hōʻike ana ua hoʻololi ka module Bluetooth virtual i ke ʻano o ka loaʻa ʻana o ka ʻikepili mai ke awa COM o ka mea hoʻohana.

I kēia manawa ma ka pahu Bluetooth (COM29 ma ke kiʻi) hiki iā ʻoe ke hoʻokomo i nā kauoha e like me ka protocol Rhino. No ka laʻana, e hoʻihoʻi ke kauoha "MEOW" i ke kaula "mur-mur" i ka pahu Bluetooth:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Mai hoohalike mai ia'u

I ke kūkulu ʻana i kahi emulator, hiki iā ʻoe ke koho i ke kiʻekiʻe o ka kikoʻī / emulation o kahi mea hana. No ka laʻana, hiki ke hoʻohālikelike ʻia ka module Bluetooth ma nā ʻano like ʻole:

  • ua hoʻopili piha ʻia ka hāmeʻa me kahi pūʻulu o nā kauoha;
  • Hoʻopili ʻia nā kauoha AT, a loaʻa ke kahawai data mai ke awa COM o ka ʻōnaehana nui;
  • Hāʻawi ka mea virtual i ka hoʻihoʻi ʻana i ka ʻikepili piha i ka hāmeʻa maoli;
  • ma ke ʻano he stub maʻalahi e hoʻihoʻi mau ana "OK".

Ke hoʻohana nei ka mana o kēia manawa o ka emulator i ke ala ʻelua - ke hana nei ka module Bluetooth virtual i ka hoʻonohonoho ʻana, a laila hoʻololi ʻo ia i ke ʻano o ka "proxying" data mai ke awa COM o ka ʻōnaehana nui i ke awa UART o ka emulator.

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

E noʻonoʻo kākou i ka hiki ke hana maʻalahi o ke code inā ʻaʻole i hoʻokō ʻia kekahi ʻāpana o ka periphery. No ka laʻana, inā ʻaʻole i hoʻokumu ʻia kahi manawa no ka hoʻokele ʻana i ka hoʻoili ʻana i ka ʻikepili i DMA (e hana ʻia ka nānā ma ka hana ws2812b_kaliaia ma 0x08006840), a laila e kali mau ka firmware no ka hoʻihoʻi ʻana o ka hae 'ō iaia ma 0x200004C4e hōʻike ana i ka noho ʻana o ka laina data DMA:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Hiki iā mākou ke hoʻopuni i kēia kūlana ma ka hoʻihoʻi lima ʻana i ka hae 'ō i ma hope koke o ke kau ʻana. Ma ka IDA Pro, hiki iā ʻoe ke hana i kahi hana Python a kāhea iā ia i kahi breakpoint, a kau i ka breakpoint iā ia iho i ke code ma hope o ke kākau ʻana i ka waiwai 1 i ka hae. 'ō i.

Mea hoʻopaʻa hoʻomaha

ʻO ka mea mua, e hana mākou i kahi hana Python ma IDA. Menu Kōnae - Kānāwai palapala...

E hoʻohui i kahi snippet hou i ka papa inoa ma ka hema, e hāʻawi iā ia i inoa (no ka laʻana, Kā Hoʻokō),
Ma ke kahua kikokikona ma ka ʻākau, e hoʻokomo i ke code hana:

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

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ma hope o kēlā, kaomi holo a pani i ka puka aniani.

I kēia manawa e hele kāua i ke code ma 0x0800688A, hoʻonoho i kahi haʻihaʻi (F2 kī), hoʻoponopono iā ia (context menu Hoʻoponopono i kahi haʻihaʻi...), mai poina e hoʻonoho i ke ʻano palapala iā Python:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat
Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Inā ka waiwai hae o kēia manawa 'ō i like 1, a laila pono ʻoe e hoʻokō i ka hana skip_dma ma ka laina palapala:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Inā holo ʻoe i ka firmware no ka hoʻokō ʻana, hiki iā ʻoe ke ʻike i ka hoʻomaka ʻana o ke code handler breakpoint ma ka pukaaniani IDA. ia auoiaea ma ka laina Skipping wait ws2812.... I kēia manawa ʻaʻole e kali ka firmware no ka hoʻihoʻi ʻana o ka hae 'ō i.

Ka launa pū me ka emulator

ʻAʻole hiki ke hoʻohauʻoli a me ka hauʻoli ka hoʻohālike no ka hoʻohālike. ʻOi aku ka hoihoi inā kōkua ka emulator i ka mea noiʻi e ʻike i ka ʻikepili i ka hoʻomanaʻo a i ʻole e hoʻokumu i ka pilina o nā kaula.

E hōʻike mākou iā ʻoe pehea e hoʻokumu ikaika ai i ka pilina ma waena o nā hana RTOS. Pono ʻoe e hoʻomaha mua i ka hoʻokō ʻana o ke code inā e holo ana. Inā hele ʻoe i ka hana bluetooth_task_entry i ka lālā hana o ke kauoha "LED" (address 0x080057B8), a laila hiki iā ʻoe ke ʻike i ka mea i hana mua ʻia a hoʻouna ʻia i ka queue system ledControlQueueHandle kekahi memo.

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Pono ʻoe e hoʻonoho i kahi haʻihaʻi no ke komo ʻana i ka loli ledControlQueueHandleaia ma 0x20000624 a hoʻomau i ka hoʻokō ʻana i ke code:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

ʻO ka hopena, e kū mua ka hoʻomaha ma ka helu wahi 0x080057CA ma mua o ke kāhea ʻana i ka hana osMailAlloc, a laila ma ka helu wahi 0x08005806 ma mua o ke kāhea ʻana i ka hana osMailPut, a laila ma hope o kekahi manawa - i ka helu wahi 0x08005BD4 (ma mua o ke kāhea ʻana i ka hana osMailGet), pili i ka hana leds_task_entry (LED-task), ʻo ia hoʻi, ua hoʻololi ʻia nā hana, a i kēia manawa ua loaʻa i ka LED-task ka mana.

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ma kēia ala maʻalahi hiki iā ʻoe ke hoʻokumu i ka pili ʻana o nā hana RTOS me kekahi.

ʻOiaʻiʻo, i ka ʻoiaʻiʻo, hiki ke paʻakikī ka pilina o nā hana, akā me ka hoʻohana ʻana i kahi emulator, ʻoi aku ka liʻiliʻi o ka hana ʻana i kēia pilina.

maanei Hiki iā ʻoe ke nānā i kahi wikiō pōkole o ka hoʻomaka ʻana o ka emulator a me ka launa pū ʻana me IDA Pro.

E hoʻomaka me Radare2

ʻAʻole hiki iā ʻoe ke haʻalele i kahi mea hana honua e like me Radare2.

No ka hoʻopili ʻana i ka emulator me ka hoʻohana ʻana i ka r2, e like ke ʻano o ke kauoha:

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

Loaʻa ka hoʻolaha i kēia manawa (dc) a hoʻomaha hoʻokō (Ctrl+C).

ʻO ka mea pōʻino, i kēia manawa, loaʻa iā r2 nā pilikia i ka hana ʻana me ka server gdb hardware a me ka hoʻonohonoho hoʻomanaʻo ma muli o kēia, ʻaʻole e hana nā breakpoints a me nā Steps (kauoha ds). Manaʻolana mākou e hoʻoponopono koke ʻia kēia.

Holo me Eclipse

ʻO kekahi o nā koho no ka hoʻohana ʻana i ka emulator ʻo ia ka debug i ka firmware o ka mea i kūkulu ʻia. No ka akaka, e hoʻohana pū mākou i ka firmware Rhino. Hiki iā ʻoe ke hoʻoiho i nā kumu firmware mai kēia wahi.

E hoʻohana mākou iā Eclipse mai ka hoʻonohonoho ma ke ʻano he IDE Pūnaehana Workbench no STM32.

I mea e hoʻouka ai ka emulator i ka firmware i hōʻuluʻulu ʻia ma Eclipse, pono ʻoe e hoʻohui i ka ʻāpana firmware=null i ke kauoha hoʻomaka emulator:

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

Hoʻonohonoho hoʻonohonoho debug

Ma Eclipse, koho i ka papa kuhikuhi Holo - Nā Hoʻonohonoho Debug... Ma ka puka aniani e wehe ana, ma ka ʻāpana ʻO ka Debugging Hardware GDB pono ʻoe e hoʻohui i kahi hoʻonohonoho hou, a laila ma ka pā "Main" e kuhikuhi i ka papahana o kēia manawa a me ka noi no ka debugging:

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ma ka pā "Debugger" pono ʻoe e kuhikuhi i ke kauoha GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

A e hoʻokomo pū i nā ʻāpana no ka hoʻopili ʻana i ka server GDB (host and port):

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ma ka "Startup" tab, pono ʻoe e kuhikuhi i kēia mau ʻāpana:

  • hiki i ka pahu koho Hoʻouka kiʻi (i hoʻouka ʻia ke kiʻi firmware i hui ʻia i ka emulator);
  • hiki i ka pahu koho Hoʻouka i nā hōʻailona;
  • hoʻohui i ke kauoha hoʻomaka: set $pc = *0x08000004 (e hoʻonoho i ka papa inoa PC i ka waiwai mai ka hoʻomanaʻo ma ka helu wahi 0x08000004 - mālama ʻia ka helu wahi ma laila ResetHandler).

E hoʻolohe, inā ʻaʻole ʻoe makemake e hoʻoiho i ka faila firmware mai Eclipse, a laila nā koho Hoʻouka kiʻi и Holo i nā kauoha ʻaʻole pono e hōʻike.

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ma hope o ke kaomi ʻana i ka Debug, hiki iā ʻoe ke hana ma ke ʻano debugger:

  • hoʻokō code step by step
    Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat
  • ka launa pū ʻana me nā wahi haʻihaʻi
    Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

i hoʻopuka. Loaʻa iā Eclipse, hmm... kekahi mau ʻano ʻano ... a pono ʻoe e noho pū me lākou. No ka laʻana, inā i ka hoʻomaka ʻana i ka debugger ka memo "ʻAʻohe kumu i loaʻa no "0x0″", a laila e hoʻokō i ke kauoha Step (F5)

Rhinoceros i loko o kahi pōpoki - holo i ka firmware ma ka emulator Kopycat

Ma kahi o ka hopena

He mea hoihoi loa ka hoʻolike ʻana i ke code ʻōiwi. Hiki i kahi mea hoʻomohala ke hoʻopau i ka firmware me ka ʻole o kahi mea maoli. No ka mea noiʻi, he manawa kūpono ia e alakaʻi i ka loiloi code dynamic, ʻaʻole hiki ke hiki i nā manawa a pau me kahi hāmeʻa.

Makemake mākou e hāʻawi i nā loea me kahi mea hana maʻalahi, maʻalahi maʻalahi a ʻaʻole nui ka hoʻoikaika a me ka manawa e hoʻonohonoho a holo.

E kākau i nā manaʻo e pili ana i kāu ʻike me ka hoʻohana ʻana i nā emulators hardware. Ke kono nei mākou iā ʻoe e kūkākūkā a hauʻoli e pane i nā nīnau.

Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi. Eʻe, e 'oluʻolu.

He aha kāu e hoʻohana ai i ka emulator?

  • Hoʻomohala wau (debug) firmware

  • Ke noiʻi nei au i ka firmware

  • Hoʻomaka wau i nā pāʻani (Dendi, Sega, PSP)

  • kekahi mea ʻē aʻe (kākau ma nā manaʻo)

7 mea hoʻohana i koho. Ua hōʻole nā ​​mea hoʻohana 2.

He aha nā polokalamu āu e hoʻohana ai e hoʻolike i ke code ʻōiwi?

  • QEMU

  • ʻenekini unicorn

  • Proteus

  • kekahi mea ʻē aʻe (kākau ma nā manaʻo)

6 mea hoʻohana i koho. Ua hōʻole nā ​​mea hoʻohana 2.

He aha kāu makemake e hoʻomaikaʻi i ka emulator āu e hoʻohana nei?

  • Makemake au i ka wikiwiki

  • Makemake au i ka maʻalahi o ka hoʻonohonoho ʻana/launch

  • Makemake au i nā koho hou aʻe no ka launa pū ʻana me ka emulator (API, hooks)

  • Hauʻoli wau i nā mea a pau

  • kekahi mea ʻē aʻe (kākau ma nā manaʻo)

8 mea hoʻohana i koho. 1 mea hoʻohana i hōʻole.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka