Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Minangka bagéan saka rapat 0x0A DC7831 DEF CON Nizhny Novgorod Tanggal 16 Februari, kita nampilake laporan babagan prinsip dhasar emulasi kode binar lan pangembangan kita dhewe - emulator platform hardware Copycat.

Ing artikel iki kita bakal njlèntrèhaké carane mbukak perangkat kukuh piranti ing emulator, nduduhake interaksi karo debugger, lan nindakake analisis dinamis cilik saka perangkat kukuh.

prasejarah

Jaman biyen ing galaksi sing adoh

Sawetara taun kepungkur ing laboratorium kita kudu neliti perangkat kukuh piranti. Firmware dikompres lan dibongkar nganggo bootloader. Dheweke nindakake iki kanthi cara sing rumit, ngowahi data ing memori kaping pirang-pirang. Lan perangkat kukuh dhewe banjur aktif sesambungan karo peripheral. Lan kabeh iki ing inti MIPS.

Kanggo alasan objektif, emulator sing ana ora cocog karo kita, nanging kita isih pengin mbukak kode kasebut. Banjur kita mutusake kanggo nggawe emulator dhewe, sing bakal nindakake minimal lan ngidini kita mbongkar perangkat kukuh utama. Kita nyoba lan bisa. We panginten, apa yen kita nambah peripheral uga nindakake perangkat kukuh utama. Ora lara banget - lan bisa uga. Kita mikir maneh lan mutusake kanggo nggawe emulator lengkap.

Asilé yaiku emulator sistem komputer Copycat.

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat
Kenapa Kopycat?

Ana dolanan tembung.

  1. peniru (Inggris, nomina [ˈkɒpɪkæt]) - peniru, peniru
  2. kucing (Inggris, tembung [ˈkæt]) - kucing, kucing - kewan favorit salah sawijining pencipta proyek kasebut
  3. Huruf "K" saka basa pamrograman Kotlin

Copycat

Nalika nggawe emulator, tujuan khusus wis disetel:

  • kemampuan kanggo cepet nggawe peripheral anyar, modul, inti prosesor;
  • kemampuan kanggo ngumpulake piranti virtual saka macem-macem modul;
  • kemampuan kanggo mbukak data binar (firmware) menyang memori piranti virtual;
  • kemampuan kanggo nggarap jepretan (snapshots saka negara sistem);
  • kemampuan kanggo sesambungan karo emulator liwat debugger dibangun ing;
  • basa modern apik kanggo pembangunan.

Akibaté, Kotlin dipilih kanggo implementasine, arsitektur bis (iki nalika modul komunikasi karo saben liyane liwat bus data virtual), JSON minangka format deskripsi piranti, lan GDB RSP minangka protokol kanggo interaksi karo debugger.

Pangembangan wis kedadeyan luwih saka rong taun lan aktif aktif. Sajrone wektu kasebut, inti prosesor MIPS, x86, V850ES, ARM, lan PowerPC ditindakake.

Proyèk iki saya akeh lan wektune kanggo nampilake menyang umum. Kita bakal nggawe katrangan rinci babagan proyek kasebut mengko, nanging saiki kita bakal fokus nggunakake Kopycat.

Kanggo sing paling ora sabar, versi promo emulator bisa didownload saka link.

Badhak ing emulator

Elinga yen sadurunge konferensi SMARTHINO-2018, piranti uji "Rhinoceros" digawe kanggo ngajar katrampilan teknik terbalik. Proses analisis perangkat kukuh statis diterangake ing artikel iki.

Saiki ayo nyoba nambah "speaker" lan mbukak perangkat kukuh ing emulator.

Kita kudu:
1) Jawa 1.8
2) Python lan modul jep kanggo nggunakake Python nang emulator. Sampeyan bisa mbangun modul WHL Jep kanggo Windows download kene.

Kanggo Windows:
1) com0com
2) PuTTY

Kanggo Linux:
1) soca

Sampeyan bisa nggunakake Eclipse, IDA Pro utawa radare2 minangka klien GDB.

Carane ora iku bisa?

Kanggo nindakake perangkat kukuh ing emulator, perlu kanggo "ngumpul" piranti virtual, sing minangka analog saka piranti nyata.

Piranti nyata ("badhak") bisa ditampilake ing diagram blok:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Emulator nduweni struktur modular lan piranti virtual pungkasan bisa diterangake ing file JSON.

JSON 105 baris

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

Pay manungsa waé menyang parameter perangkat kukuh bagean param iku jeneng file sing bisa dimuat menyang piranti virtual minangka perangkat kukuh.

Piranti virtual lan interaksi karo sistem operasi utama bisa diwakili dening diagram ing ngisor iki:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Kayata tes emulator saiki melu interaksi karo port COM saka OS utama (debug UART lan UART kanggo modul Bluetooth). Iki bisa dadi port nyata kanggo piranti sing disambungake utawa port COM virtual (kanggo iki sampeyan mung perlu com0com/socat).

Kanggo sesambungan karo emulator saka njaba, saiki ana rong cara utama:

  • Protokol GDB RSP (mangkono, alat sing ndhukung protokol iki yaiku Eclipse / IDA / radare2);
  • baris printah emulator internal (Argparse utawa Python).

Port COM virtual

Kanggo sesambungan karo UART piranti virtual ing mesin lokal liwat terminal, sampeyan kudu nggawe pasangan bandar COM virtual gadhah. Ing kasus kita, siji port digunakake dening emulator, lan liya digunakake dening program terminal (PuTTY utawa layar):

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Nggunakake com0com

Port COM virtual dikonfigurasi nggunakake sarana persiyapan saka kit com0com (versi konsol - C:Program Files (x86)com0comsetupс.exe, utawa versi GUI - C:Program Files (x86)com0comsetupg.exe):

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Priksa kothak ngaktifake buffer overrun kanggo kabeh bandar virtual digawe, digunakake emulator bakal ngenteni respon saka port COM.

Nggunakake socat

Ing sistem UNIX, port COM virtual kanthi otomatis digawe dening emulator nggunakake sarana socat; kanggo nindakake iki, mung nemtokake awalan ing jeneng port nalika miwiti emulator. socat:.

Antarmuka baris perintah internal (Argparse utawa Python)

Wiwit Kopycat minangka aplikasi konsol, emulator nyedhiyakake rong opsi antarmuka baris perintah kanggo sesambungan karo obyek lan variabel: Argparse lan Python.

Argparse minangka CLI sing dibangun ing Kopycat lan kasedhiya kanggo kabeh wong.

CLI alternatif yaiku interpreter Python. Kanggo nggunakake, sampeyan kudu nginstal modul Jep Python lan ngatur emulator kanggo karya karo Python (Interpreter Python diinstal ing sistem utama pangguna bakal digunakake).

Nginstal modul Python Jep

Ing Linux Jep bisa diinstal liwat pip:

pip install jep

Kanggo nginstal Jep ing Windows, sampeyan kudu nginstal Windows SDK lan Microsoft Visual Studio sing cocog. Kita wis digawe iku sethitik luwih gampang kanggo sampeyan lan WHL mbangun JEP kanggo versi saiki Python kanggo Windows, supaya modul bisa diinstal saka file:

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

Kanggo mriksa instalasi Jep, sampeyan kudu mbukak baris perintah:

python -c "import jep"

Pesen ing ngisor iki kudu ditampa kanggo nanggepi:

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

Ing file kumpulan emulator kanggo sistem sampeyan (copycat.bat - kanggo Windows, peniru - kanggo Linux) menyang dhaptar paramèter DEFAULT_JVM_OPTS nambah parameter tambahan Djava.library.path - kudu ngemot path menyang modul Jep diinstal.

Asil kanggo Windows kudu dadi baris kaya iki:

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

Launching Kopycat

Emulator minangka aplikasi konsol JVM. Peluncuran ditindakake liwat skrip baris perintah sistem operasi (sh/cmd).

Perintah kanggo mbukak ing Windows:

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

Perintah kanggo mbukak ing Linux nggunakake 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 sing bakal mbukak kanggo akses menyang server GDB;
  • -n rhino - jeneng modul sistem utama (piranti dipasang);
  • -l user - jeneng perpustakaan kanggo nggoleki modul utama;
  • -y library - path kanggo nggoleki modul sing kalebu ing piranti;
  • firmwarerhino_pass.bin - path menyang file firmware;
  • COM26 lan COM28 minangka port COM virtual.

Akibaté, pituduh bakal ditampilake Python > (utawa 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 karo IDA Pro

Kanggo menakake testing, kita nggunakake perangkat kukuh Badhak minangka file sumber kanggo analisis ing IDA ing wangun file ELF (informasi meta disimpen ing kono).

Sampeyan uga bisa nggunakake perangkat kukuh utama tanpa informasi meta.

Sawise ngluncurake Kopycat ing IDA Pro, ing menu Debugger pindhah menyang item "Ngalih debugger…"lan pilih"Remote GDB debugger". Sabanjure, atur sambungan: menu Debugger - Pilihan proses…

Setel nilai:

  • Aplikasi - sembarang nilai
  • Jeneng Host: 127.0.0.1 (utawa alamat IP mesin remot ing ngendi Kopycat lagi mlaku)
  • Port: 23946

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Saiki tombol debugging kasedhiya (tombol F9):

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Klik kanggo nyambung menyang modul debugger ing emulator. IDA dadi mode debugging, jendhela tambahan kasedhiya: informasi babagan register, babagan tumpukan.

Saiki kita bisa nggunakake kabeh fitur standar debugger:

  • langkah demi langkah eksekusi instruksi (Langkah menyang и Langkah liwat - tombol F7 lan F8, mungguh);
  • miwiti lan ngaso eksekusi;
  • nggawe breakpoints kanggo kode lan data (tombol F2).

Nyambung menyang debugger ora ateges mbukak kode perangkat kukuh. Posisi eksekusi saiki kudu dadi alamat 0x08006A74 - wiwitan fungsi Reset_Handler. Yen sampeyan nggulung mudhun listing, sampeyan bisa ndeleng telpon fungsi utama. Sampeyan bisa nyelehake kursor ing baris iki (alamat 0x08006ABE) lan nindakake operasi kasebut Run nganti kursor (tombol F4).

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Sabanjure, sampeyan bisa menet F7 kanggo ngetik fungsi kasebut utama.

Yen sampeyan mbukak printah Terusake proses (tombol F9), banjur jendhela "Mangga ngenteni" bakal katon kanthi tombol siji Ngaso:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Nalika sampeyan mencet Ngaso eksekusi kode perangkat kukuh dilereni soko tugas lan bisa diterusake saka alamat sing padha ing kode sing diselani.

Yen sampeyan terus nglakokake kode kasebut, sampeyan bakal weruh garis ing ngisor iki ing terminal sing disambungake menyang port COM virtual:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Ing ngarsane baris "bypass negara" nuduhake yen modul Bluetooth virtual wis ngalih menyang mode nampa data saka port COM pangguna.

Saiki ing terminal Bluetooth (COM29 ing gambar) sampeyan bisa ngetik printah miturut protokol Rhino. Contone, printah "MEOW" bakal ngasilake string "mur-mur" menyang terminal Bluetooth:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Emulate kula ora rampung

Nalika mbangun emulator, sampeyan bisa milih tingkat rinci / emulasi piranti tartamtu. Contone, modul Bluetooth bisa ditiru kanthi cara sing beda-beda:

  • piranti wis kebak emulated karo pesawat lengkap printah;
  • printah AT ditiru, lan stream data ditampa saka port COM saka sistem utama;
  • piranti virtual nyedhiyakake pangalihan data lengkap menyang piranti nyata;
  • minangka rintisan prasaja sing tansah ngasilake "OK".

Versi emulator saiki nggunakake pendekatan kapindho - modul Bluetooth virtual nindakake konfigurasi, sawise iku ngalih menyang mode "proxying" data saka port COM sistem utama menyang port UART saka emulator.

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Ayo dadi nimbang kamungkinan saka instrumentation prasaja saka kode ing cilik sawetara bagéan saka periphery ora dipun ginakaken. Contone, yen wektu sing tanggung jawab kanggo ngontrol transfer data menyang DMA durung digawe (priksa ditindakake ing fungsi kasebut ws2812b_ngentenidumunung ing 0x08006840), banjur perangkat kukuh bakal tansah ngenteni gendéra direset sibukdumunung ing 0x200004C4sing nuduhake pendhudhukan baris data DMA:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Kita bisa ngatasi kahanan iki kanthi ngreset gendéra kanthi manual sibuk sanalika sawise nginstal. Ing IDA Pro, sampeyan bisa nggawe fungsi Python lan nyebataken ing breakpoint a, lan sijine breakpoint dhewe ing kode sawise nulis nilai 1 kanggo flag. sibuk.

Penanganan breakpoint

Pisanan, ayo nggawe fungsi Python ing IDA. Menu File - Script perintah...

Tambah potongan anyar ing dhaptar ing sisih kiwa, wenehi jeneng (contone, BPT),
Ing kolom teks ing sisih tengen, ketik kode fungsi:

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

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Sawise iku kita pencet Run lan nutup jendhela script.

Saiki ayo pindhah menyang kode ing 0x0800688A, atur breakpoint (tombol F2), sunting (menu konteks Ngedit breakpoint...), aja lali nyetel jinis skrip menyang Python:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat
Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Yen nilai flag saiki sibuk witjaksono 1, banjur sampeyan kudu nglakokaké fungsi skip_dma ing baris skrip:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Yen sampeyan mbukak perangkat kukuh kanggo eksekusi, pemicu kode handler breakpoint bisa dideleng ing jendhela IDA. output dening baris Skipping wait ws2812.... Saiki perangkat kukuh ora bakal ngenteni gendéra direset sibuk.

Interaksi karo emulator

Emulasi kanggo emulasi ora bisa nyebabake rasa seneng lan bungah. Luwih menarik yen emulator mbantu peneliti ndeleng data ing memori utawa nggawe interaksi benang.

Kita bakal nuduhake sampeyan carane nggawe interaksi dinamis antarane tugas RTOS. Sampeyan kudu ngaso dhisik eksekusi kode kasebut yen lagi mlaku. Yen sampeyan pindhah menyang fungsi bluetooth_task_entry menyang cabang pangolahan printah "LED" (alamat 0x080057B8), banjur sampeyan bisa ndeleng apa sing pisanan digawe banjur dikirim menyang antrian sistem ledControlQueueHandle sawetara pesen.

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Sampeyan kudu nyetel breakpoint kanggo ngakses variabel ledControlQueueHandledumunung ing 0x20000624 lan terus ngeksekusi kode:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Akibaté, mandeg pisanan bakal kelakon ing alamat 0x080057CA sadurunge nelpon fungsi osMailAlloc, banjur ing alamat 0x08005806 sadurunge nelpon fungsi osMailPut, banjur sawise sawetara wektu - menyang alamat 0x08005BD4 (sadurunge nelpon fungsi osMailGet), sing kalebu fungsi leds_task_entry (LED-tugas), sing, tugas diuripake, lan saiki LED-tugas nampa kontrol.

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Kanthi cara sing gampang iki, sampeyan bisa nemtokake cara tugas RTOS sesambungan.

Mesthine, ing kasunyatan, interaksi tugas bisa luwih rumit, nanging nggunakake emulator, nelusuri interaksi iki dadi kurang angel.

kene Sampeyan bisa nonton video cendhak emulator diluncurake lan sesambungan karo IDA Pro.

Bukak karo Radare2

Sampeyan ora bisa nglirwakake alat universal kaya Radare2.

Kanggo nyambung menyang emulator nggunakake r2, printah bakal katon kaya iki:

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

Bukak saiki kasedhiya (dc) lan ngaso eksekusi (Ctrl+C).

Sayange, saiki, r2 duwe masalah nalika nggarap server gdb hardware lan tata letak memori; amarga iki, breakpoints lan Steps ora bisa digunakake (prentah ds). Muga-muga iki bakal didandani kanthi cepet.

Mlaku karo Eclipse

Salah sawijining pilihan kanggo nggunakake emulator yaiku debug perangkat kukuh piranti sing dikembangake. Kanggo gamblang, kita uga bakal nggunakake perangkat kukuh Badhak. Sampeyan bisa ngundhuh sumber perangkat kukuh saka kene.

Kita bakal nggunakake Eclipse saka set minangka IDE Sistem Workbench kanggo STM32.

Supaya emulator mbukak perangkat kukuh sing disusun langsung ing Eclipse, sampeyan kudu nambah parameter kasebut firmware=null menyang perintah peluncuran emulator:

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

Nyetel konfigurasi debug

Ing Eclipse, pilih menu Run - Konfigurasi Debug... Ing jendhela sing mbukak, ing bagean GDB Hardware Debugging sampeyan kudu nambah konfigurasi anyar, banjur ing tab "Utama" nemtokake proyek saiki lan aplikasi kanggo debugging:

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Ing tab "Debugger" sampeyan kudu nemtokake perintah GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

Lan uga ketik paramèter kanggo nyambung menyang server GDB (host lan port):

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Ing tab "Mulai", sampeyan kudu nemtokake parameter ing ngisor iki:

  • ngaktifake kothak centhang Muat gambar (supaya gambar perangkat kukuh sing diklumpukake dimuat menyang emulator);
  • ngaktifake kothak centhang Muat simbol;
  • nambah perintah peluncuran: set $pc = *0x08000004 (setel ndhaptar PC menyang nilai saka memori ing alamat 0x08000004 - alamat disimpen ing kono ResetHandler).

Delengen, yen sampeyan ora pengin ndownload file firmware saka Eclipse, banjur pilihan Muat gambar и Run printah ora perlu nuduhake.

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Sawise ngeklik Debug, sampeyan bisa mlaku ing mode debugger:

  • eksekusi kode langkah demi langkah
    Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat
  • sesambungan karo breakpoints
    Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

komentar. Eclipse duwe, hmm ... sawetara quirks ... lan sampeyan kudu manggon karo wong-wong mau. Contone, yen nalika miwiti debugger pesen "Ora ana sumber kasedhiya kanggo" 0x0 "" katon, banjur nglakokaké printah Langkah (F5)

Badhak ing njero kucing - mbukak perangkat kukuh ing emulator Kopycat

Tinimbang kesimpulan

Niru kode asli minangka perkara sing menarik banget. Dadi bisa kanggo pangembang piranti kanggo debug perangkat kukuh tanpa piranti nyata. Kanggo panliti, iki minangka kesempatan kanggo nganakake analisis kode dinamis, sing ora bisa ditindakake sanajan nganggo piranti.

Kita pengin menehi spesialis karo alat sing trep, cukup prasaja lan ora mbutuhake gaweyan lan wektu akeh kanggo nyiyapake lan mbukak.

Tulis ing komentar babagan pengalaman sampeyan nggunakake emulator hardware. Diundang kanggo ngrembug lan bakal seneng njawab pitakonan.

Mung pangguna pangguna sing bisa melu survey. mlebunggih.

Apa sampeyan nggunakake emulator?

  • Aku ngembangake (debug) firmware

  • Aku riset firmware

  • Aku miwiti game (Dendi, Sega, PSP)

  • liyane (tulis ing komentar)

7 pangguna milih. 2 pangguna abstain.

Piranti lunak apa sing sampeyan gunakake kanggo niru kode asli?

  • QEMU

  • Mesin Unicorn

  • Proteus

  • liyane (tulis ing komentar)

6 pangguna milih. 2 pangguna abstain.

Apa sampeyan pengin nambah ing emulator sing digunakake?

  • Aku pengin kacepetan

  • Aku pengin gampang persiyapan / diluncurake

  • Aku pengin luwih akeh opsi kanggo sesambungan karo emulator (API, pancingan)

  • Aku seneng karo kabeh

  • liyane (tulis ing komentar)

8 pangguna milih. 1 pangguna abstain.

Source: www.habr.com

Add a comment