Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Anisan'ny fivoriana 0x0A DC7831 DEF CON Nizhny Novgorod Tamin'ny 16 Febroary, nanolotra tatitra momba ny fitsipika fototra momba ny fanodinkodinana kaody binary sy ny fivoarantsika manokana izahay - emulator platform hardware. Copycat.

Ato amin'ity lahatsoratra ity dia hilazalaza ny fomba fampandehanana ny firmware fitaovana ao amin'ny emulator, mampiseho ny fifandraisana amin'ny debugger, ary manao fanadihadiana kely mavitrika ny firmware.

prehistory

Efa ela be tany amin'ny vahindanitra lavitra be

Roa taona lasa izay, tao amin'ny laboratoara misy anay dia ilaina ny manadihady ny firmware amin'ny fitaovana iray. Ny firmware dia nopotehina ary novoahana tamin'ny bootloader. Nanao izany tamin'ny fomba tena sarotra izy, nanova imbetsaka ny angon-drakitra ho fahatsiarovana. Ary ny firmware mihitsy avy eo dia nifanerasera tamin'ny periferika. Ary izany rehetra izany amin'ny fototry ny MIPS.

Noho ny antony tsy mitongilana dia tsy nety taminay ireo emulators misy, saingy mbola te-hanao ny code izahay. Avy eo dia nanapa-kevitra ny hanao ny emulator manokana izahay, izay hanao ny kely indrindra ary hamela anay hamongotra ny firmware lehibe. Nanandrana izany izahay ary nahomby. Nieritreritra izahay hoe, ahoana raha manampy periferika hanatanteraka ny firmware fototra. Tsy dia naratra loatra izany - ary nahomby ihany koa. Nieritreritra indray izahay ary nanapa-kevitra ny hanao emulator feno.

Ny vokatr'izany dia emulator rafitra informatika Copycat.

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat
Nahoana no Kopycat?

Misy kilalao teny.

  1. copycat (Anglisy, anarana [ˈkɒpɪkæt]) - mpanahaka, mpanahaka
  2. saka (Anglisy, anarana [ˈkæt]) - saka, saka - biby ankafizin'ny iray amin'ireo mpamorona ny tetikasa
  3. Ny litera "K" dia avy amin'ny fiteny fandaharana Kotlin

Copycat

Rehefa namorona ny emulator dia napetraka ny tanjona voafaritra tsara:

  • ny fahafahana mamorona haingana periferika vaovao, Modules, processeur cores;
  • ny fahafahana manangona fitaovana virtoaly avy amin'ny modules isan-karazany;
  • ny fahafahana mampiditra angon-drakitra mimari-droa (firmware) ao anaty fitadidiana fitaovana virtoaly;
  • fahafahana miasa miaraka amin'ny snapshots (snapshots ny rafitra fanjakana);
  • ny fahafahana mifandray amin'ny emulator amin'ny alàlan'ny debugger naorina;
  • fiteny maoderina tsara ho an'ny fampandrosoana.

Vokatr'izany, i Kotlin dia nofinidy ho fampiharana, ny maritrano fiara fitateram-bahoaka (izany dia rehefa mifampiresaka amin'ny alàlan'ny fiara fitateram-bahoaka virtoaly ny modules), JSON ho endrika famaritana fitaovana, ary GDB RSP ho protocole hifaneraserana amin'ny debugger.

Naharitra roa taona mahery kely ny fampandrosoana ary mitohy hatrany. Nandritra izany fotoana izany dia nampiharina ny MIPS, x86, V850ES, ARM, ary PowerPC.

Mitombo ny tetikasa ary fotoana izao hanehoana izany amin'ny besinimaro. Hanao famaritana amin'ny antsipiriany momba ny tetikasa izahay any aoriana, fa amin'izao fotoana izao dia hifantoka amin'ny fampiasana Kopycat izahay.

Ho an'ny tsy manam-paharetana indrindra dia azo alaina avy amin'ny emulator ny dikan-promo iray rohy.

Rhino ao amin'ny emulator

Tsarovy fa tany am-boalohany ho an'ny fihaonambe SMARTHINO-2018, dia nisy fitaovana andrana "Rhinoceros" noforonina mba hampianarana ny fahaiza-manao teknika mivadika. Ny dingan'ny famakafakana firmware static dia nofaritana tao ity lahatsoratra ity.

Andeha isika hanandrana hampiditra "mpampiteny" ary hampandeha ny firmware ao amin'ny emulator.

Mila izany isika:
1) Java 1.8
2) Python sy module jep hampiasa Python ao anaty emulator. Azonao atao ny manamboatra ny maody WHL Jep ho an'ny Windows alaivo eto.

Ho an'ny Windows:
1) com0com
2) putty

Ho an'ny Linux:
1) saika

Azonao atao ny mampiasa Eclipse, IDA Pro na radare2 ho mpanjifa GDB.

Ahoana no miasa?

Mba hanatanterahana ny firmware ao amin'ny emulator dia ilaina ny "manangona" fitaovana virtoaly, izay analogue amin'ny fitaovana tena izy.

Ny fitaovana tena izy ("Rhino") dia azo aseho amin'ny diagrama sakana:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Ny emulator dia manana rafitra modular ary ny fitaovana virtoaly farany dia azo faritana amin'ny rakitra JSON.

JSON 105 andalana

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

Tandremo ny parameter mikirao praogramanao fizarana params dia anaran'ny rakitra iray azo ampidirina amin'ny fitaovana virtoaly ho firmware.

Ny fitaovana virtoaly sy ny fifandraisany amin'ny rafitra fandidiana lehibe dia azo aseho amin'ny diagram manaraka:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Ny ohatra andrana amin'ny emulator amin'izao fotoana izao dia misy fifandraisana amin'ny seranan-tsambo COM amin'ny OS lehibe (debug UART sy UART ho an'ny maody Bluetooth). Mety ho seranan-tsambo tena izy ireo izay mifandray amin'ny fitaovana na seranan-tsambo COM virtoaly (izay ilainao fotsiny com0com/socat).

Misy fomba roa lehibe hifaneraserana amin'ny emulator avy any ivelany:

  • GDB RSP protocol (araka izany, ny fitaovana manohana ity protocol ity dia Eclipse / IDA / radare2);
  • andalana baiko emulator anatiny (Argparse na Python).

Seranana COM virtoaly

Mba hifaneraserana amin'ny UART amin'ny fitaovana virtoaly amin'ny milina eo an-toerana amin'ny alàlan'ny terminal dia mila mamorona seranan-tsambo COM virtoaly roa ianao. Amin'ity tranga ity, ny seranana iray dia ampiasain'ny emulator, ary ny faharoa amin'ny programa terminal (PuTTY na efijery):

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Mampiasa com0com

Ny seranan-tsambo COM virtoaly dia amboarina amin'ny alàlan'ny fampitaovana setup avy amin'ny kitapo com0com (dika console - C: Program Files (x86)com0comsetupс.exe, na version GUI - C: Programa Files (x86)com0comsetupg.exe):

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Jereo ny boaty avelao ny buffer overrun ho an'ny seranana virtoaly noforonina rehetra, raha tsy izany dia hiandry valiny avy amin'ny seranan-tsambo COM ny emulator.

Mampiasa socat

Amin'ny rafitra UNIX, ny seranan-tsambo COM virtoaly dia noforonin'ny emulator amin'ny fampiasana ny socat utility mba hanaovana izany, mamaritra ny prefix amin'ny anaran'ny seranana rehefa manomboka ny emulator socat:.

Interface andalana baiko anatiny (Argparse na Python)

Koa satria fampiharana fampiononana i Kopycat, ny emulator dia manome safidy interface tsara andalana roa hifaneraserana amin'ireo zavatra sy fari-piadidiany: Argparse sy Python.

Argparse dia CLI natsangana ao amin'ny Kopycat ary azo alaina amin'ny rehetra.

CLI hafa dia ny mpandika teny Python. Mba hampiasana azy dia mila mametraka ny maody Jep Python ianao ary amboary ny emulator mba hiasa amin'ny Python (ny mpandika teny Python napetraka ao amin'ny rafitra fototry ny mpampiasa no hampiasaina).

Fametrahana ny module Python Jep

Eo ambanin'ny Linux Jep dia azo apetraka amin'ny pip:

pip install jep

Mba hametrahana Jep amin'ny Windows dia tsy maintsy mametraka ny Windows SDK sy ny Microsoft Visual Studio ianao aloha. Nohamafisinay kely ho anao ary WHL fananganana JEP ho an'ny kinova Python amin'izao fotoana izao ho an'ny Windows, noho izany dia azo apetraka amin'ny rakitra ny module:

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

Raha te hanamarina ny fametrahana ny Jep dia mila mihazakazaka amin'ny baiko ianao:

python -c "import jep"

Ity hafatra manaraka ity dia tokony ho raisina ho setrin'izany:

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

Ao amin'ny rakitra batch emulator ho an'ny rafitrao (copycat.bat - ho an'ny Windows, kopia - ho an'ny Linux) mankany amin'ny lisitry ny masontsivana DEFAULT_JVM_OPTS ampio paramètre fanampiny Djava.library.path - tsy maintsy misy ny lalana mankany amin'ny module Jep napetraka.

Ny vokatra ho an'ny Windows dia tokony ho tsipika toy izao:

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

Manokatra Kopycat

Ny emulator dia fampiharana JVM console. Ny fandefasana dia atao amin'ny alàlan'ny script andalana baikon'ny rafitra fandidiana (sh/cmd).

Didy hihazakazaka eo ambanin'ny Windows:

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

Ny baiko handeha amin'ny Linux amin'ny fampiasana ny socat utility:

./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28

  • -g 23646 - Seranana TCP izay hisokatra ho an'ny fidirana amin'ny mpizara GDB;
  • -n rhino - anaran'ny rafitra fototra Module (fitaovana nivory);
  • -l user - anaran'ny tranomboky hikaroka ny maody fototra;
  • -y library - lalana hitadiavana mody tafiditra ao anatin'ilay fitaovana;
  • firmwarerhino_pass.bin - lalana mankany amin'ny rakitra firmware;
  • COM26 sy COM28 dia seranan-tsambo COM virtoaly.

Vokatr'izany dia hisy bitsika haseho Python > (na 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 >

Fifandraisana amin'ny IDA Pro

Mba hanatsorana ny fitsapana dia mampiasa ny firmware Rhino izahay ho toy ny rakitra loharano ho an'ny famakafakana ao amin'ny IDA amin'ny endrika Takelaka data ELF (mitahiry ao ny fampahalalana meta).

Azonao atao koa ny mampiasa ny firmware lehibe tsy misy fampahalalana meta.

Aorian'ny fandefasana Kopycat ao amin'ny IDA Pro, ao amin'ny menio Debugger mankanesa any amin'ny singa "Hanova debugger…"ary mifidy"Remote GDB debugger". Manaraka, amboary ny fifandraisana: menu Debugger - Safidin'ny dingana…

Mametraka ny soatoavina:

  • Application - na inona na inona sandany
  • Hostname: 127.0.0.1 (na ny adiresy IP an'ny milina lavitra izay iasan'i Kopycat)
  • Port: 23946

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Ankehitriny dia lasa misy ny bokotra debugging (fanalahidy F9):

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Kitiho izany raha te hifandray amin'ny maody debugger ao amin'ny emulator. Ny IDA dia miditra amin'ny mode debugging, misy varavarankely fanampiny azo alaina: fampahalalana momba ny rejisitra, momba ny stack.

Ankehitriny dia afaka mampiasa ny endri-javatra mahazatra rehetra amin'ny debugger isika:

  • fampandehanana tsikelikely ny toromarika (Midira и Mandrosoa - fanalahidy F7 sy F8, tsirairay avy);
  • fanombohana sy fampiatoana ny famonoana;
  • mamorona teboka fiatoana ho an'ny kaody sy data (fanalahidy F2).

Ny fampifandraisana amin'ny debugger dia tsy midika fa mihazakazaka ny code firmware. Ny toerana famonoana amin'izao fotoana izao dia tsy maintsy ny adiresy 0x08006A74 - fanombohan'ny asa Reset_Handler. Raha midina midina ny lisitra ianao dia afaka mahita ny antso an-tariby tena. Azonao atao ny mametraka ny cursor amin'ity tsipika ity (adiresy 0x08006ABE) ary manatanteraka ny fandidiana Mihazakazaka hatramin'ny cursor (fanalahidy F4).

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Avy eo, azonao atao ny manindry F7 mba hidirana amin'ny fiasa tena.

Raha mihazakazaka ny baiko ianao Tohizo ny dingana (fanalahidy F9), dia hiseho miaraka amin'ny bokotra tokana ny varavarankely "Miandrasa azafady". Mampiato:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Rehefa manindry ianao Mampiato mihantona ny famonoana ny kaody firmware ary azo tohizana amin'ny adiresy mitovy amin'ny code izay tapaka.

Raha manohy manatanteraka ny kaody ianao dia ho hitanao ireto andalana manaraka ireto ao amin'ny terminal mifandray amin'ny seranana COM virtoaly:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Ny fisian'ny tsipika "bypass fanjakana" dia manondro fa ny maodely Bluetooth virtoaly dia nivadika ho fomba fandraisana angona avy amin'ny seranan-tsambo COM an'ny mpampiasa.

Amin'izao fotoana izao ao amin'ny terminal Bluetooth (COM29 eo amin'ny sary) dia afaka miditra baiko mifanaraka amin'ny protocol Rhino ianao. Ohatra, ny baiko "MEOW" dia hamerina ny tady "mur-mur" amin'ny terminal Bluetooth:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Tahafo aho tsy tanteraka

Rehefa manangana emulator dia azonao atao ny misafidy ny haavon'ny antsipiriany / emulator amin'ny fitaovana iray manokana. Ohatra, ny maody Bluetooth dia azo alaina amin'ny fomba samihafa:

  • ny fitaovana dia alaina tanteraka miaraka amin'ny baiko feno;
  • Ny baiko AT dia alaina, ary ny data stream dia azo avy amin'ny seranan-tsambo COM amin'ny rafitra lehibe;
  • ny fitaovana virtoaly dia manome angon-drakitra feno redirection amin'ny tena fitaovana;
  • ho tsatoka tsotra izay miverina "OK".

Ny dikan-tenin'ny emulator amin'izao fotoana izao dia mampiasa ny fomba faharoa - ny maodely Bluetooth virtoaly dia manatanteraka ny fanamafisana, ary avy eo dia mifindra amin'ny fomba "proxy" avy amin'ny seranan-tsambo COM amin'ny rafitra lehibe mankany amin'ny seranan-tsambo UART an'ny emulator.

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Andeha hojerentsika ny mety hisian'ny fitaovana tsotra amin'ny code raha toa ka tsy ampiharina ny ampahany amin'ny periphery. Ohatra, raha tsy noforonina ny fameram-potoana tompon'andraikitra amin'ny fanaraha-maso ny famindrana angon-drakitra amin'ny DMA (ny fisavana dia atao amin'ny asa ws2812b_miandry, raspolojennoy po adresu 0x08006840), dia hiandry foana ny saina hamerenana ny saina be asahita ao amin'ny 0x200004C4izay mampiseho ny fibodoana ny tsipika data DMA:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Afaka miala amin'io toe-javatra io isika amin'ny alàlan'ny famerenana amin'ny tanana ny saina be asa avy hatrany aorian'ny fametrahana azy. Ao amin'ny IDA Pro, azonao atao ny mamorona fiasa Python ary miantso azy amin'ny teboka fiatoana, ary apetraho ao amin'ny kaody ny teboka tapaka aorian'ny fanoratana ny sanda 1 amin'ny saina. be asa.

Mpitantana breakpoint

Voalohany, andao hamorona fiasa Python ao amin'ny IDA. sakafo File - baiko script...

Manampia sombintsombiny vaovao amin'ny lisitra eo ankavia, omeo anarana (ohatra, BPT),
Ao amin'ny sehatry ny lahatsoratra eo ankavanana, ampidiro ny code code:

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

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Aorian'izay, tsindrio Run ary hanidy ny varavarankely script.

Andeha ho any amin'ny kaody amin'ny 0x0800688A, mametraha teboka fiatoana (fanalahidy F2), amboary izany (menu contexte Ahitsio tapakazo...), aza adino ny mametraka ny karazana script amin'ny Python:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat
Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Raha ny sandan'ny saina ankehitriny be asa mitovy amin'ny 1, dia tokony hanatanteraka ny asa ianao skip_dma amin'ny andalana script:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Raha toa ianao ka mihazakazaka ny fikirakirana ho an'ny famonoana, dia azonao jerena ny firongatry ny kaody mpandefa breakpoint ao amin'ny varavarankely IDA. Fivoahana amin'ny andalana Skipping wait ws2812.... Ankehitriny ny firmware dia tsy hiandry ny saina hamerenana indray be asa.

Fifandraisana amin'ny emulator

Ny fakan-tahaka ho an'ny fakan-tahaka dia tsy azo inoana fa hiteraka fifaliana sy fifaliana. Tena mahaliana kokoa raha manampy ny mpikaroka hahita ny angon-drakitra ao amin'ny fitadidiana ny emulator na hametraka ny fifandraisan'ny kofehy.

Hasehonay anao ny fomba fametrahana dynamically fifandraisana eo amin'ny RTOS asa. Tokony hampiato aloha ny fanatanterahana ny kaody raha toa ka mandeha. Raha mankany amin'ny asa ianao bluetooth_task_entry mankany amin'ny sampana fanodinana ny baiko "LED" (adiresy 0x080057B8), dia ho hitanao izay noforonina voalohany ary alefa any amin'ny filaharana rafitra ledControlQueueHandle hafatra sasany.

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Tokony hametraka teboka fiatoana ianao mba hidirana amin'ny fari-piainana ledControlQueueHandle, raspolojennoy po adresu 0x20000624 ary tohizo ny fanatanterahana ny kaody:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Vokatr'izany, ny fiatoana dia hitranga voalohany amin'ny adiresy 0x080057CA alohan'ny hiantsoana ny asa osMailAlloc, avy eo amin'ny adiresy 0x08005806 alohan'ny hiantsoana ny asa osMailPut, avy eo rehefa afaka kelikely - mankany amin'ny adiresy 0x08005BD4 (alohan'ny hiantsoana ny function osMailGet), izay an'ny asa leds_task_entry (LED-task), izany hoe, nivadika ny asa, ary ankehitriny ny LED-asa dia nahazo fifehezana.

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Amin'ity fomba tsotra ity dia azonao atao ny mametraka ny fomba fifandraisan'ny RTOS amin'ny tsirairay.

Mazava ho azy, raha ny tena izy, ny fifandraisana amin'ny asa dia mety ho sarotra kokoa, fa amin'ny fampiasana emulator, ny fanaraha-maso an'io fifandraisana io dia lasa tsy dia miasa loatra.

eto Azonao atao ny mijery horonantsary fohy momba ny fandefasana emulator sy ny fifandraisana amin'ny IDA Pro.

Alefaso miaraka amin'ny Radare2

Tsy azonao tsinontsinoavina ny fitaovana manerantany toy ny Radare2.

Raha hifandray amin'ny emulator mampiasa r2, dia ho toy izao ny baiko:

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

Afaka manomboka izao (dc) ary miato ny famonoana (Ctrl+C).

Mampalahelo fa amin'izao fotoana izao dia manana olana ny r2 rehefa miasa amin'ny server gdb hardware sy ny fandrindrana fahatsiarovana noho izany, tsy mandeha ny breakpoints sy Steps (command ds). Manantena izahay fa ho voavaha tsy ho ela izany.

Mihazakazaka miaraka amin'ny Eclipse

Ny iray amin'ireo safidy amin'ny fampiasana ny emulator dia ny debug ny firmware amin'ny fitaovana novolavolaina. Mba hanazavana dia hampiasa ny firmware Rhino ihany koa izahay. Azonao atao ny misintona ny loharano firmware avy eto.

Hampiasa Eclipse avy amin'ny set ho IDE izahay System Workbench ho an'ny STM32.

Mba hahafahan'ny emulator hampiditra firmware mivantana natambatra ao amin'ny Eclipse dia mila ampidirinao ny parameter firmware=null mankany amin'ny baiko fandefasana emulator:

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

Fametrahana ny debug configuration

Ao amin'ny Eclipse, safidio ny sakafo Run - Debug Configurations... Ao amin'ny varavarankely misokatra, ao amin'ny fizarana GDB Hardware Debugging mila manampy fanitsiana vaovao ianao, avy eo amin'ny tabilao "Main" dia manondro ny tetikasa sy ny fampiharana amin'izao fotoana izao ho an'ny debugging:

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Ao amin'ny tabilao "Debugger" dia mila mamaritra ny baiko GDB ianao:
${openstm32_compiler_path}arm-none-eabi-gdb

Ary ampidiro ihany koa ny masontsivana hifandraisana amin'ny mpizara GDB (host sy port):

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Ao amin'ny tabilao "Startup", tsy maintsy mamaritra ireto parameter manaraka ireto ianao:

  • avelao ny checkbox Ento ny sary (mba ampidirina ao amin'ny emulator ny sary firmware tafangona);
  • avelao ny checkbox Entana marika;
  • ampio baiko fandefasana: set $pc = *0x08000004 (apetraho amin'ny sanda avy amin'ny fahatsiarovana amin'ny adiresy ny rejisitra PC 0x08000004 - voatahiry ao ny adiresy ResetHandler).

Mitandrema, raha tsy te-hisintona ny rakitra firmware avy amin'ny Eclipse ianao, dia ny safidy Ento ny sary и Mihazakazaka baiko tsy mila manondro.

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Aorian'ny fipihana ny Debug dia afaka miasa amin'ny fomba debugger ianao:

  • dingana amin'ny fanatanterahana ny code
    Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat
  • mifandray amin'ny breakpoints
    Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

fanamarihana. Ny Eclipse dia manana, hmm ... misy quirks ... ary tsy maintsy miaina miaraka amin'izy ireo ianao. Ohatra, raha toa ka rehefa manomboka ny debugger dia miseho ny hafatra "Tsy misy loharano misy" 0x0″ ", dia tanteraho ny baiko Dingana (F5)

Rhinoceros ao anaty saka - mandehana ny firmware ao amin'ny emulator Kopycat

Raha tokony ny famaranana

Tena mahaliana ny maka tahaka ny kaody teratany. Lasa azon'ny mpamorona fitaovana iray ny debug ny firmware tsy misy fitaovana tena izy. Ho an'ny mpikaroka dia fotoana iray hanaovana fanadihadiana kaody mavitrika, izay tsy azo atao foana na dia amin'ny fitaovana aza.

Tianay ny hanome fitaovana manam-pahaizana manokana izay mety, tsotra ary tsy mitaky ezaka sy fotoana betsaka amin'ny fananganana sy fampandehanana.

Soraty ao amin'ny fanehoan-kevitra momba ny traikefanao amin'ny fampiasana emulators hardware. Manasa anao izahay hiresaka ary ho faly hamaly fanontaniana.

Ireo mpampiasa voasoratra anarana ihany no afaka mandray anjara amin'ny fanadihadiana. HiditraPlease.

Inona no ampiasanao ny emulator?

  • Manamboatra firmware (debug) aho

  • Mikaroka firmware aho

  • Mandeha lalao aho (Dendi, Sega, PSP)

  • zavatra hafa (soraty ao amin'ny fanehoan-kevitra)

Mpampiasa 7 no nifidy. Mpampiasa 2 no nifady.

Inona no logiciel ampiasainao haka tahaka ny kaody teratany?

  • QEMU

  • Unicorn motera

  • Proteus

  • zavatra hafa (soraty ao amin'ny fanehoan-kevitra)

Mpampiasa 6 no nifidy. Mpampiasa 2 no nifady.

Inona no tianao hohatsaraina amin'ny emulator ampiasainao?

  • Mila hafainganam-pandeha aho

  • Mila fanamorana ny fanamboarana/famokarana aho

  • Mila safidy bebe kokoa aho hifaneraserana amin'ny emulator (API, hooks)

  • Faly amin'ny zava-drehetra aho

  • zavatra hafa (soraty ao amin'ny fanehoan-kevitra)

Mpampiasa 8 no nifidy. Mpampiasa 1 no nifady.

Source: www.habr.com

Add a comment