Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Salaku bagian tina rapat 0x0A DC7831 DEF CON Nizhny Novgorod Dina 16 Pébruari, kami nampilkeun laporan ngeunaan prinsip dasar emulasi kode binér sareng pamekaran urang sorangan - émulator platform hardware Copycat.

Dina artikel ieu kami baris ngajelaskeun kumaha carana ngajalankeun firmware alat dina émulator nu, demonstrate interaksi jeung debugger, sarta ngalakukeun analisis dinamis pondok tina firmware nu.

prasajarah

Baheula di galaksi anu jauh

Sababaraha taun ka pengker di laboratorium urang peryogi pikeun nalungtik firmware hiji alat. Firmware dikomprés sareng dibongkar ku bootloader. Anjeunna ngalakukeun ieu dina cara anu pajeulit, ngageser data dina mémori sababaraha kali. Jeung firmware sorangan lajeng aktip berinteraksi sareng périferal. Sareng sadaya ieu dina inti MIPS.

Pikeun alesan obyektif, emulators sadia teu cocog kami, tapi urang masih hayang ngajalankeun kode. Teras we mutuskeun pikeun nyieun émulator sorangan, nu bakal ngalakukeun minimum jeung ngidinan urang ngabongkar firmware utama. Urang diusahakeun eta sarta gawéna. Urang pikir, kumaha lamun urang tambahkeun périferal ogé nedunan firmware utama. Éta henteu nyeri pisan - sareng éta ogé suksés. Urang mikir deui sarta mutuskeun pikeun nyieun émulator full-fledged.

Hasilna nyaéta émulator sistem komputer Copycat.

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat
Naha Kopycat?

Aya kaulinan kecap.

  1. tukang nyalin (Inggris, nomina [ˈkɒpɪkæt]) - peniru, peniru
  2. ucing (Inggris, nomina [ˈkæt]) - ucing, ucing - sato karesep salah sahiji panyipta proyék
  3. Hurup "K" asalna tina basa pamrograman Kotlin

Copycat

Nalika nyiptakeun émulator, tujuan anu khusus disetél:

  • kamampuhan pikeun gancang nyieun périferal anyar, modul, cores processor;
  • kamampuhan pikeun ngumpul alat maya ti sagala rupa modul;
  • kamampuan pikeun ngamuat data binér (firmware) kana mémori alat virtual;
  • kamampuhan pikeun digawe sareng snapshots (snapshots tina kaayaan sistem);
  • kamampuhan pikeun berinteraksi sareng émulator ngaliwatan diwangun-di debugger;
  • basa modern alus keur ngembangkeun.

Hasilna, Kotlin dipilih pikeun palaksanaan, arsitéktur beus (ieu nalika modul saling komunikasi via beus data maya), JSON salaku format déskripsi alat, sarta GDB RSP salaku protokol pikeun interaksi jeung debugger nu.

Pangwangunan parantos lumangsung sakedik langkung ti dua taun sareng aktip lumangsung. Salila ieu, MIPS, x86, V850ES, ARM, sareng inti prosésor PowerPC dilaksanakeun.

Proyék ieu ngembang sareng waktosna pikeun nampilkeunana ka masarakat anu langkung ageung. Urang bakal ngalakukeun pedaran rinci ngeunaan proyék engké, tapi pikeun ayeuna urang bakal difokuskeun ngagunakeun Kopycat.

Pikeun anu paling teu sabar, versi promo émulator tiasa diunduh tina link.

Badak di émulator

Hayu urang ngelingan yen baheula keur konferensi SMARTHINO-2018, alat uji "Badak" dijieun pikeun ngajarkeun kaahlian rékayasa sabalikna. Prosés analisis firmware statik dijelaskeun dina artikel ieu.

Ayeuna hayu urang coba pikeun nambahkeun "speaker" tur ngajalankeun firmware dina émulator nu.

Urang peryogi:
1) Java 1.8
2) Python jeung modul jep ngagunakeun Python jero émulator. Anjeun tiasa ngawangun WHL modul Jep pikeun Windows ngundeur di dieu.

Pikeun Windows:
1) com0com
2) dempul

Pikeun Linux:
1) soca

Anjeun tiasa nganggo Eclipse, IDA Pro atanapi radare2 salaku klien GDB.

Kumaha carana sangkan eta pagawean?

Dina raraga nedunan firmware dina émulator, perlu pikeun "ngumpul" alat virtual, nu mangrupakeun analog tina alat nyata.

Alat nyata ("badak") tiasa ditingalikeun dina diagram blok:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

émulator ngabogaan struktur modular jeung alat maya final bisa digambarkeun dina file JSON.

JSON 105 jalur

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

Nengetan parameter firmware bagean params nyaéta nami file anu tiasa dimuat kana alat virtual salaku firmware.

Alat virtual sareng interaksina sareng sistem operasi utama tiasa diwakilan ku diagram ieu:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Contoh tés émulator ayeuna ngalibatkeun interaksi sareng palabuhan COM tina OS utama (debug UART sareng UART pikeun modul Bluetooth). Ieu tiasa janten palabuhan nyata anu nyambungkeun alat atanapi palabuhan COM virtual (kanggo ieu anjeun ngan ukur peryogi com0com/socat).

Ayeuna aya dua cara utama pikeun berinteraksi sareng émulator ti luar:

  • Protokol GDB RSP (sakumaha, alat anu ngadukung protokol ieu nyaéta Eclipse / IDA / radare2);
  • garis paréntah émulator internal (Argparse atanapi Python).

palabuhan COM maya

Dina raraga berinteraksi sareng UART sahiji alat virtual dina mesin lokal via terminal a, anjeun kudu nyieun sapasang palabuhan COM maya pakait. Dina hal urang, hiji port dianggo ku émulator, sareng anu kadua dianggo ku program terminal (PuTTY atanapi layar):

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Ngagunakeun com0com

Palabuhan COM maya dikonpigurasi nganggo utilitas pangaturan ti kit com0com (versi konsol - C:Program Files (x86)com0comsetupс.exe, atanapi versi GUI - C:Program Files (x86)com0comsetupg.exe):

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Pariksa kotak ngaktipkeun panyangga ngabahekeun pikeun sakabéh port virtual dijieun, disebutkeun émulator bakal ngadagoan respon ti port COM.

Ngagunakeun socat

Dina sistem UNIX, port COM virtual sacara otomatis dijieun ku émulator ngagunakeun utilitas socat; pikeun ngalakukeun ieu, ngan tangtukeun awalan dina ngaran port nalika ngamimitian émulator. socat:.

Antarbeungeut garis paréntah internal (Argparse atanapi Python)

Kusabab Kopycat mangrupikeun aplikasi konsol, émulator nyayogikeun dua pilihan antarmuka garis paréntah pikeun berinteraksi sareng objék sareng variabel na: Argparse sareng Python.

Argparse mangrupikeun CLI anu diwangun kana Kopycat sareng salawasna sayogi pikeun sadayana.

CLI alternatif nyaéta juru Python. Pikeun ngagunakeun éta, anjeun kedah masang modul Jep Python sareng ngonpigurasikeun émulator pikeun damel sareng Python (interpreter Python anu dipasang dina sistem utama pangguna bakal dianggo).

Masang modul Python Jep

Dina Linux Jep tiasa dipasang via pip:

pip install jep

Pikeun masang Jep dina Windows, anjeun kedah masang Windows SDK sareng Microsoft Visual Studio anu aya. Kami geus dijieun saeutik gampang pikeun anjeun na WHL ngawangun JEP pikeun vérsi ayeuna Python pikeun Windows, ku kituna modul tiasa dipasang tina file:

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

Pikeun mariksa pamasangan Jep, anjeun kedah ngajalankeun garis paréntah:

python -c "import jep"

Pesen di handap ieu kedah ditampi pikeun ngaréspon:

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

Dina file bets émulator pikeun sistem anjeun (copycat.bat - pikeun Windows, copycat - pikeun Linux) kana daptar parameter DEFAULT_JVM_OPTS nambahkeun parameter tambahan Djava.library.path - eta kudu ngandung jalur ka modul Jep dipasang.

Hasilna pikeun Windows kedah janten garis sapertos kieu:

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

Ngaluncurkeun Kopycat

Émulator mangrupikeun aplikasi konsol JVM. Peluncuran dilaksanakeun ngaliwatan skrip garis paréntah sistem operasi (sh/cmd).

Paréntah pikeun ngajalankeun dina Windows:

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

Paréntah pikeun ngajalankeun dina Linux nganggo utilitas 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 - Port TCP anu bakal dibuka pikeun aksés ka server GDB;
  • -n rhino - nami modul sistem utama (alat dirakit);
  • -l user - nami perpustakaan pikeun milarian modul utama;
  • -y library - jalur pikeun milarian modul anu kalebet dina alat;
  • firmwarerhino_pass.bin - jalur ka file firmware;
  • COM26 sareng COM28 mangrupikeun palabuhan COM virtual.

Hasilna, ajakan bakal dipintonkeun Python > (atawa 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 >

Interaksi sareng IDA Pro

Pikeun nguji simplify, kami nganggo firmware Badak salaku file sumber pikeun analisis dina IDA dina formulir file ELF (inpormasi meta disimpen di dinya).

Anjeun oge bisa make firmware utama tanpa informasi meta.

Saatos ngaluncurkeun Kopycat di IDA Pro, dina ménu Debugger angkat ka itemna "Pindahkeun debugger…"Jeung pilih"Debugger GDB jauh". Salajengna, nyetél sambungan: menu Debugger - Pilihan prosés…

Setel nilai:

  • Aplikasi - nilai naon
  • Hostname: 127.0.0.1 (atanapi alamat IP tina mesin jauh dimana Kopycat dijalankeun)
  • Port: 23946

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Ayeuna tombol debugging sayogi (konci F9):

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Klik eta pikeun nyambung ka modul debugger dina émulator. IDA asup kana mode debugging, jandéla tambahan sadia: informasi ngeunaan registers, ngeunaan tumpukan.

Ayeuna urang tiasa nganggo sadaya fitur standar debugger:

  • léngkah-léngkah palaksanaan paréntah (Léngkah kana и Ngaléngkah - kenop F7 jeung F8, masing-masing);
  • ngamimitian sareng ngareureuhkeun palaksanaan;
  • nyieun breakpoints pikeun duanana kode jeung data (konci F2).

Nyambungkeun ka debugger henteu hartosna ngajalankeun kode firmware. Posisi palaksanaan ayeuna kedah alamatna 0x08006A74 - mimiti fungsi Reset_Panangan. Upami anjeun ngagulung ka handap daptar, anjeun tiasa ningali sauran fungsi utama. Anjeun tiasa nempatkeun kursor dina garis ieu (alamat 0x08006ABE) jeung ngalakukeun operasi Jalankeun nepi ka kursor (konci F4).

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Salajengna, anjeun tiasa mencet F7 pikeun ngasupkeun fungsi utama.

Lamun ngajalankeun paréntah Nuluykeun prosés (Konci F9), teras jandela "Punten antosan" bakal muncul kalayan hiji tombol ngagantungkeun:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Sawaktos Anjeun mencet ngagantungkeun palaksanaan kodeu firmware ditunda sarta bisa dituluykeun ti alamat sarua dina kode dimana eta interrupted.

Upami anjeun neraskeun ngalaksanakeun kodeu, anjeun bakal ningali garis-garis di handap ieu dina terminal anu nyambung ka palabuhan COM virtual:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Ayana garis "bypass kaayaan" nunjukkeun yén modul Bluetooth virtual geus switched ka modeu narima data ti port COM pamaké.

Ayeuna di terminal Bluetooth (COM29 dina gambar) Anjeun bisa ngasupkeun paréntah luyu jeung protokol Badak. Contona, paréntah "MEOW" bakal mulangkeun string "mur-mur" ka terminal Bluetooth:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Emulate kuring teu sagemblengna

Nalika ngawangun émulator, anjeun tiasa milih tingkat detil / émulasi tina alat anu khusus. Contona, modul Bluetooth tiasa ditiru ku sababaraha cara:

  • alat nu pinuh ditiru ku set pinuh ku paréntah;
  • Paréntah AT ditiru, sareng aliran data ditampi tina port COM tina sistem utama;
  • alat maya nyadiakeun alihan data lengkep ka alat nyata;
  • salaku taratas basajan nu salawasna mulih "OK".

Versi émulator ayeuna nganggo pendekatan kadua - modul Bluetooth virtual ngalaksanakeun konfigurasi, saatos éta ngalih ka modeu "proxying" data tina port COM tina sistem utama ka port UART émulator.

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Hayu urang mertimbangkeun kamungkinan instrumentation basajan tina kode bisi sababaraha bagian tina periphery nu teu dilaksanakeun. Contona, upami hiji timer jawab ngadalikeun mindahkeun data ka DMA teu acan dijieun (pariksaan dipigawé dina fungsi ws2812b_antosanlokasina di 0x08006840), teras firmware bakal salawasna ngantosan bandéra direset sibuklokasina di 0x200004C4nu nembongkeun occupancy tina garis data DMA:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Urang tiasa ngurilingan kaayaan ieu ku cara ngareset bandéra sacara manual sibuk langsung saatos dipasang. Dina IDA Pro, Anjeun bisa nyieun hiji fungsi Python jeung nelepon deui dina breakpoint a, sarta nempatkeun breakpoint sorangan dina kode sanggeus nulis nilai 1 kana bandéra. sibuk.

Panangan breakpoint

Kahiji, hayu urang nyieun hiji fungsi Python di IDA. ménu File - Script paréntah...

Tambahkeun snippet anyar dina daptar di kénca, masihan eta ngaran (contona, BPT),
Dina widang téks di katuhu, asupkeun kodeu fungsi:

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

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Sanggeus éta urang pencét lalumpatan sareng tutup jandela naskah.

Ayeuna hayu urang buka kode di 0x0800688A, setel titik putus (konci F2), edit (menu konteks Edit titik putus...), tong hilap nyetél jinis skrip ka Python:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat
Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Lamun nilai bandéra ayeuna sibuk sarua 1, mangka anjeun kudu ngaéksekusi fungsi skip_dma dina garis skrip:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Upami anjeun ngajalankeun firmware pikeun palaksanaan, pemicuan kode panangan breakpoint tiasa ditingali dina jandela IDA. hasil ku jalur Skipping wait ws2812.... Ayeuna firmware moal ngantosan bandéra direset sibuk.

Interaksi sareng émulator

Emulation demi emulation saperti teu mirip ngabalukarkeun delight jeung kabagjaan. Éta langkung pikaresepeun upami émulator ngabantosan panalungtik ningali data dina mémori atanapi netepkeun interaksi benang.

Kami bakal nunjukkeun anjeun kumaha sacara dinamis netepkeun interaksi antara tugas RTOS. Anjeun kedah ngareureuhkeun heula palaksanaan kodeu upami éta jalan. Lamun balik ka fungsi bluetooth_task_entry ka cabang ngolah paréntah "LED" (alamat 0x080057B8), teras anjeun tiasa ningali naon anu mimiti diciptakeun teras dikirim ka antrian sistem ledControlQueueHandle sababaraha pesen.

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Anjeun kudu nyetel breakpoint pikeun ngakses variabel ledControlQueueHandlelokasina di 0x20000624 sareng teraskeun ngaéksekusi kodeu:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Hasilna, eureun heula bakal lumangsung di alamat 0x080057CA sateuacan nelepon fungsi osMailAlloc, teras di alamat 0x08005806 sateuacan nelepon fungsi osMailPut, lajeng sanggeus bari - ka alamat 0x08005BD4 (saméméh nelepon fungsi osMailGet), anu kagolong kana fungsi leds_task_entry (LED-tugas), nyaeta, tugas switched, sarta ayeuna LED-tugas narima kontrol.

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Ku cara basajan ieu anjeun tiasa netepkeun kumaha tugas RTOS saling berinteraksi.

Tangtosna, dina kanyataanana, interaksi tugas tiasa langkung pajeulit, tapi nganggo émulator, nyukcruk interaksi ieu janten kirang laborious.

di dieu Anjeun tiasa nonton pidéo pondok tina peluncuran émulator sareng interaksi sareng IDA Pro.

Ngajalankeun kalawan Radare2

Anjeun teu tiasa malire alat universal sapertos Radare2.

Pikeun nyambung ka émulator nganggo r2, paréntahna bakal siga kieu:

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

Peluncuran sayogi ayeuna (dc) jeung ngareureuhkeun palaksanaan (Ctrl+C).

Hanjakalna, ayeuna, r2 ngagaduhan masalah nalika damel sareng server gdb hardware sareng perenah mémori; kusabab ieu, titik putus sareng Léngkah henteu jalan (paréntah ds). Kami ngarepkeun ieu bakal dibenerkeun pas.

Ngajalankeun sareng Eclipse

Salah sahiji pilihan pikeun ngagunakeun émulator nyaéta debug firmware alat anu dikembangkeun. Pikeun kajelasan, urang ogé bakal ngagunakeun firmware Badak. Anjeun tiasa ngundeur sumber firmware di dieu.

Urang bakal ngagunakeun Eclipse tina set salaku IDE System Workbench pikeun STM32.

Supados émulator ngamuat firmware langsung disusun dina Eclipse, anjeun kedah nambihan parameter firmware=null kana paréntah peluncuran émulator:

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

Nyetél konfigurasi debug

Dina Eclipse, pilih ménu Jalankeun - Konfigurasi Debug... Dina jandela nu muka, dina bagian GDB Hardware Debugging Anjeun kedah nambihan konfigurasi énggal, teras dina tab "Utama" sebutkeun proyék sareng aplikasi ayeuna pikeun debugging:

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Dina tab "Debugger" anjeun kedah netepkeun paréntah GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

Sareng lebetkeun parameter pikeun nyambung ka server GDB (host sareng port):

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Dina tab "Ngamimitian", anjeun kedah netepkeun parameter ieu:

  • aktipkeun kotak centang Muat gambar (supaya gambar firmware nu dirakit dimuat kana émulator nu);
  • aktipkeun kotak centang Lambang beban;
  • tambahkeun paréntah peluncuran: set $pc = *0x08000004 (Setel daptar PC kana nilai tina mémori di alamat 0x08000004 - alamatna disimpen di dinya ResetHandler).

Perhatikeun, upami anjeun henteu hoyong unduh file firmware tina Eclipse, teras pilihan Muat gambar и Jalankeun paréntah teu perlu nunjukkeun.

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Saatos ngaklik Debug, anjeun tiasa damel dina modeu debugger:

  • step by step palaksanaan kode
    Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat
  • interaksi jeung breakpoints
    Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

nyarios. Eclipse boga, hmm ... sababaraha quirks ... jeung anjeun kudu hirup kalawan aranjeunna. Salaku conto, upami nalika ngamimitian debugger pesen "Teu aya sumber anu sayogi pikeun" 0x0 "" nembongan, teras laksanakeun paréntah Lengkah (F5)

Badak di jero ucing - ngajalankeun firmware dina émulator Kopycat

Gantina kacindekan

Niru kode asli mangrupikeun hal anu pikaresepeun. Janten mungkin pikeun pamekar alat debug firmware tanpa alat nyata. Pikeun panalungtik, éta kasempetan pikeun ngalaksanakeun analisis kode dinamis, nu teu salawasna mungkin sanajan kalawan alat.

Kami hoyong nyayogikeun spesialis alat anu merenah, sederhana saderhana sareng henteu peryogi seueur usaha sareng waktos pikeun nyetél sareng ngajalankeun.

Tulis dina koméntar ngeunaan pangalaman anjeun nganggo émulator hardware. Kami ngajak anjeun ngabahas sareng bakal resep ngajawab patarosan.

Ngan pamaké nu kadaptar bisa ilubiung dina survey. Daptar, Punten.

Naon anu anjeun anggo émulator?

  • Kuring ngamekarkeun (debug) firmware

  • Kuring nalungtik firmware

  • Kuring ngajalankeun kaulinan (Dendi, Sega, PSP)

  • nu sejenna (tulis dina komentar)

7 pamaké milih. 2 pamaké abstained.

Parangkat lunak naon anu anjeun anggo pikeun niru kode asli?

  • QEMU

  • Mesin Unicorn

  • Proteus

  • nu sejenna (tulis dina komentar)

6 pamaké milih. 2 pamaké abstained.

Naon anu anjeun hoyong ningkatkeun dina émulator anu anjeun anggo?

  • Abdi hoyong laju

  • Abdi hoyong betah setelan / peluncuran

  • Abdi hoyong langkung seueur pilihan pikeun berinteraksi sareng émulator (API, kait)

  • Abdi senang jeung sagalana

  • nu sejenna (tulis dina komentar)

8 pamaké milih. 1 pamaké abstained.

sumber: www.habr.com

Tambahkeun komentar