Badak di dalam kucing - jalankan firmware di emulator Kopycat

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Sebagai bagian dari pertemuan 0x0A DC7831 DEF CON Nizhny Novgorod Pada tanggal 16 Februari, kami mempresentasikan laporan tentang prinsip dasar emulasi kode biner dan pengembangan kami sendiri - emulator platform perangkat keras Peniru.

Pada artikel ini kami akan menjelaskan cara menjalankan firmware perangkat di emulator, mendemonstrasikan interaksi dengan debugger, dan melakukan analisis dinamis kecil terhadap firmware.

prasejarah

Dahulu kala di galaksi yang jauh sekali

Beberapa tahun yang lalu di laboratorium kami ada kebutuhan untuk menyelidiki firmware suatu perangkat. Firmware dikompresi dan dibongkar dengan bootloader. Dia melakukan ini dengan cara yang sangat rumit, menggeser data di memori beberapa kali. Dan firmware itu sendiri kemudian secara aktif berinteraksi dengan periferal. Dan semua ini ada di inti MIPS.

Untuk alasan obyektif, emulator yang tersedia tidak cocok untuk kami, tetapi kami tetap ingin menjalankan kodenya. Kemudian kami memutuskan untuk membuat emulator kami sendiri, yang berfungsi minimal dan memungkinkan kami membongkar firmware utama. Kami mencobanya dan berhasil. Kami berpikir, bagaimana jika kami menambahkan periferal untuk juga menjalankan firmware utama. Tidak terlalu menyakitkan - dan berhasil juga. Kami berpikir lagi dan memutuskan untuk membuat emulator yang lengkap.

Hasilnya adalah emulator sistem komputer Peniru.

Badak di dalam kucing - jalankan firmware di emulator Kopycat
Mengapa Kopicat?

Ada permainan kata-kata.

  1. peniru (Bahasa Inggris, kata benda [ˈkɒpɪkæt]) - peniru, peniru
  2. kucing (Bahasa Inggris, kata benda [ˈkæt]) - kucing, kucing - hewan favorit salah satu pencipta proyek
  3. Huruf “K” berasal dari bahasa pemrograman Kotlin

Peniru

Saat membuat emulator, tujuan yang sangat spesifik ditetapkan:

  • kemampuan untuk dengan cepat membuat periferal, modul, inti prosesor baru;
  • kemampuan untuk merakit perangkat virtual dari berbagai modul;
  • kemampuan untuk memuat data biner (firmware) apa pun ke dalam memori perangkat virtual;
  • kemampuan untuk bekerja dengan snapshot (snapshot dari status sistem);
  • kemampuan untuk berinteraksi dengan emulator melalui debugger bawaan;
  • bahasa modern yang bagus untuk pengembangan.

Hasilnya, Kotlin dipilih untuk implementasi, arsitektur bus (saat modul berkomunikasi satu sama lain melalui bus data virtual), JSON sebagai format deskripsi perangkat, dan GDB RSP sebagai protokol untuk interaksi dengan debugger.

Pembangunan telah berlangsung selama kurang lebih dua tahun dan terus berlangsung secara aktif. Selama waktu ini, inti prosesor MIPS, x86, V850ES, ARM, dan PowerPC diimplementasikan.

Proyek ini semakin berkembang dan inilah saatnya untuk mempresentasikannya ke masyarakat luas. Kami akan melakukan penjelasan rinci tentang proyek ini nanti, tetapi untuk saat ini kami akan fokus menggunakan Kopycat.

Bagi yang paling tidak sabar, emulator versi promo dapat diunduh link.

Badak di emulator

Ingatlah bahwa sebelumnya untuk konferensi SMARTRHINO-2018, perangkat uji “Badak” diciptakan untuk mengajarkan keterampilan rekayasa balik. Proses analisis firmware statis dijelaskan di Artikel ini.

Sekarang mari kita coba menambahkan “speaker” dan menjalankan firmware di emulator.

Kami akan membutuhkan:
1) Jawa 1.8
2) Python dan modul Jepang untuk menggunakan Python di dalam emulator. Anda dapat membuat modul WHL Jep untuk Windows Unduh disini.

Untuk Windows:
1) com.com0com
2) Putty

Untuk Linux:
1) socat

Anda dapat menggunakan Eclipse, IDA Pro atau radare2 sebagai klien GDB.

Bagaimana cara kerjanya?

Untuk menjalankan firmware di emulator, Anda perlu “merakit” perangkat virtual, yang merupakan analog dari perangkat nyata.

Perangkat sebenarnya (“badak”) dapat ditampilkan dalam diagram blok:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Emulator memiliki struktur modular dan perangkat virtual akhir dapat dijelaskan dalam 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"]
  ]
}

Perhatikan parameternya firmware bagian params adalah nama file yang dapat dimuat ke perangkat virtual sebagai firmware.

Perangkat virtual dan interaksinya dengan sistem operasi utama dapat direpresentasikan dalam diagram berikut:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Contoh pengujian emulator saat ini melibatkan interaksi dengan port COM OS utama (debug UART dan UART untuk modul Bluetooth). Ini bisa berupa port nyata tempat perangkat terhubung atau port COM virtual (untuk ini Anda hanya perlu com0com/socat).

Saat ini ada dua cara utama untuk berinteraksi dengan emulator dari luar:

  • Protokol GDB RSP (oleh karena itu, alat yang mendukung protokol ini adalah Eclipse / IDA / radare2);
  • baris perintah emulator internal (Argparse atau Python).

Port COM virtual

Untuk berinteraksi dengan UART perangkat virtual di mesin lokal melalui terminal, Anda perlu membuat sepasang port COM virtual terkait. Dalam kasus kami, satu port digunakan oleh emulator, dan port kedua digunakan oleh program terminal (PuTTY atau layar):

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Menggunakan com0com

Port COM virtual dikonfigurasikan menggunakan utilitas pengaturan dari kit com0com (versi konsol - C:Program Files (x86)com0comsetupс.exe, atau versi GUI - C:Program Files (x86)com0comsetupg.exe):

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Centang kotaknya mengaktifkan buffer overrun untuk semua port virtual yang dibuat, jika tidak, emulator akan menunggu respons dari port COM.

Menggunakan socat

Pada sistem UNIX, port COM virtual secara otomatis dibuat oleh emulator menggunakan utilitas socat; untuk melakukan ini, cukup tentukan awalan pada nama port saat memulai emulator socat:.

Antarmuka baris perintah internal (Argparse atau Python)

Karena Kopycat adalah aplikasi konsol, emulator menyediakan dua opsi antarmuka baris perintah untuk berinteraksi dengan objek dan variabelnya: Argparse dan Python.

Argparse adalah CLI yang dibangun di Kopycat dan selalu tersedia untuk semua orang.

CLI alternatif adalah juru bahasa Python. Untuk menggunakannya, Anda perlu menginstal modul Jep Python dan mengonfigurasi emulator agar berfungsi dengan Python (penerjemah Python yang diinstal pada sistem utama pengguna akan digunakan).

Menginstal modul Python Jep

Di Linux Jep dapat diinstal melalui pip:

pip install jep

Untuk menginstal Jep di Windows, Anda harus menginstal Windows SDK dan Microsoft Visual Studio yang sesuai terlebih dahulu. Kami telah membuatnya sedikit lebih mudah untuk Anda dan WHL dibangun JEP untuk versi Python untuk Windows saat ini, sehingga modul dapat diinstal dari file:

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

Untuk memeriksa instalasi Jep, Anda perlu menjalankannya di baris perintah:

python -c "import jep"

Pesan berikut harus diterima sebagai tanggapan:

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

Dalam file batch emulator untuk sistem Anda (peniru.bat - untuk Windows, peniru - untuk Linux) ke daftar parameter DEFAULT_JVM_OPTS menambahkan parameter tambahan Djava.library.path — itu harus berisi jalur ke modul Jep yang diinstal.

Hasil untuk Windows seharusnya berupa baris seperti ini:

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

Meluncurkan Kopicat

Emulator adalah aplikasi konsol JVM. Peluncurannya dilakukan melalui skrip baris perintah sistem operasi (sh/cmd).

Perintah untuk dijalankan di Windows:

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

Perintah untuk dijalankan di Linux menggunakan 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 yang akan terbuka untuk akses ke server GDB;
  • -n rhino — nama modul sistem utama (perangkat rakitan);
  • -l user — nama perpustakaan untuk mencari modul utama;
  • -y library — jalur untuk mencari modul yang disertakan dalam perangkat;
  • firmwarerhino_pass.bin — jalur ke file firmware;
  • COM26 dan COM28 adalah port COM virtual.

Hasilnya, sebuah prompt akan ditampilkan Python > (Atau 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 dengan IDA Pro

Untuk mempermudah pengujian, kami menggunakan firmware Rhino sebagai file sumber untuk dianalisis di IDA dalam bentuk berkas ELF (informasi meta disimpan di sana).

Anda juga dapat menggunakan firmware utama tanpa informasi meta.

Setelah meluncurkan Kopycat di IDA Pro, di menu Debugger, buka item “Ganti debugger…" dan pilih "Debugger GDB jarak jauh". Selanjutnya, atur koneksi: menu Debugger - Opsi proses…

Tetapkan nilainya:

  • Aplikasi - nilai apa pun
  • Nama Host: 127.0.0.1 (atau alamat IP mesin jarak jauh tempat Kopycat berjalan)
  • Port: 23946

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Sekarang tombol debugging tersedia (tombol F9):

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Klik untuk terhubung ke modul debugger di emulator. IDA masuk ke mode debugging, jendela tambahan tersedia: informasi tentang register, tentang tumpukan.

Sekarang kita dapat menggunakan semua fitur standar debugger:

  • pelaksanaan instruksi langkah demi langkah (Melangkah ke и Langkah selesai — masing-masing tombol F7 dan F8);
  • memulai dan menjeda eksekusi;
  • membuat breakpoint untuk kode dan data (kunci F2).

Menghubungkan ke debugger tidak berarti menjalankan kode firmware. Posisi eksekusi saat ini harus berupa alamat 0x08006A74 — awal fungsi Atur Ulang_Handler. Jika Anda menggulir daftar ke bawah, Anda dapat melihat pemanggilan fungsi utama. Anda dapat menempatkan kursor pada baris ini (alamat 0x08006ABE) dan lakukan operasi Jalankan sampai kursor (kunci F4).

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Selanjutnya, Anda dapat menekan F7 untuk masuk ke fungsinya utama.

Jika Anda menjalankan perintah Lanjutkan proses (Tombol F9), maka jendela “Harap tunggu” akan muncul dengan satu tombol Menangguhkan:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Saat Anda menekan Menangguhkan Eksekusi kode firmware ditangguhkan dan dapat dilanjutkan dari alamat yang sama dengan kode yang diinterupsi.

Jika Anda terus menjalankan kode, Anda akan melihat baris berikut di terminal yang terhubung ke port COM virtual:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Adanya garis “state bypass” menunjukkan bahwa modul Bluetooth virtual telah beralih ke mode penerimaan data dari port COM pengguna.

Sekarang di terminal Bluetooth (COM29 pada gambar) Anda dapat memasukkan perintah sesuai dengan protokol Rhino. Misalnya, perintah “MEOW” akan mengembalikan string “mur-mur” ke terminal Bluetooth:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Tirulah saya tidak sepenuhnya

Saat membuat emulator, Anda dapat memilih tingkat detail/emulasi perangkat tertentu. Misalnya, modul Bluetooth dapat ditiru dengan berbagai cara:

  • perangkat sepenuhnya ditiru dengan serangkaian perintah lengkap;
  • Perintah AT ditiru, dan aliran data diterima dari port COM sistem utama;
  • perangkat virtual menyediakan pengalihan data lengkap ke perangkat nyata;
  • sebagai rintisan sederhana yang selalu mengembalikan "OK".

Versi emulator saat ini menggunakan pendekatan kedua - modul Bluetooth virtual melakukan konfigurasi, setelah itu beralih ke mode "proxy" data dari port COM sistem utama ke port UART emulator.

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Mari kita pertimbangkan kemungkinan instrumentasi kode sederhana jika beberapa bagian periferal tidak diimplementasikan. Misalnya, jika pengatur waktu yang bertanggung jawab untuk mengontrol transfer data ke DMA belum dibuat (pemeriksaan dilakukan di fungsi ws2812b_tunggubertempat di 0x08006840), maka firmware akan selalu menunggu flag direset sibukbertempat di 0x200004C4yang menunjukkan okupansi jalur data DMA:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Kita dapat mengatasi situasi ini dengan mengatur ulang bendera secara manual sibuk segera setelah menginstalnya. Di IDA Pro, Anda dapat membuat fungsi Python dan memanggilnya di breakpoint, dan memasukkan breakpoint itu sendiri ke dalam kode setelah menulis nilai 1 ke flag sibuk.

Penangan titik henti

Pertama, mari buat fungsi Python di IDA. Menu File - Perintah skrip...

Tambahkan cuplikan baru dalam daftar di sebelah kiri, beri nama (misalnya, BPT),
Di kolom teks sebelah kanan, masukkan kode fungsi:

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

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Setelah itu kita tekan Run dan tutup jendela skrip.

Sekarang mari kita beralih ke kode di 0x0800688A, atur breakpoint (tombol F2), edit (menu konteks Sunting titik henti sementara...), jangan lupa untuk mengatur jenis skrip ke Python:

Badak di dalam kucing - jalankan firmware di emulator Kopycat
Badak di dalam kucing - jalankan firmware di emulator Kopycat

Jika nilai bendera saat ini sibuk sama dengan 1, maka Anda harus menjalankan fungsinya lewati_dma di baris skrip:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Jika Anda menjalankan firmware untuk dieksekusi, pemicuan kode pengendali breakpoint dapat dilihat di jendela IDA Keluaran demi baris Skipping wait ws2812.... Sekarang firmware tidak akan menunggu sampai flag direset sibuk.

Interaksi dengan emulator

Persaingan demi persaingan sepertinya tidak akan menimbulkan kesenangan dan kegembiraan. Jauh lebih menarik jika emulator membantu peneliti melihat data di memori atau membangun interaksi thread.

Kami akan menunjukkan kepada Anda cara membangun interaksi secara dinamis antara tugas-tugas RTOS. Anda harus terlebih dahulu menghentikan sementara eksekusi kode jika sedang berjalan. Jika Anda pergi ke fungsinya bluetooth_task_entry ke cabang pemrosesan perintah "LED" (alamat 0x080057B8), lalu Anda dapat melihat apa yang pertama kali dibuat dan kemudian dikirim ke antrian sistem ledControlQueueHandle beberapa pesan.

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Anda harus menetapkan breakpoint untuk mengakses variabel ledControlQueueHandlebertempat di 0x20000624 dan lanjutkan mengeksekusi kode:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Akibatnya, pemberhentian pertama akan terjadi di alamat 0x080057CA sebelum memanggil fungsi tersebut osMailAlloc, lalu di alamatnya 0x08005806 sebelum memanggil fungsi tersebut osMailPut, lalu setelah beberapa saat - ke alamat 0x08005BD4 (sebelum memanggil fungsi osMailGet), yang termasuk dalam fungsi tersebut leds_task_entry (Tugas LED), yaitu tugas dialihkan, dan sekarang tugas LED menerima kendali.

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Dengan cara sederhana ini Anda dapat menetapkan bagaimana tugas RTOS berinteraksi satu sama lain.

Tentu saja, pada kenyataannya, interaksi tugas bisa menjadi lebih rumit, tetapi dengan menggunakan emulator, pelacakan interaksi ini menjadi lebih mudah.

Di sini Anda dapat menonton video singkat peluncuran emulator dan interaksi dengan IDA Pro.

Luncurkan dengan Radare2

Anda tidak dapat mengabaikan alat universal seperti Radare2.

Untuk terhubung ke emulator menggunakan r2, perintahnya akan terlihat seperti ini:

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

Peluncuran tersedia sekarang (dc) dan jeda eksekusi (Ctrl+C).

Sayangnya, saat ini, r2 memiliki masalah ketika bekerja dengan server gdb perangkat keras dan tata letak memori; karena itu, breakpoint dan Steps tidak berfungsi (perintah ds). Kami berharap hal ini akan segera diperbaiki.

Berjalan dengan Eclipse

Salah satu opsi untuk menggunakan emulator adalah dengan men-debug firmware perangkat yang sedang dikembangkan. Untuk lebih jelasnya kami juga akan menggunakan firmware Rhino. Anda dapat mengunduh sumber firmware karenanya.

Kami akan menggunakan Eclipse dari set sebagai IDE Meja Kerja Sistem untuk STM32.

Agar emulator memuat firmware yang dikompilasi langsung di Eclipse, Anda perlu menambahkan parameter firmware=null ke perintah peluncuran emulator:

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

Menyiapkan konfigurasi debug

Di Eclipse, pilih menu Jalankan - Konfigurasi Debug... Di jendela yang terbuka, di bagian Proses Debug Perangkat Keras GDB Anda perlu menambahkan konfigurasi baru, lalu pada tab "Utama" tentukan proyek saat ini dan aplikasi untuk debugging:

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Pada tab “Debugger” Anda perlu menentukan perintah GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

Dan juga masukkan parameter untuk menghubungkan ke server GDB (host dan port):

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Pada tab “Startup”, Anda harus menentukan parameter berikut:

  • aktifkan kotak centang Muat gambar (sehingga gambar firmware yang telah dirakit dimuat ke dalam emulator);
  • aktifkan kotak centang Memuat simbol;
  • tambahkan perintah peluncuran: set $pc = *0x08000004 (atur register PC ke nilai dari memori di alamat 0x08000004 - alamatnya disimpan di sana Atur UlangHandler).

Catatan, jika Anda tidak ingin mengunduh file firmware dari Eclipse, maka opsinya Muat gambar и Jalankan perintah tidak perlu menunjukkan.

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Setelah mengklik Debug, Anda dapat bekerja dalam mode debugger:

  • eksekusi kode langkah demi langkah
    Badak di dalam kucing - jalankan firmware di emulator Kopycat
  • berinteraksi dengan breakpoint
    Badak di dalam kucing - jalankan firmware di emulator Kopycat

Catatan. Eclipse memiliki, hmm... beberapa keanehan... dan Anda harus menerimanya. Misalnya, jika saat memulai debugger muncul pesan “Tidak ada sumber yang tersedia untuk “0x0″”, maka jalankan perintah Langkah (F5)

Badak di dalam kucing - jalankan firmware di emulator Kopycat

Alih-alih sebuah kesimpulan

Meniru kode asli adalah hal yang sangat menarik. Pengembang perangkat dapat melakukan debug firmware tanpa perangkat sebenarnya. Bagi seorang peneliti, ini adalah kesempatan untuk melakukan analisis kode dinamis, yang tidak selalu mungkin dilakukan bahkan dengan perangkat.

Kami ingin memberi para spesialis alat yang nyaman, cukup sederhana, dan tidak memerlukan banyak tenaga dan waktu untuk menyiapkan dan menjalankannya.

Tulis di komentar tentang pengalaman Anda menggunakan emulator perangkat keras. Kami mengundang Anda untuk berdiskusi dan dengan senang hati akan menjawab pertanyaan.

Hanya pengguna terdaftar yang dapat berpartisipasi dalam survei. Masuk, silakan.

Untuk apa Anda menggunakan emulator?

  • Saya mengembangkan (debug) firmware

  • Saya sedang meneliti firmware

  • Saya meluncurkan game (Dendi, Sega, PSP)

  • sesuatu yang lain (tulis di komentar)

7 pengguna memilih. 2 pengguna abstain.

Perangkat lunak apa yang Anda gunakan untuk meniru kode asli?

  • QEMU

  • mesin unicorn

  • Proteus

  • sesuatu yang lain (tulis di komentar)

6 pengguna memilih. 2 pengguna abstain.

Apa yang ingin Anda tingkatkan pada emulator yang Anda gunakan?

  • Saya ingin kecepatan

  • Saya ingin kemudahan pengaturan/peluncuran

  • Saya ingin lebih banyak opsi untuk berinteraksi dengan emulator (API, kait)

  • Saya senang dengan segalanya

  • sesuatu yang lain (tulis di komentar)

8 pengguna memilih. 1 pengguna abstain.

Sumber: www.habr.com

Tambah komentar