Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Sapulces ietvaros 0x0A DC7831 DEF CON Nizhny Novgorod 16. februārÄ« prezentējām ziņojumu par binārā koda emulācijas pamatprincipiem un mÅ«su paÅ”u izstrādi - aparatÅ«ras platformas emulatoru Copycat.

Šajā rakstā mēs aprakstīsim, kā emulatorā palaist ierīces programmaparatūru, demonstrēt mijiedarbību ar atkļūdotāju un veikt nelielu programmaparatūras dinamisku analīzi.

Aizvēsture

Sen tālu galaktikā

Pirms pāris gadiem mÅ«su laboratorijā radās nepiecieÅ”amÄ«ba izpētÄ«t kādas ierÄ«ces programmaparatÅ«ru. ProgrammaparatÅ«ra tika saspiesta un izpakota ar sāknÄ“Å”anas ielādētāju. ViņŔ to izdarÄ«ja ļoti sarežģītā veidā, vairākas reizes pārvietojot datus atmiņā. Un pati programmaparatÅ«ra pēc tam aktÄ«vi mijiedarbojās ar perifērijas ierÄ«cēm. Un tas viss uz MIPS kodola.

ObjektÄ«vu iemeslu dēļ esoÅ”ie emulatori mums nederēja, bet mēs joprojām gribējām palaist kodu. Tad mēs nolēmām izveidot savu emulatoru, kas darÄ«tu minimālu un ļautu mums izpakot galveno programmaparatÅ«ru. Mēs to izmēģinājām, un tas strādāja. Mēs domājām, kā bÅ«tu, ja pievienotu perifērijas ierÄ«ces, lai veiktu arÄ« galveno programmaparatÅ«ru. Tas ļoti nesāpēja - un tas arÄ« izdevās. Mēs vēlreiz pārdomājām un nolēmām izveidot pilnvērtÄ«gu emulatoru.

Rezultāts bija datorsistēmu emulators Copycat.

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā
Kāpēc Kopycat?

Notiek vārdu spēle.

  1. atdarinājumu (angļu valodā, lietvārds [ĖˆkɒpÉŖkƦt]) - atdarinātājs, atdarinātājs
  2. kaÄ·is (angļu valodā, lietvārds [ĖˆkƦt]) - kaÄ·is, kaÄ·is - mīļākais dzÄ«vnieks vienam no projekta veidotājiem
  3. Burts ā€œKā€ ir no Kotlin programmÄ“Å”anas valodas

Copycat

Veidojot emulatoru, tika izvirzīti ļoti konkrēti mērķi:

  • iespēja ātri izveidot jaunas perifērijas ierÄ«ces, moduļus, procesora kodolus;
  • iespēja salikt virtuālo ierÄ«ci no dažādiem moduļiem;
  • iespēja ielādēt jebkādus bināros datus (programmaparatÅ«ru) virtuālās ierÄ«ces atmiņā;
  • prasme strādāt ar momentuzņēmumiem (sistēmas stāvokļa momentuzņēmumiem);
  • spēja mijiedarboties ar emulatoru, izmantojot iebÅ«vēto atkļūdotāju;
  • jauka mÅ«sdienu valoda attÄ«stÄ«bai.

Rezultātā Kotlin tika izvēlēts ievieÅ”anai, kopnes arhitektÅ«ra (tas ir, kad moduļi sazinās viens ar otru, izmantojot virtuālās datu kopnes), JSON kā ierÄ«ces apraksta formāts un GDB RSP kā protokols mijiedarbÄ«bai ar atkļūdotāju.

Attīstība notiek nedaudz vairāk kā divus gadus un aktīvi turpinās. Šajā laikā tika ieviesti MIPS, x86, V850ES, ARM un PowerPC procesoru kodoli.

Projekts aug un ir pienācis laiks ar to iepazÄ«stināt plaŔāku sabiedrÄ«bu. Detalizētu projekta aprakstu sniegsim vēlāk, bet pagaidām koncentrēsimies uz Kopycat lietoÅ”anu.

Nepacietīgākajiem emulatora reklāmas versiju var lejupielādēt no saite.

Rhino emulatorā

Atgādināsim, ka iepriekÅ” konferencei SMARTRHINO-2018 tika izveidota testa iekārta ā€œDegunradzisā€ reversās inženierijas prasmju mācÄ«Å”anai. Statiskās programmaparatÅ«ras analÄ«zes process tika aprakstÄ«ts Å is raksts.

Tagad mēģināsim pievienot ā€œskaļruņusā€ un palaist programmaparatÅ«ru emulatorā.

Mums ir nepiecieŔams:
1) Java 1.8
2) Python un modulis Džep lai emulatorā izmantotu Python. Varat izveidot WHL moduli Jep operētājsistēmai Windows lejupielādēt Å”eit.

Operētājsistēmai Windows:
1) com0com
2) PuTTY

Operētājsistēmai Linux:
1) socat

Kā GDB klientu varat izmantot Eclipse, IDA Pro vai radare2.

Kā tas strādā?

Lai emulatorā veiktu programmaparatÅ«ru, ir nepiecieÅ”ams ā€œsamontētā€ virtuālo ierÄ«ci, kas ir reālas ierÄ«ces analogs.

ÄŖsto ierÄ«ci ("rhino") var parādÄ«t blokshēmā:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Emulatoram ir modulāra struktūra, un galīgo virtuālo ierīci var aprakstīt JSON failā.

JSON 105 rindas

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

Pievērsiet uzmanību parametram programmaparatūra daļa parametri ir faila nosaukums, ko var ielādēt virtuālajā ierīcē kā programmaparatūru.

Virtuālo ierÄ«ci un tās mijiedarbÄ«bu ar galveno operētājsistēmu var attēlot ar Ŕādu diagrammu:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

PaÅ”reizējais emulatora testa gadÄ«jums ietver mijiedarbÄ«bu ar galvenās OS COM portiem (UART un UART atkļūdoÅ”ana Bluetooth modulim). Tie var bÅ«t reāli porti, kuriem ir pievienotas ierÄ«ces, vai virtuālie COM porti (Å”im nolÅ«kam jums vienkārÅ”i nepiecieÅ”ams com0com/socat).

PaŔlaik ir divi galvenie veidi, kā mijiedarboties ar emulatoru no ārpuses:

  • GDB RSP protokols (attiecÄ«gi rÄ«ki, kas atbalsta Å”o protokolu, ir Eclipse / IDA / radare2);
  • iekŔējā emulatora komandrinda (Argparse vai Python).

Virtuālie COM porti

Lai mijiedarbotos ar vietējās maŔīnas virtuālās ierÄ«ces UART, izmantojot termināli, ir jāizveido pāris saistÄ«to virtuālo COM portu. MÅ«su gadÄ«jumā vienu portu izmanto emulators, bet otro izmanto termināļa programma (PuTTY vai ekrāns):

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Izmantojot com0com

Virtuālie COM porti tiek konfigurēti, izmantojot iestatÄ«Å”anas utilÄ«tu no com0com komplekta (konsoles versija - C:Program Files (x86)com0comsetupс.exe, vai GUI versija - C:Program Files (x86)com0comsetupg.exe):

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Atzīmējiet izvēles rūtiņas iespējot bufera pārtēriņu visiem izveidotajiem virtuālajiem portiem, pretējā gadījumā emulators gaidīs atbildi no COM porta.

Izmantojot socat

UNIX sistēmās emulators automātiski izveido virtuālos COM portus, izmantojot utilÄ«tu socat; lai to izdarÄ«tu, vienkārÅ”i norādiet prefiksu porta nosaukumā, startējot emulatoru. socat:.

IekŔējais komandrindas interfeiss (Argparse vai Python)

Tā kā Kopycat ir konsoles lietojumprogramma, emulators nodroŔina divas komandrindas saskarnes opcijas, lai mijiedarbotos ar tā objektiem un mainīgajiem: Argparse un Python.

Argparse ir CLI, kas iebūvēts Kopycat un vienmēr ir pieejams ikvienam.

Alternatīva CLI ir Python tulks. Lai to izmantotu, jāinstalē Jep Python modulis un jākonfigurē emulators darbam ar Python (tiks izmantots lietotāja galvenajā sistēmā instalētais Python tulks).

Python moduļa Jep instalÄ“Å”ana

Linux sistēmā Jep var instalēt, izmantojot pip:

pip install jep

Lai instalētu Jep operētājsistēmā Windows, vispirms jāinstalē Windows SDK un atbilstoŔā Microsoft Visual Studio. Mēs esam jums to padarÄ«juÅ”i nedaudz vieglāk un WHL bÅ«vē JEP paÅ”reizējām Python for Windows versijām, lai moduli varētu instalēt no faila:

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

Lai pārbaudÄ«tu Jep instalÄ“Å”anu, jums ir jāpalaiž komandrindā:

python -c "import jep"

Atbildē ir jāsaņem Ŕāds ziņojums:

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

JÅ«su sistēmas emulatora sērijveida failā (copycat.bat - operētājsistēmai Windows, kopēt - Linux) uz parametru sarakstu DEFAULT_JVM_OPTS pievienojiet papildu parametru Djava.library.path ā€” tajā jāietver ceļŔ uz instalēto Jep moduli.

Windows rezultātam jābūt Ŕādai rindai:

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

Tiek palaists Kopycat

Emulators ir konsoles JVM lietojumprogramma. PalaiÅ”ana tiek veikta, izmantojot operētājsistēmas komandrindas skriptu (sh/cmd).

Komanda, lai palaistu operētājsistēmā Windows:

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

Komanda, lai palaistu operētājsistēmā Linux, izmantojot socat utilītu:

./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 ports, kas bÅ«s atvērts piekļuvei GDB serverim;
  • -n rhino ā€” galvenā sistēmas moduļa (samontētās ierÄ«ces) nosaukums;
  • -l user ā€” bibliotēkas nosaukums, kurā meklēt galveno moduli;
  • -y library ā€” ceļŔ, lai meklētu ierÄ«cē iekļautos moduļus;
  • firmwarerhino_pass.bin ā€” ceļŔ uz programmaparatÅ«ras failu;
  • COM26 un COM28 ir virtuālie COM porti.

Tā rezultātā tiks parādīta uzvedne Python > (Vai 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 >

Mijiedarbība ar IDA Pro

Lai vienkārÅ”otu testÄ“Å”anu, mēs izmantojam Rhino programmaparatÅ«ru kā avota failu analÄ«zei IDA veidlapā ELF fails (tur tiek glabāta meta informācija).

Varat arī izmantot galveno programmaparatūru bez metainformācijas.

Pēc Kopycat palaiÅ”anas programmā IDA Pro izvēlnē Atkļūdotājs dodieties uz vienumu ā€œPārslēgt atkļūdotājuā€¦"un izvēlieties"Attālais GDB atkļūdotājs". Pēc tam iestatiet savienojumu: izvēlni Atkļūdotājs ā€” procesa opcijasā€¦

Iestatiet vērtības:

  • Pielietojums - jebkura vērtÄ«ba
  • Resursdatora nosaukums: 127.0.0.1 (vai tās attālās iekārtas IP adrese, kurā darbojas Kopycat)
  • Ports: 23946

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Tagad ir pieejama atkļūdoÅ”anas poga (taustiņŔ F9):

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

NoklikŔķiniet uz tā, lai izveidotu savienojumu ar atkļūdotāja moduli emulatorā. IDA pāriet atkļūdoŔanas režīmā, kļūst pieejami papildu logi: informācija par reģistriem, par steku.

Tagad mēs varam izmantot visas atkļūdotāja standarta funkcijas:

  • soli pa solim instrukciju izpilde (Iekāp Šø Pārkāpt pāri ā€” attiecÄ«gi taustiņi F7 un F8);
  • izpildes sākÅ”ana un apturÄ“Å”ana;
  • izveidojot pārtraukuma punktus gan kodam, gan datiem (taustiņŔ F2).

Savienojuma izveide ar atkļūdotāju nenozÄ«mē programmaparatÅ«ras koda palaiÅ”anu. PaÅ”reizējai izpildes pozÄ«cijai ir jābÅ«t adresei 0x08006A74 ā€” funkcijas sākums Reset_Handler. Ritinot sarakstu uz leju, varat redzēt funkcijas izsaukumu galvenais. Kursoru var novietot uz Ŕīs rindas (adrese 0x08006ABE) un veikt operāciju Palaist lÄ«dz kursoram (taustiņŔ F4).

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Pēc tam varat nospiest F7, lai ievadītu funkciju galvenais.

Ja palaižat komandu Turpināt procesu (taustiņŔ F9), tad ar vienu pogu parādÄ«sies logs ā€œLÅ«dzu, uzgaidietā€. Apturēt:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Nospiežot Apturēt programmaparatÅ«ras koda izpilde tiek apturēta, un to var turpināt no tās paÅ”as adreses kodā, kurā tā tika pārtraukta.

Ja turpināsiet izpildÄ«t kodu, termināļos, kas savienoti ar virtuālajiem COM portiem, redzēsit Ŕādas rindas:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

ā€œStāvokļa apieÅ”anasā€ lÄ«nijas klātbÅ«tne norāda, ka virtuālais Bluetooth modulis ir pārslēdzies uz datu saņemÅ”anas režīmu no lietotāja COM porta.

Tagad Bluetooth terminālÄ« (COM29 attēlā) varat ievadÄ«t komandas saskaņā ar Rhino protokolu. Piemēram, komanda ā€œMEOWā€ atgriezÄ«s virkni ā€œmur-murā€ Bluetooth terminālÄ«:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Atdarināt mani ne pilnībā

Veidojot emulatoru, var izvēlēties konkrētas ierīces detalizācijas/emulācijas līmeni. Piemēram, Bluetooth moduli var emulēt dažādos veidos:

  • ierÄ«ce ir pilnÄ«bā emulēta ar pilnu komandu komplektu;
  • AT komandas tiek emulētas, un datu plÅ«sma tiek saņemta no galvenās sistēmas COM porta;
  • virtuālā ierÄ«ce nodroÅ”ina pilnÄ«gu datu novirzÄ«Å”anu uz reālo ierÄ«ci;
  • kā vienkārÅ”s stubs, kas vienmēr atgriež "OK".

PaÅ”reizējā emulatora versijā tiek izmantota otrā pieeja - virtuālais Bluetooth modulis veic konfigurāciju, pēc kura tas pārslēdzas uz datu ā€œstarpniekserverÄ“Å”anasā€ režīmu no galvenās sistēmas COM porta uz emulatora UART portu.

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Apsvērsim koda vienkārÅ”as instrumentÄ“Å”anas iespēju gadÄ«jumā, ja kāda perifērijas daļa netiek realizēta. Piemēram, ja nav izveidots taimeris, kas atbild par datu pārsÅ«tÄ«Å”anas kontroli uz DMA (pārbaude tiek veikta funkcijā ws2812b_waitAtrodas 0x08006840), programmaparatÅ«ra vienmēr gaidÄ«s karoga atiestatÄ«Å”anu aizņemtsAtrodas 0x200004C4kas parāda DMA datu lÄ«nijas noslogojumu:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Mēs varam apiet Å”o situāciju, manuāli atiestatot karogu aizņemts uzreiz pēc tā instalÄ“Å”anas. Programmā IDA Pro varat izveidot Python funkciju un izsaukt to pārtraukuma punktā un ievietot paÅ”u pārtraukuma punktu kodā pēc vērtÄ«bas 1 ierakstÄ«Å”anas karogā aizņemts.

Pārtraukuma punktu apstrādātājs

Vispirms izveidosim Python funkciju IDA. Izvēlne Fails ā€” skripta komanda...

Kreisajā pusē esoÅ”ajā sarakstā pievienojiet jaunu fragmentu, pieŔķiriet tam nosaukumu (piemēram, BPT),
Teksta laukā labajā pusē ievadiet funkcijas kodu:

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

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Pēc tam nospiežam skrējiens un aizveriet skripta logu.

Tagad pāriesim pie koda plkst 0x0800688A, iestatiet pārtraukuma punktu (taustiņŔ F2), rediģējiet to (konteksta izvēlne Rediģēt pārtraukuma punktu...), neaizmirstiet iestatÄ«t skripta veidu uz Python:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā
Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Ja paÅ”reizējā karoga vērtÄ«ba aizņemts ir vienāds ar 1, tad jums ir jāizpilda funkcija skip_dma skripta rindā:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Ja palaižat programmaparatÅ«ru izpildei, pārtraukuma punkta apdarinātāja koda aktivizÄ“Å”anu var redzēt IDA logā izvade pēc lÄ«nijas Skipping wait ws2812.... Tagad programmaparatÅ«ra negaidÄ«s karoga atiestatÄ«Å”anu aizņemts.

Mijiedarbība ar emulatoru

Emulācija emulācijas labad, visticamāk, neradÄ«s sajÅ«smu un prieku. Daudz interesantāk ir, ja emulators palÄ«dz pētniekam redzēt atmiņā esoÅ”os datus vai izveidot pavedienu mijiedarbÄ«bu.

Mēs parādÄ«sim, kā dinamiski izveidot mijiedarbÄ«bu starp RTOS uzdevumiem. Vispirms jums vajadzētu apturēt koda izpildi, ja tas darbojas. Ja dodaties uz funkciju bluetooth_task_entry uz komandas ā€œLEDā€ apstrādes filiāli (adrese 0x080057B8), tad varat redzēt, kas vispirms tiek izveidots un pēc tam nosÅ«tÄ«ts uz sistēmas rindu ledControlQueueHandle kāda ziņa.

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Lai piekļūtu mainīgajam, ir jāiestata pārtraukuma punkts ledControlQueueHandleAtrodas 0x20000624 un turpiniet izpildīt kodu:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Rezultātā apstāŔanās vispirms notiks adresē 0x080057CA pirms funkcijas izsaukÅ”anas osMailAlloc, pēc tam uz adresi 0x08005806 pirms funkcijas izsaukÅ”anas osMailPut, tad pēc kāda laika - uz adresi 0x08005BD4 (pirms funkcijas izsaukÅ”anas osMailGet), kas pieder funkcijai leds_task_entry (LED uzdevums), tas ir, uzdevumi tika pārslēgti, un tagad LED uzdevums saņēma kontroli.

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Šādā vienkārŔā veidā varat noteikt, kā RTOS uzdevumi mijiedarbojas viens ar otru.

Protams, patiesībā uzdevumu mijiedarbība var būt sarežģītāka, taču, izmantojot emulatoru, Ŕīs mijiedarbības izsekoŔana kļūst mazāk darbietilpīga.

Šeit Varat noskatīties īsu video par emulatora palaiŔanu un mijiedarbību ar IDA Pro.

Palaidiet ar Radare2

Jūs nevarat ignorēt tik universālu rīku kā Radare2.

Lai izveidotu savienojumu ar emulatoru, izmantojot r2, komanda izskatīsies Ŕādi:

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

PalaiÅ”ana ir pieejama tagad (dc) un pauzējiet izpildi (Ctrl+C).

Diemžēl Å”obrÄ«d r2 ir problēmas darbā ar aparatÅ«ras gdb serveri un atmiņas izkārtojumu, tāpēc pārtraukuma punkti un soļi nedarbojas (komanda ds). Mēs ceram, ka tas drÄ«z tiks novērsts.

SkrieŔana ar Eclipse

Viena no emulatora izmantoÅ”anas iespējām ir izstrādātās ierÄ«ces programmaparatÅ«ras atkļūdoÅ”ana. SkaidrÄ«bas labad mēs izmantosim arÄ« Rhino programmaparatÅ«ru. Varat lejupielādēt programmaparatÅ«ras avotus tātad.

Mēs izmantosim Eclipse no komplekta kā IDE Sistēmas darbgalds STM32.

Lai emulators varētu ielādēt programmaparatÅ«ru, kas tieÅ”i kompilēta Eclipse, jums jāpievieno parametrs firmware=null uz emulatora palaiÅ”anas komandu:

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

AtkļūdoŔanas konfigurācijas iestatīŔana

Programmā Eclipse atlasiet izvēlni Palaist ā€” atkļūdot konfigurācijas... Atvērtajā logā sadaļā GDB aparatÅ«ras atkļūdoÅ”ana jums jāpievieno jauna konfigurācija, pēc tam cilnē ā€œGalvenāā€ norādiet paÅ”reizējo projektu un atkļūdoÅ”anas lietojumprogrammu:

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Cilnē ā€œAtkļūdotājsā€ jānorāda komanda GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

Un arī ievadiet parametrus savienojuma izveidei ar GDB serveri (resursdators un ports):

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Cilnē ā€œStartÄ“Å”anaā€ ir jānorāda Ŕādi parametri:

  • iespējot izvēles rÅ«tiņu Ielādēt attēlu (lai samontētais programmaparatÅ«ras attēls tiktu ielādēts emulatorā);
  • iespējot izvēles rÅ«tiņu Ielādēt simbolus;
  • pievienot palaiÅ”anas komandu: set $pc = *0x08000004 (iestatiet datora reÄ£istrā vērtÄ«bu no atmiņas adresē 0x08000004 - tur tiek saglabāta adrese ResetHandler).

ŠžŠ±Ń€Š°Ń‚ŠøтŠµ Š²Š½ŠøŠ¼Š°Š½ŠøŠµ, ja nevēlaties lejupielādēt programmaparatÅ«ras failu no Eclipse, tad opcijas Ielādēt attēlu Šø Palaist komandas nav jānorāda.

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Pēc noklikŔķināŔanas uz Atkļūdot varat strādāt atkļūdotāja režīmā:

  • soli pa solim koda izpilde
    Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā
  • mijiedarbÄ«ba ar pārtraukuma punktiem
    Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

PiezÄ«me. Eclipse ir, hmm... daži dÄ«vainÄ«bas... un ar tām ir jāsadzÄ«vo. Piemēram, ja, startējot atkļūdotāju, tiek parādÄ«ts ziņojums ā€œUz ā€œ0x0ā€³ nav pieejams avotsā€, izpildiet komandu Step (F5).

Degunradzis kaÄ·Ä« ā€” palaidiet programmaparatÅ«ru Kopycat emulatorā

Tā vietā, lai noslēgtu

Vietējā koda emulÄ“Å”ana ir ļoti interesanta lieta. IerÄ«ces izstrādātājam kļūst iespējams atkļūdot programmaparatÅ«ru bez Ä«stas ierÄ«ces. Pētniekam tā ir iespēja veikt dinamisku koda analÄ«zi, kas ne vienmēr ir iespējama pat ar ierÄ«ci.

Mēs vēlamies nodroÅ”ināt speciālistus ar rÄ«ku, kas ir ērts, vidēji vienkārÅ”s un neprasa daudz pūļu un laika, lai to iestatÄ«tu un palaistu.

Rakstiet komentāros par savu pieredzi, izmantojot aparatūras emulatorus. Aicinām diskutēt un labprāt atbildēsim uz jautājumiem.

Aptaujā var piedalīties tikai reģistrēti lietotāji. Ielogoties, lūdzu.

Kam jūs izmantojat emulatoru?

  • Es izstrādāju (atkļūdoju) programmaparatÅ«ru

  • Es pētÄ«ju programmaparatÅ«ru

  • Es palaistu spēles (Dendi, Sega, PSP)

  • kaut kas cits (raksti komentāros)

Nobalsoja 7 lietotāji. 2 lietotāji atturējās.

Kādu programmatūru jūs izmantojat, lai atdarinātu vietējo kodu?

  • QEMU

  • Unicorn dzinējs

  • Proteus

  • kaut kas cits (raksti komentāros)

Nobalsoja 6 lietotāji. 2 lietotāji atturējās.

Ko jūs vēlētos uzlabot izmantotajā emulatorā?

  • Es gribu ātrumu

  • Es vēlos vienkārŔāku iestatÄ«Å”anu/palaiÅ”anu

  • Es vēlos vairāk iespēju mijiedarboties ar emulatoru (API, āķi)

  • Esmu apmierināts ar visu

  • kaut kas cits (raksti komentāros)

Nobalsoja 8 lietotāji. 1 lietotājs atturējās.

Avots: www.habr.com

Pievieno komentāru