
Sebagai sebahagian daripada mesyuarat 0x0A DC7831 Pada 16 Februari, kami membentangkan laporan tentang prinsip asas emulasi kod binari dan pembangunan kami sendiri - emulator platform perkakasan .
Dalam artikel ini kami akan menerangkan cara menjalankan perisian tegar peranti dalam emulator, menunjukkan interaksi dengan penyahpepijat dan melakukan analisis dinamik kecil perisian tegar.
prasejarah
Suatu masa dahulu di galaksi yang jauh
Beberapa tahun yang lalu di makmal kami terdapat keperluan untuk menyiasat perisian tegar peranti. Perisian tegar telah dimampatkan dan dibongkar dengan pemuat but. Dia melakukan ini dengan cara yang sangat rumit, mengalihkan data dalam ingatan beberapa kali. Dan perisian tegar itu sendiri kemudian secara aktif berinteraksi dengan peranti. Dan semua ini pada teras MIPS.
Atas sebab objektif, emulator yang tersedia tidak sesuai dengan kami, tetapi kami masih mahu menjalankan kod tersebut. Kemudian kami memutuskan untuk membuat emulator kami sendiri, yang akan melakukan yang minimum dan membolehkan kami membongkar perisian tegar utama. Kami mencubanya dan ia berkesan. Kami fikir, bagaimana jika kami menambah peranti untuk turut melaksanakan perisian tegar utama. Ia tidak menyakitkan sangat - dan ia juga berjaya. Kami berfikir lagi dan memutuskan untuk membuat emulator sepenuhnya.
Hasilnya ialah emulator sistem komputer .

Kenapa Kopycat?
Ada permainan kata.
- peniru (Bahasa Inggeris, kata nama [ΛkΙpΙͺkΓ¦t]) - peniru, peniru
- kucing (Bahasa Inggeris, kata nama [ΛkΓ¦t]) - kucing, kucing - haiwan kegemaran salah seorang pencipta projek
- Huruf "K" adalah daripada bahasa pengaturcaraan Kotlin
Peniru
Apabila mencipta emulator, matlamat yang sangat khusus telah ditetapkan:
- keupayaan untuk mencipta peranti, modul, teras pemproses baharu dengan cepat;
- keupayaan untuk memasang peranti maya dari pelbagai modul;
- keupayaan untuk memuatkan sebarang data binari (perisian tegar) ke dalam memori peranti maya;
- keupayaan untuk bekerja dengan syot kilat (syot kilat keadaan sistem);
- keupayaan untuk berinteraksi dengan emulator melalui penyahpepijat terbina dalam;
- bahasa moden yang bagus untuk pembangunan.
Hasilnya, Kotlin dipilih untuk pelaksanaan, seni bina bas (ini adalah apabila modul berkomunikasi antara satu sama lain melalui bas data maya), JSON sebagai format perihalan peranti dan GDB RSP sebagai protokol untuk interaksi dengan penyahpepijat.
Pembangunan telah berjalan selama lebih kurang dua tahun dan sedang giat dijalankan. Pada masa ini, teras pemproses MIPS, x86, V850ES, ARM dan PowerPC telah dilaksanakan.
Projek ini semakin berkembang dan sudah tiba masanya untuk membentangkannya kepada orang ramai. Kami akan melakukan penerangan terperinci mengenai projek itu kemudian, tetapi buat masa ini kami akan memberi tumpuan kepada menggunakan Kopycat.
Untuk yang paling tidak sabar, versi promosi emulator boleh dimuat turun daripada .
Badak dalam emulator
Mari kita ingat bahawa sebelum ini untuk persidangan SMARTHINO-2018, peranti ujian "Rhinoceros" telah dicipta untuk mengajar kemahiran kejuruteraan terbalik. Proses analisis perisian tegar statik telah diterangkan dalam .
Sekarang mari cuba tambah "pembesar suara" dan jalankan perisian tegar dalam emulator.
Kita perlukan:
1) Java 1.8
2) Python dan modul untuk menggunakan Python di dalam emulator. Binaan WHL modul Jep di bawah Windows seseorang boleh .
Untuk Windows:
1)
2)
Untuk Linux:
1) socat
Anda boleh menggunakan Eclipse, IDA Pro atau radare2 sebagai klien GDB.
Bagaimana ia berfungsi?
Untuk melaksanakan perisian tegar dalam emulator, perlu "memasang" peranti maya, yang merupakan analog peranti sebenar.
Peranti sebenar (βbadakβ) boleh ditunjukkan dalam rajah blok:
Emulator mempunyai struktur modular dan peranti maya terakhir boleh diterangkan dalam fail JSON.
baris JSON 105
{
"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"]
]
}
Beri perhatian kepada parameter firmware seksyen params ialah nama fail yang boleh dimuatkan ke dalam peranti maya sebagai perisian tegar.
Peranti maya dan interaksinya dengan sistem pengendalian utama boleh diwakili oleh rajah berikut:

Contoh ujian semasa emulator melibatkan interaksi dengan port COM OS utama (nyahpepijat UART dan UART untuk modul Bluetooth). Ini boleh menjadi port sebenar yang peranti disambungkan atau port COM maya (untuk ini anda hanya perlukan com0com/socat).
Pada masa ini terdapat dua cara utama untuk berinteraksi dengan emulator dari luar:
- Protokol RSP GDB (sehubungan itu, alat yang menyokong protokol ini ialah Eclipse / IDA / radare2);
- baris arahan emulator dalaman (Argparse atau Python).
Port COM maya
Untuk berinteraksi dengan UART peranti maya pada mesin tempatan melalui terminal, anda perlu mencipta sepasang port COM maya yang berkaitan. Dalam kes kami, satu port digunakan oleh emulator, dan yang kedua oleh program terminal (PuTTY atau skrin):

Menggunakan com0com
Port COM maya dikonfigurasikan menggunakan utiliti persediaan daripada kit com0com (versi konsol - C:Program Files (x86)com0comsetupΡ.exe, atau versi GUI - C:Program Files (x86)com0comsetupg.exe):

Semak kotak dayakan buffer overrun untuk semua port maya yang dicipta, jika tidak, emulator akan menunggu respons daripada port COM.
Menggunakan socat
Pada sistem UNIX, port COM maya dicipta secara automatik oleh emulator menggunakan utiliti socat untuk melakukan ini, hanya nyatakan awalan dalam nama port apabila memulakan emulator socat:.
Antara muka baris arahan dalaman (Argparse atau Python)
Memandangkan Kopycat ialah aplikasi konsol, emulator menyediakan dua pilihan antara muka baris arahan untuk berinteraksi dengan objek dan pembolehubahnya: Argparse dan Python.
Argparse ialah CLI terbina dalam Kopycat dan sentiasa tersedia untuk semua orang.
CLI alternatif ialah penterjemah Python. Untuk menggunakannya, anda perlu memasang modul Jep Python dan mengkonfigurasi emulator untuk berfungsi dengan Python (penterjemah Python yang dipasang pada sistem utama pengguna akan digunakan).
Memasang modul Python Jep
Di bawah Linux Jep boleh dipasang melalui pip:
pip install jep
Untuk memasang Jep di bawah Windows mesti dipasang terlebih dahulu Windows SDK dan Microsoft Visual Studio yang sepadan. Kami telah memudahkan sedikit untuk anda dan JEP untuk versi Python semasa Windows, jadi modul boleh dipasang daripada fail:
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
Untuk menyemak pemasangan Jep, anda perlu menjalankan pada baris arahan:
python -c "import jep"
Mesej berikut harus diterima sebagai balasan:
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
Dalam fail kelompok emulator untuk sistem anda (copycat.bat - untuk Windows, peniru - untuk Linux) ke senarai parameter DEFAULT_JVM_OPTS tambah parameter tambahan Djava.library.path β ia mesti mengandungi laluan ke modul Jep yang dipasang.
Akibatnya untuk Windows anda sepatutnya mendapat 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"
Melancarkan Kopycat
Emulator ialah aplikasi konsol JVM. Pelancaran dijalankan melalui skrip baris arahan sistem pengendalian (sh/cmd).
Perintah untuk dijalankan di bawah 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 bawah Linux menggunakan utiliti 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 dibuka untuk akses kepada pelayan GDB;-n rhinoβ nama modul sistem utama (peranti dipasang);-l userβ nama perpustakaan untuk mencari modul utama;-y libraryβ laluan untuk mencari modul yang disertakan dalam peranti;firmwarerhino_pass.binβ laluan ke fail perisian tegar;- COM26 dan COM28 ialah port COM maya.
Akibatnya, gesaan akan dipaparkan 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 memudahkan ujian, kami menggunakan perisian tegar Rhino sebagai fail sumber untuk analisis dalam IDA dalam borang (maklumat meta disimpan di sana).
Anda juga boleh menggunakan perisian tegar utama tanpa maklumat meta.
Selepas melancarkan Kopycat dalam IDA Pro, dalam menu Debugger pergi ke item βTukar penyahpepijatβ¦"dan pilih"Penyahpepijat GDB jauh". Seterusnya, sediakan sambungan: menu Penyahpepijat - Pilihan prosesβ¦
Tetapkan nilai:
- Aplikasi - sebarang nilai
- Nama hos: 127.0.0.1 (atau alamat IP mesin jauh tempat Kopycat sedang berjalan)
- Port: 23946

Kini butang penyahpepijatan tersedia (kunci F9):
![]()
Klik padanya untuk menyambung ke modul penyahpepijat dalam emulator. IDA masuk ke mod nyahpepijat, tetingkap tambahan tersedia: maklumat tentang daftar, tentang timbunan.
Sekarang kita boleh menggunakan semua ciri standard penyahpepijat:
- pelaksanaan arahan langkah demi langkah (Langkah masuk ΠΈ Melangkah β kekunci F7 dan F8, masing-masing);
- memulakan dan menjeda pelaksanaan;
- mencipta titik putus untuk kedua-dua kod dan data (kunci F2).
Menyambung kepada penyahpepijat tidak bermakna menjalankan kod perisian tegar. Kedudukan pelaksanaan semasa mestilah alamat 0x08006A74 - permulaan fungsi Reset_Handler. Jika anda tatal ke bawah senarai, anda boleh melihat panggilan fungsi utama. Anda boleh meletakkan kursor pada baris ini (alamat 0x08006ABE) dan lakukan operasi Jalankan sehingga kursor (kunci F4).

Seterusnya, anda boleh menekan F7 untuk memasuki fungsi tersebut utama.
Jika anda menjalankan arahan Teruskan proses (Kekunci F9), kemudian tetingkap "Sila tunggu" akan muncul dengan satu butang Gantung:

Semasa anda menekan Gantung pelaksanaan kod perisian tegar digantung dan boleh diteruskan dari alamat yang sama dalam kod di mana ia terganggu.
Jika anda terus melaksanakan kod, anda akan melihat baris berikut dalam terminal yang disambungkan ke port COM maya:


Kehadiran baris "pintasan negeri" menunjukkan bahawa modul Bluetooth maya telah bertukar kepada mod penerimaan data daripada port COM pengguna.
Sekarang di terminal Bluetooth (COM29 dalam gambar) anda boleh memasukkan arahan mengikut protokol Rhino. Sebagai contoh, arahan "MEOW" akan mengembalikan rentetan "mur-mur" ke terminal Bluetooth:

Mencontohi saya bukan sepenuhnya
Apabila membina emulator, anda boleh memilih tahap perincian/emulasi peranti tertentu. Sebagai contoh, modul Bluetooth boleh dicontohi dengan cara yang berbeza:
- peranti ditiru sepenuhnya dengan set penuh arahan;
- Arahan AT dicontohi, dan aliran data diterima daripada port COM sistem utama;
- peranti maya menyediakan ubah hala data lengkap ke peranti sebenar;
- sebagai rintisan ringkas yang sentiasa mengembalikan "OK".
Versi semasa emulator menggunakan pendekatan kedua - modul Bluetooth maya melakukan konfigurasi, selepas itu ia beralih ke mod "proksi" data dari port COM sistem utama ke port UART emulator.

Mari kita pertimbangkan kemungkinan instrumentasi mudah kod sekiranya sesetengah bahagian pinggir tidak dilaksanakan. Contohnya, jika pemasa yang bertanggungjawab untuk mengawal pemindahan data ke DMA belum dibuat (semakan dilakukan dalam fungsi ws2812b_tunggu, raspolojennoy po adresu 0x08006840), maka perisian tegar akan sentiasa menunggu bendera ditetapkan semula sibukbertempat di 0x200004C4yang menunjukkan penghunian baris data DMA:

Kita boleh mengatasi situasi ini dengan menetapkan semula bendera secara manual sibuk serta-merta selepas memasangnya. Dalam IDA Pro, anda boleh mencipta fungsi Python dan memanggilnya dalam titik putus, dan meletakkan titik putus itu sendiri dalam kod selepas menulis nilai 1 pada bendera sibuk.
Pengendali titik putus
Mula-mula, mari buat fungsi Python dalam IDA. Menu Fail - Perintah skrip...
Tambahkan coretan baharu dalam senarai di sebelah kiri, beri nama (contohnya, BPT),
Dalam medan teks di sebelah kanan, masukkan kod fungsi:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False

Selepas itu, klik Main dan tutup tetingkap skrip.
Sekarang mari kita pergi ke kod di 0x0800688A, tetapkan titik putus (kunci F2), editnya (menu konteks Edit titik putus...), jangan lupa tetapkan jenis skrip kepada Python:


Jika nilai bendera semasa sibuk sama dengan 1, maka anda harus melaksanakan fungsi tersebut langkau_dma dalam baris skrip:

Jika anda menjalankan perisian tegar untuk pelaksanaan, anda boleh melihat pencetus kod pengendali titik putus dalam tetingkap IDA Output mengikut baris Skipping wait ws2812.... Sekarang firmware tidak akan menunggu bendera ditetapkan semula sibuk.
Interaksi dengan emulator
Peniruan demi teladan tidak mungkin menimbulkan kegembiraan dan kegembiraan. Adalah lebih menarik jika emulator membantu penyelidik melihat data dalam ingatan atau mewujudkan interaksi benang.
Kami akan menunjukkan kepada anda cara untuk mewujudkan interaksi secara dinamik antara tugas RTOS. Anda harus menjeda pelaksanaan kod terlebih dahulu jika ia berjalan. Jika anda pergi ke fungsi bluetooth_task_entry ke cawangan pemprosesan arahan "LED" (alamat 0x080057B8), maka anda boleh melihat apa yang mula-mula dibuat dan kemudian dihantar ke baris gilir sistem ledControlQueueHandle beberapa mesej.

Anda harus menetapkan titik putus untuk mengakses pembolehubah ledControlQueueHandle, raspolojennoy po adresu 0x20000624 dan teruskan melaksanakan kod:

Akibatnya, perhentian pertama akan berlaku di alamat 0x080057CA sebelum memanggil fungsi osMailAlloc, kemudian di alamat 0x08005806 sebelum memanggil fungsi osMailPut, kemudian selepas beberapa ketika - ke alamat 0x08005BD4 (sebelum memanggil fungsi osMailGet), yang tergolong dalam fungsi leds_task_entry (LED-task), iaitu, tugas bertukar, dan kini LED-task menerima kawalan.

Dengan cara mudah ini anda boleh menetapkan cara tugas RTOS berinteraksi antara satu sama lain.
Sudah tentu, pada hakikatnya, interaksi tugas boleh menjadi lebih rumit, tetapi menggunakan emulator, menjejaki interaksi ini menjadi kurang sukar.
Anda boleh menonton video pendek emulator melancarkan dan berinteraksi dengan IDA Pro.
Lancarkan dengan Radare2
Anda tidak boleh mengabaikan alat sejagat seperti Radare2.
Untuk menyambung ke emulator menggunakan r2, arahan akan kelihatan seperti ini:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
Pelancaran tersedia sekarang (dc) dan jeda pelaksanaan (Ctrl+C).
Malangnya, pada masa ini, r2 mempunyai masalah apabila bekerja dengan pelayan gdb perkakasan dan susun atur memori kerana ini, titik putus dan Langkah tidak berfungsi (command ds). Kami berharap perkara ini akan diperbaiki tidak lama lagi.
Berlari dengan Eclipse
Salah satu pilihan untuk menggunakan emulator ialah menyahpepijat perisian tegar peranti yang sedang dibangunkan. Untuk kejelasan, kami juga akan menggunakan perisian tegar Rhino. Anda boleh memuat turun sumber perisian tegar .
Kami akan menggunakan Eclipse daripada set sebagai IDE .
Agar emulator memuatkan perisian tegar yang disusun secara langsung dalam Eclipse, anda perlu menambah parameter firmware=null kepada arahan pelancaran emulator:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
Menyediakan konfigurasi nyahpepijat
Dalam Eclipse, pilih menu Jalankan - Konfigurasi Nyahpepijat... Dalam tetingkap yang terbuka, dalam bahagian Penyahpepijatan Perkakasan GDB anda perlu menambah konfigurasi baharu, kemudian pada tab "Utama" nyatakan projek dan aplikasi semasa untuk penyahpepijatan:

Pada tab "Debugger" anda perlu menentukan arahan GDB:
${openstm32_compiler_path}arm-none-eabi-gdb
Dan juga masukkan parameter untuk menyambung ke pelayan GDB (hos dan port):

Pada tab "Permulaan", anda mesti menentukan parameter berikut:
- dayakan kotak semak Muatkan imej (supaya imej perisian tegar yang dipasang dimuatkan ke dalam emulator);
- dayakan kotak semak Muatkan simbol;
- tambah arahan pelancaran:
set $pc = *0x08000004(tetapkan daftar PC kepada nilai dari memori di alamat0x08000004- alamat disimpan di sana ResetHandler).
Perhatikan, jika anda tidak mahu memuat turun fail perisian tegar daripada Eclipse, maka pilihan Muatkan imej ΠΈ Jalankan arahan tak perlu tunjuk.

Selepas mengklik Nyahpepijat, anda boleh bekerja dalam mod nyahpepijat:
- pelaksanaan kod langkah demi langkah

- berinteraksi dengan titik putus

Nota. Eclipse mempunyai, hmm... beberapa keanehan... dan anda perlu hidup bersamanya. Contohnya, jika semasa memulakan penyahpepijat mesej "Tiada sumber tersedia untuk "0x0" muncul, kemudian laksanakan arahan Langkah (F5)

Daripada kesimpulan
Meniru kod asli adalah perkara yang sangat menarik. Pembangun peranti boleh menyahpepijat perisian tegar tanpa peranti sebenar. Bagi penyelidik, ini adalah peluang untuk menjalankan analisis kod dinamik, yang tidak selalu dapat dilakukan walaupun dengan peranti.
Kami ingin menyediakan pakar dengan alat yang mudah, sederhana sederhana dan tidak memerlukan banyak usaha dan masa untuk disediakan dan dijalankan.
Tulis dalam ulasan tentang pengalaman anda menggunakan emulator perkakasan. Kami menjemput anda untuk berbincang dan dengan senang hati akan menjawab soalan.
Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. , Sama-sama.
Untuk apa anda menggunakan emulator?
-
Saya membangunkan (nyahpepijat) perisian tegar
-
Saya sedang meneliti firmware
-
Saya melancarkan permainan (Dendi, Sega, PSP)
-
sesuatu yang lain (tulis dalam komen)
7 pengguna mengundi. 2 pengguna berpantang.
Apakah perisian yang anda gunakan untuk meniru kod asli?
-
QEMU
-
Enjin Unicorn
-
Proteus
-
sesuatu yang lain (tulis dalam komen)
6 pengguna mengundi. 2 pengguna berpantang.
Apakah yang anda ingin perbaiki dalam emulator yang anda gunakan?
-
Saya mahukan kelajuan
-
Saya mahukan kemudahan persediaan/pelancaran
-
Saya mahukan lebih banyak pilihan untuk berinteraksi dengan emulator (API, cangkuk)
-
Saya gembira dengan segala-galanya
-
sesuatu yang lain (tulis dalam komen)
8 pengguna mengundi. 1 pengguna berpantang.
Sumber: www.habr.com
