
Under mötet 0x0A DC7831 Den 16 februari presenterade vi en förelĂ€sning om grundlĂ€ggande principer för emulering av binĂ€rkod och vĂ„r egen utveckling â emulatorn för hĂ„rdvaruplattformar .
I artikeln kommer vi att ge en beskrivning av hur man kör en enhets firmware i emulatorn, demonstrera interaktion med debuggern och utföra en liten dynamisk analys av firmwaren.
Bakgrund
En gÄng för lÀnge sedan i en galax lÄngt, lÄngt borta
För nÄgra Är sedan uppstod det ett behov i vÄrt laboratorium att undersöka firmware för en enhet. Firmwaren var komprimerad och packades upp av bootloadern. Den gjorde detta pÄ ett ganska komplicerat sÀtt, genom att flera gÄnger flytta data i minnet. Och sjÀlva firmwaren interagerade aktivt med periferin. Och allt detta pÄ en MIPS-kÀrna.
Existerande emulatorer passade oss av objektiva skĂ€l inte, och vi ville verkligen starta koden. Vi beslöt dĂ„ att göra vĂ„r egen emulator som skulle göra minimi och lĂ„ta oss packa upp huvudfirmwaren. Vi provade â det lyckades. Vi tĂ€nkte, vad hĂ€nder om vi lĂ€gger till periferin för att Ă€ven kunna köra huvudfirmwaren. Det var inte sĂ€rskilt smĂ€rtsamt â och det lyckades ocksĂ„. Vi tĂ€nkte igen och bestĂ€mde oss för att göra en fullfjĂ€drad emulator.
Resultatet blev en emulator för datorsystem .

Varför Kopycat?
Det Àr ett ordspel.
- copycat (eng., subst. [ËkÉpÉȘkĂŠt]) â imitatör, efterapare
- cat (eng., subst. [ËkĂŠt]) â katt, katten â det Ă€lskade djuret hos en av projektets skapare
- Bokstaven 'K' kommer frÄn programmeringssprÄket Kotlin
Kopycat
Vid skapandet av emulatorn satte vi upp helt bestÀmda mÄl:
- möjligheten att ganska snabbt skapa en ny perifer enhet, modul, processor-kÀrna;
- möjligheten att sammanstÀlla en virtuell enhet av olika moduler;
- möjligheten att ladda vilket binÀrt data (firmware) som helst i minnet pÄ den virtuella enheten;
- möjligheten att arbeta med snapshots (systemtillstÄndsbilder);
- möjligheten att interagera med emulatorn via den inbyggda debuggern;
- ett trevligt modernt sprÄk för utveckling.
Resultatet blev att Kotlin valdes för genomförandet, bus-arkitektur (dĂ€r moduler kopplas samman via virtuella databusser), JSON â som format för beskrivning av enheten, och GDB RSP â som protokoll för interaktion med debuggern.
Utvecklingen har pÄgÄtt i drygt tvÄ Är och fortsÀtter aktivt. Under denna tid har CPU-kÀrnor för MIPS, x86, V850ES, ARM och PowerPC implementerats.
Projektet vÀxer, och det Àr dags att presentera det för allmÀnheten. En detaljbeskrivning av projektet kommer senare, men nu fokuserar vi pÄ att anvÀnda Kopycat.
För de mest otĂ„liga â en provversion av emulatorn kan laddas ner via .
Noshörning i emulatorn
Kom ihÄg att det tidigare skapades en testenhet "Noshörning" för konferensen SMARTRHINO-2018 för att lÀra sig fÀrdigheter inom reverse engineering. Processen för statisk analys av firmware beskrevs i .
Nu ska vi försöka lÀgga till "dynamik" och köra firmware i emulatorn.
Vi behöver:
1) Java 1.8
2) Python och modulen för att anvÀnda Python inom emulatorn. WHL-paketet för Jep-modulen för Windows kan .
För Windows:
1)
2)
För Linux:
1) socat
Som GDB-klient kan Eclipse, IDA Pro eller radare2 anvÀndas.
Hur fungerar det?
För att kunna utföra firmware i emulatorn mÄste en "virtuell enhet" byggas, som Àr en motsvarighet till den verkliga enheten.
Den verkliga enheten ("noshörning") kan visas i en systemöversikt:

Emulatorn har en modulÀr struktur och den slutgiltiga virtuella enheten kan beskrivas i en JSON-fil.
JSON pÄ 105 rader
{
"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"]
]
}Observera parameter firmware i avsnittet params â detta Ă€r namnet pĂ„ filen som kan laddas upp till den virtuella enheten som firmware.
Den virtuella enheten och dess interaktion med det primÀra operativsystemet kan representeras av följande schema:

Den nuvarande testinstansen av emulatorn förutsÀtter interaktion med COM-portarna i det primÀra operativsystemet (debug UART och UART för Bluetooth-modulen). Det kan vara riktiga portar som Àr anslutna till enheter eller virtuella COM-portar (för detta behövs just com0com / socat).
För att interagera med emulatorn externt finns det för nÀrvarande tvÄ huvudsakliga metoder:
- GDB RSP-protokollet (verktyg som stöder detta protokoll â Eclipse / IDA / radare2);
- den interna kommandoraden för emulatorn (Argparse eller Python).
virtuella COM-portar
För att interagera med UART pÄ den virtuella enheten pÄ den lokala maskinen via en terminal mÄste du skapa ett par ihopkopplade virtuella COM-portar. I vÄrt fall anvÀnds en port av emulatorn och den andra av terminalprogrammet (PuTTY eller screen):

AnvÀndning av com0com
De virtuella COM-portarna konfigureras med setup-verktyget frĂ„n com0com-paketet (kommandoradsversion â C:Program Files (x86)com0comsetupŃ.exe, eller GUI-version â C:Program Files (x86)com0comsetupg.exe):

Du bör aktivera alternativen enable buffer overrun för alla skapade virtuella portar, annars kommer emulatorn att vÀnta pÄ svar frÄn COM-porten.
AnvÀndning av socat
I UNIX-system skapas virtuella COM-portar automatiskt av emulatorn med hjÀlp av socat-verktyget, det Àr tillrÀckligt att ange prefixet socat:.
Det interna kommandoradsgrÀnssnittet (Argparse eller Python)
Eftersom Kopycat Àr en konsolapplikation erbjuder emulatorn tvÄ alternativ för kommandoradsgrÀnssnitt för att interagera med sina objekt och variabler: Argparse och Python.
Argparse Àr CLI:n som Àr inbyggd i Kopycat, och den Àr alltid tillgÀnglig för alla.
Alternativt CLI â Python-tolk. För att anvĂ€nda detta mĂ„ste Python-modulen Jep installeras och emulatorn konfigureras för att arbeta med Python (den Python-tolk som Ă€r installerad i anvĂ€ndarens primĂ€ra system kommer att anvĂ€ndas).
Installation av Python-modulen Jep
Under Linux kan Jep installeras via pip:
pip install jepFör att installera Jep under Windows mÄste Windows SDK och motsvarande Microsoft Visual Studio först installeras. Vi har förenklat din uppgift nÄgot och gjort JEP för aktuella versioner av Python för Windows, sÄ modulen kan installeras frÄn filen:
pip install jep-3.8.2-cp27-cp27m-win_amd64.whlFör att kontrollera installationen av Jep, kör följande kommando i kommandorutan:
python -c "import jep"Som svar ska följande meddelande returneras:
ImportError: Jep stöds inte i fristĂ„ende Python, det mĂ„ste inbĂ€ddas i Java.I kommandofilen för emulatören för ditt system (kopycat.bat â för Windows, kopycat â för Linux) lĂ€gg till ett ytterligare parameter till listan DEFAULT_JVM_OPTS till ett extra parameter Djava.library.path â den ska innehĂ„lla sökvĂ€gen till den installerade Jep-modulen.
För Windows bör resultatet bli en rad av följande typ:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"Starta Kopycat
Emulatören Àr en konsol-JVM-applikation. Starten görs via ett kommandoskript i operativsystemet (sh/cmd).
Kommandot för att starta under Windows:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28Kommandot för att starta under Linux med hjÀlp av verktyget 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â TCP-porten som kommer att öppnas för Ă„tkomst till GDB-servern;-n rhinoâ namnet pĂ„ huvudmodulen i systemet (enheten i samlingen);-l userâ namnet pĂ„ biblioteket för att söka efter huvudmodulen;-y libraryâ sökvĂ€gen för att hitta moduler som ingĂ„r i enheten;firmwarerhino_pass.binâ sökvĂ€gen till firmwarefilen;- COM26 och COM28 Ă€r virtuella COM-portar.
Som resultat kommer en inbjudan att visas Python > (eller Argparse >):
18:07:59 INFO [eFactoryBuilder.create ]: Modulen top skapades framgÄngsrikt som top
18:07:59 INFO [ Module.initializeAndRes]: StÀller in kÀrnan till top.u1_stm32.cortexm0.arm för top
18:07:59 INFO [ Module.initializeAndRes]: StÀller in avkodaren till top.u1_stm32.dbg för top
18:07:59 WARN [ Module.initializeAndRes]: AvkÀnnaren hittades inte i top...
18:07:59 INFO [ Module.initializeAndRes]: Initierar portar och busser...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Vissa portar har varningar, anvÀnd printModulesPortsWarnings för att se det...
18:07:59 FINE [ ARMv6CPU.reset ]: StÀll in startpunktens adress till 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Modulen top Àr framgÄngsrikt initierad och ÄterstÀlld som en toppcell!
18:07:59 INFO [ Kopycat.open ]: Startar virtualisering av kortet top[rhino] med arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: StÀller in ny avkodare topp.u1_stm32.dbg för GDB_SERVER(port=23946,alive=true)
Python >Interagera med IDA Pro
Som indatafil för analys i IDA, för att förenkla testning, anvÀnder vi firmware "Rhinoceros" i form av (dÀr metainformationen Àr lagrad).
Du kan ocksÄ anvÀnda den huvudsakliga firmware utan metainformation.
Efter att Kopycat startats i IDA Pro, gĂ„ till menyn Debugger och vĂ€lj "Byt debuggerâŠÂ» och vĂ€lja «Remote GDB-debugger«. NĂ€sta, konfigurera anslutningen: menyn Debugger â ProcessalternativâŠ
StÀll in vÀrden:
- Application â vilket vĂ€rde som helst
- Hostname: 127.0.0.1 (eller IP-adressen till den avlÀgsna maskinen dÀr Kopycat körs)
- Port: 23946

Knappen för att starta debuggningslÀge (tangent F9) blir nu tillgÀnglig:
![]()
Tryck pĂ„ den â anslutning till debuggningsmodulen i emulatorn sker. IDA gĂ„r in i debuggningslĂ€ge, ytterligare fönster blir tillgĂ€ngliga: registerinformation, stackinformation.
Nu kan vi anvÀnda alla standardfunktioner i debuggningsverktyget:
- stegvis utförande av instruktioner (Step into och Step over â tangenterna F7 och F8, respektive);
- start och paus i utförande;
- skapa brytpunkter bÄde pÄ kod och data (tangent F2).
Anslutning till debuggningsverktyget innebĂ€r inte att firmwarekoden körs. Den aktuella positionen för exekvering mĂ„ste vara adressen 0x08006A74 â början av funktionen Reset_Handler. Om man scrollar ner i listningen kan man se anropet till funktionen main. Man kan sĂ€tta markören pĂ„ den hĂ€r raden (adressen 0x08006ABE) och utföra operationen Run until cursor (tangent F4).

DÀrefter kan man trycka pÄ F7 för att gÄ in i funktionen main.
Om man utför kommandot Continue process (tangent F9), dyker ett fönster med texten «Please wait» upp med en enda knapp Suspend:

Vid tryckning Suspend pausas utförandet av firmwarekoden och kan Äterupptas frÄn samma adress i koden dÀr det avbröts.
Om man fortsÀtter att köra koden kan man se följande rader i terminaler som Àr anslutna till virtuella COM-portar:


NÀrvaron av raden «state bypass» indikerar att den virtuella Bluetooth-modulen har övergÄtt till lÀget för att ta emot data frÄn anvÀndarens COM-port.
Nu kan man i Bluetooth-terminalen (i bilden â COM29) skriva kommandon enligt «Noshörnings»-protokollet. Till exempel, som svar pĂ„ kommandot «MEOW» kommer Bluetooth-terminalen att returnera raden «mur-mur»:

Emulera mig inte helt
Vid konstruktionen av emulatorsystemet kan man vÀlja graden av detaljrikedom/emulering av en viss enhet. Till exempel kan Bluetooth-modulen emuleras pÄ olika sÀtt:
- hela enheten emuleras med ett komplett kommando-set;
- AT-kommandon emuleras, medan dataflödet tas emot frÄn COM-porten i huvudsystemet;
- den virtuella enheten sÀkerstÀller fullstÀndig omdirigering av data till den verkliga enheten;
- i form av en enkel stub som alltid returnerar «OK».
I den aktuella versionen av emulatorn anvĂ€nds den andra metoden â en virtuell Bluetooth-modul konfigurerar, varefter den gĂ„r över till att "proxies" data frĂ„n COM-porten i det primĂ€ra systemet till UART-porten i emulatorn.

LÄt oss övervÀga möjligheten till enkel instrumentering av koden i fall dÀr nÄgon del av periferin inte Àr implementerad. Till exempel, om en timer som ansvarar för att kontrollera datatransmissionen i DMA inte har skapats (kontrollen görs i funktionen ws2812b_wait, som ligger pÄ adressen 0x08006840), kommer firmware alltid att vÀnta pÄ att flaggan busy, som ligger pÄ adressen 0x200004C4, ska ÄterstÀllas, vilket visar aktiviteten pÄ DMA-databussen:

Vi kan lösa denna situation genom att "manuellt" ÄterstÀlla flaggan busy direkt efter att den har satts. I IDA Pro kan du skapa en Python-funktion och anropa den i en breakpoint, sÀtta sjÀlva breakpointen i koden efter att ha skrivit vÀrdet 1 i flaggan busy.
Breakpoint-behandlare
Först ska vi skapa en Python-funktion i IDA. Menyn File â Script commandâŠ
LÀgg till ett nytt snipp i vÀnsterpanelen, ge den ett namn (till exempel, BPT),
och i textfÀltet till höger skriver vi funktionens kod:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False 
Efter detta trycker vi pÄ Run och stÀnger skriptfönstret.
Nu gĂ„r vi till koden pĂ„ adressen 0x0800688A, sĂ€tter en breakpoint (tangenten F2), redigerar den (högerklicksmenu Edit breakpointâŠ), glöm inte att stĂ€lla in skripttypen â Python:


Om det aktuella vÀrdet av flaggan busy Àr 1, bör funktionen skip_dma anropas i skriptet:

Om du kör firmware för att exekvera, kan du se kodens breakpoint-behandlare i IDA i fönstret Output med raderna Skipping wait ws2812.... Nu kommer firmware inte att vÀnta pÄ att flaggan ska ÄterstÀllas. busy.
Interaktion med emulatorn
Emulering för emuleringens skull kommer knappast att vÀcka glÀdje. Mycket intressantare Àr det om emulatorn hjÀlper forskaren att se data i minnet eller att sÀtta upp interaktion mellan trÄdar.
Vi ska visa hur man i realtid sÀtter upp interaktionen av RTOS-uppgifter. Först mÄste du stoppa koden om den körs. Om du gÄr till funktionen bluetooth_task_entry i grenen hantering av kommandot "LED" (adress 0x080057B8), kan du se att en viss meddelande först skapas och sedan skickas till det systematiska kön ledControlQueueHandle .

Du bör sÀtta en breakpoint vid Ätkomsten till variabeln ledControlQueueHandle, som ligger pÄ adressen 0x20000624 och fortsÀtta körning av koden:

Som följd av detta sker först ett stopp pĂ„ adressen 0x080057CA före anrop av funktionen osMailAlloc, sedan â pĂ„ adressen 0x08005806 före anrop av funktionen osMailPut, sedan efter en tid â pĂ„ adressen 0x08005BD4 (före anrop av funktionen osMailGet), som tillhör funktionen leds_task_entry (LED-task), det vill sĂ€ga att en vĂ€xling av uppgifter har Ă€gt rum, och nu har LED-tasken fĂ„tt kontrollen.

PÄ detta enkla sÀtt kan man avgöra hur RTOS-uppgifter interagerar med varandra.
SjÀlvklart kan interaktionen mellan uppgifter i verkligheten vara mer komplex, men med hjÀlp av en emulator blir det mindre arbetskrÀvande att spÄra denna interaktion.
Man kan se en kort video om att köra emulatormiljön och interagera med IDA Pro.
Körning med Radare2
Man kan inte förbise ett sÄ mÄngsidigt verktyg som Radare2.
För att ansluta till emulatormiljön med hjÀlp av r2 kommer kommandot att se ut sÄ hÀr:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elfJust nu Àr körning (dc) och avbrytande av körning (Ctrl+C) tillgÀngliga.
TyvÀrr finns det för nÀrvarande problem med r2 vid anvÀndning av hÄrdvarugdb-servern och minnesmappning, vilket gör att punkter för stopp och Stepping (kommando ds) inte fungerar. Vi hoppas att detta kommer att ÄtgÀrdas inom kort.
Körning med Eclipse
Ett av sÀtten att anvÀnda emulatormiljön Àr att debugga firmware för den utvecklade enheten. För tydlighetens skull kommer vi Àven att anvÀnda firmware "Rhino". KÀllkoden för firmen kan laddas ner .
Som IDE kommer vi att anvÀnda Eclipse frÄn uppsÀttningen .
För att emulatormiljön ska ladda firmwaren som direkt samlas i Eclipse, mÄste parametern firmware=null lÀggas till i kommandot för att starta emulatormiljön:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28InstÀllning av debug-konfiguration
I Eclipse vĂ€ljer vi menyn Kör â Debug-konfigurationer⊠I det öppna fönstret under GDB Hardware Debugging mĂ„ste en ny konfiguration lĂ€ggas till, varefter aktuellt projekt och applikation för debugging anges i fliken "Main":

I fliken "Debugger" mÄste GDB-kommandot anges:
${openstm32_compiler_path}arm-none-eabi-gdb
Och Àven ange parametrar för att ansluta till GDB-servern (vÀrd och port):

I fliken "Startup" mÄste följande parametrar anges:
- aktivera kryssrutan Ladda bild (sÄ att den komprimerade firmware-bilden laddas i emulatormiljön);
- aktivera kryssrutan Ladda symboler;
- lÀgg till startkommando:
set $pc = *0x08000004(sĂ€tta PC-registret till vĂ€rde frĂ„n minne pĂ„ adress0x08000004â dĂ€r adressen lagras ResetHandler).
Observera, om du inte vill ladda firmware-filen frÄn Eclipse, sÄ behöver du inte ange parametrar Ladda bild och Kör kommandon behöver inte anges.

Efter att ha tryckt pÄ Debug kan du arbeta i felsökningslÀge:
- steg-för-steg körning av kod

- interaktion med brytpunkter

AnmÀrkning. I Eclipse finns det, hmm... vissa egenskaper... och man fÄr leva med dem. Till exempel, om ett meddelande "Ingen kÀlla tillgÀnglig för "0x0"" visas vid start av felsökaren, kör kommandot Steg (F5)

Avslutande
Emulering av nativ kod Àr en mycket intressant uppgift. För en enhetsutvecklare öppnar det möjlighet att felsöka firmware utan verklig enhet. För en forskare erbjuder det möjlighet att göra dynamisk kodanalys, vilket inte alltid Àr möjligt ens med en enhet tillgÀnglig.
Vi vill ge specialister ett verktyg som Àr bekvÀmt, relativt enkelt och inte tar mycket tid och kraft för att stÀlla in och köra.
Skriv i kommentarerna om din erfarenhet av att anvÀnda hÄrdvaru-emulatorer. Vi vÀlkomnar diskussion och svarar gÀrna pÄ frÄgor.
Endast registrerade anvÀndare kan delta i omröstningen. , tack.
Vad anvÀnder du emulatören till?
utvecklar (felsöker) firmware
undersöker firmware
kör spel (Dendi, Sega, PSP)
nÄgot annat (skriv i kommentarerna)
7 anvÀndare har röstat. 2 anvÀndare avstod.
Vilken mjukvara anvÀnder du för emulering av nativ kod?
QEMU
Unicorn engine
Proteus
nÄgot annat (skriv i kommentarerna)
6 anvÀndare har röstat. 2 anvÀndare avstod.
Vad skulle du vilja förbÀttra i den anvÀnda emulatören?
jag vill ha mer hastighet
jag vill ha mer bekvÀmlighet i instÀllningar/start
jag vill ha fler interaktionsmöjligheter med emulatören (API, hooks)
jag Àr nöjd med allt
nÄgot annat (skriv i kommentarerna)
8 anvÀndare har röstat. 1 anvÀndare avstod.
KĂ€lla: habr.com


