Salaku bagian tina rapat 0x0A DC7831
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
Naha Kopycat?
Aya kaulinan kecap.
- tukang nyalin (Inggris, nomina [ˈkɒpɪkæt]) - peniru, peniru
- ucing (Inggris, nomina [ˈkæt]) - ucing, ucing - sato karesep salah sahiji panyipta proyék
- 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
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
Ayeuna hayu urang coba pikeun nambahkeun "speaker" tur ngajalankeun firmware dina émulator nu.
Urang peryogi:
1) Java 1.8
2) Python jeung modul
Pikeun Windows:
1)
2)
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:
é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:
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):
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):
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
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
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
Ayeuna tombol debugging sayogi (konci F9):
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).
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:
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:
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:
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.
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 0x200004C4
nu nembongkeun occupancy tina garis data DMA:
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
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:
Lamun nilai bandéra ayeuna sibuk sarua 1, mangka anjeun kudu ngaéksekusi fungsi skip_dma dina garis skrip:
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.
Anjeun kudu nyetel breakpoint pikeun ngakses variabel ledControlQueueHandlelokasina di 0x20000624
sareng teraskeun ngaéksekusi kodeu:
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.
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.
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
Urang bakal ngagunakeun Eclipse tina set salaku IDE
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:
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):
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 alamat0x08000004
- 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.
Saatos ngaklik Debug, anjeun tiasa damel dina modeu debugger:
- step by step palaksanaan kode
- interaksi jeung breakpoints
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)
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.
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