Isip kabahin sa miting 0x0A DC7831
Niini nga artikulo atong ihulagway kung giunsa pagpadagan ang firmware sa device sa emulator, pagpakita sa interaksyon sa debugger, ug paghimo og gamay nga dinamikong pagtuki sa firmware.
sa naunang kasaysayan
Dugay na nga panahon sa usa ka galaxy nga layo sa layo
Pipila ka tuig ang milabay sa among laboratoryo kinahanglan nga imbestigahan ang firmware sa usa ka aparato. Ang firmware gi-compress ug gi-unpack gamit ang bootloader. Gibuhat niya kini sa usa ka komplikado kaayo nga paagi, gibalhin ang data sa memorya sa daghang mga higayon. Ug ang firmware mismo dayon aktibo nga nakig-uban sa mga peripheral. Ug kining tanan sa MIPS core.
Alang sa katuyoan nga mga hinungdan, ang magamit nga mga emulator dili angay kanamo, apan gusto namon nga ipadagan ang code. Dayon nakahukom kami sa paghimo sa among kaugalingong emulator, nga maghimo sa minimum ug tugotan kami sa pag-unpack sa nag-unang firmware. Gisulayan namon kini ug kini nagtrabaho. Naghunahuna kami, unsa kaha kung magdugang kami mga peripheral aron mahimo usab ang panguna nga firmware. Dili kini kaayo masakit - ug kini milampos usab. Naghunahuna kami pag-usab ug nakahukom nga maghimo usa ka hingpit nga emulator.
Ang resulta mao ang usa ka computer system emulator
Nganong Kopycat?
Adunay dula sa mga pulong.
- copycat (Iningles, nombre [ˈkɒpɪkæt]) - tigsundog, tigsundog
- Iring (Iningles, noun [ˈkæt]) - iring, iring - ang paboritong hayop sa usa sa mga tiglalang sa proyekto
- Ang letra nga "K" gikan sa Kotlin programming language
Copycat
Sa paghimo sa emulator, piho kaayo nga mga tumong ang gitakda:
- ang abilidad sa dali nga paghimo og bag-ong mga peripheral, modules, processor cores;
- ang abilidad sa pag-assemble sa usa ka virtual nga aparato gikan sa lainlaing mga module;
- ang abilidad sa pag-load sa bisan unsa nga binary data (firmware) ngadto sa panumduman sa usa ka virtual device;
- abilidad sa pagtrabaho uban sa mga snapshot (mga snapshot sa kahimtang sa sistema);
- ang abilidad sa pagpakig-uban sa emulator pinaagi sa built-in debugger;
- nindot nga modernong pinulongan alang sa kalamboan.
Ingon usa ka sangputanan, gipili si Kotlin alang sa pagpatuman, ang arkitektura sa bus (kini kung ang mga module nakigsulti sa usag usa pinaagi sa mga virtual data bus), JSON ingon format sa paghulagway sa aparato, ug GDB RSP ingon protocol alang sa interaksyon sa debugger.
Ang pag-uswag nagpadayon sulod sa kapin sa duha ka tuig ug aktibo nga nagpadayon. Niini nga panahon, ang MIPS, x86, V850ES, ARM, ug PowerPC processor cores gipatuman.
Ang proyekto nagkadako ug panahon na nga ipresentar kini sa mas lapad nga publiko. Magbuhat kami usa ka detalyado nga paghulagway sa proyekto sa ulahi, apan sa pagkakaron magpunting kami sa paggamit sa Kopycat.
Alang sa labing walay pasensya, ang usa ka promo nga bersyon sa emulator mahimong ma-download gikan sa
Rhino sa emulator
Atong hinumdoman nga sa sayo pa alang sa SMARTHINO-2018 nga komperensya, usa ka test device nga "Rhinoceros" ang gimugna alang sa pagtudlo sa mga kahanas sa reverse engineering. Ang proseso sa static firmware analysis gihulagway sa
Karon atong sulayan nga idugang ang "mga mamumulong" ug ipadagan ang firmware sa emulator.
Kinahanglan namon:
1) Java 1.8
2) Python ug module
Alang sa Windows:
1)
2)
Alang sa Linux:
1) socat
Mahimo nimong gamiton ang Eclipse, IDA Pro o radare2 isip kliyente sa GDB.
Unsang paagi kini sa trabaho?
Aron mahimo ang firmware sa emulator, kinahanglan nga "magtipon" sa usa ka virtual nga aparato, nga usa ka analogue sa usa ka tinuud nga aparato.
Ang tinuod nga device (“rhino”) mahimong ipakita sa block diagram:
Ang emulator adunay modular nga istruktura ug ang katapusang virtual device mahimong mahulagway sa usa ka JSON file.
JSON 105 nga mga linya
{
"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"]
]
}
Hatagi'g pagtagad ang parameter firmware seksyon params mao ang ngalan sa usa ka file nga mahimong ikarga sa usa ka virtual device isip firmware.
Ang virtual device ug ang interaksyon niini sa main operating system mahimong irepresentar sa mosunod nga diagram:
Ang kasamtangan nga pagsulay nga pananglitan sa emulator naglakip sa interaksyon sa mga COM port sa main OS (debug UART ug UART alang sa Bluetooth module). Mahimo kini nga tinuod nga mga pantalan diin ang mga aparato konektado o mga virtual nga COM port (alang niini kinahanglan nimo com0com/socat).
Sa pagkakaron adunay duha ka nag-unang mga paagi sa pagpakig-uban sa emulator gikan sa gawas:
- GDB RSP protocol (sumala, ang mga himan nga nagsuporta niini nga protocol mao ang Eclipse / IDA / radare2);
- internal nga emulator command line (Argparse o Python).
Virtual COM nga mga pantalan
Aron makig-uban sa UART sa usa ka virtual device sa lokal nga makina pinaagi sa usa ka terminal, kinahanglan ka nga maghimo usa ka pares sa mga kauban nga virtual COM port. Sa among kaso, usa ka port ang gigamit sa emulator, ug ang ikaduha gigamit sa terminal program (PuTTY o screen):
Gamit ang com0com
Ang mga virtual COM ports gi-configure gamit ang setup utility gikan sa com0com kit (console version - C:Program Files (x86)com0comsetupс.exe, o GUI nga bersyon - C:Program Files (x86)com0comsetupg.exe):
Susiha ang mga kahon i-enable ang buffer overrun alang sa tanan nga gibuhat nga virtual nga mga pantalan, kung dili ang emulator maghulat alang sa tubag gikan sa COM port.
Paggamit sa socat
Sa mga sistema sa UNIX, ang mga virtual nga COM port awtomatik nga gihimo sa emulator gamit ang socat utility; aron mahimo kini, itakda lang ang prefix sa ngalan sa port kung magsugod ang emulator socat:
.
Internal nga command line interface (Argparse o Python)
Tungod kay ang Kopycat usa ka console nga aplikasyon, ang emulator naghatag og duha ka command line interface nga mga opsyon alang sa pagpakig-uban sa mga butang ug mga variable niini: Argparse ug Python.
Ang Argparse usa ka CLI nga gitukod sa Kopycat ug kanunay nga magamit sa tanan.
Ang alternatibong CLI mao ang Python interpreter. Aron magamit kini, kinahanglan nimo nga i-install ang module nga Jep Python ug i-configure ang emulator aron magtrabaho kauban ang Python (ang Python interpreter nga gi-install sa panguna nga sistema sa gumagamit ang gamiton).
Pag-instalar sa Python module nga Jep
Ubos sa Linux Jep mahimong ma-install pinaagi sa pip:
pip install jep
Aron ma-install ang Jep sa Windows, kinahanglan nimo una nga i-install ang Windows SDK ug ang katugbang nga Microsoft Visual Studio. Gihimo namo kini nga mas sayon alang kanimo ug
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
Aron masusi ang pag-instalar sa Jep, kinahanglan nimo nga modagan sa command line:
python -c "import jep"
Ang mosunod nga mensahe kinahanglang madawat isip tubag:
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
Sa emulator batch file para sa imong sistema (copycat.bat - alang sa Windows, copycat - alang sa Linux) sa lista sa mga parameter DEFAULT_JVM_OPTS
pagdugang usa ka dugang nga parameter Djava.library.path
— kini kinahanglan nga adunay sulud nga agianan padulong sa na-install nga module sa Jep.
Ang resulta alang sa Windows kinahanglan nga usa ka linya nga sama niini:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
Paglansad sa Kopycat
Ang emulator kay usa ka console JVM application. Ang paglansad gihimo pinaagi sa operating system command line script (sh/cmd).
Sugo nga modagan ubos sa Windows:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
Sugo nga modagan ubos sa Linux gamit ang socat utility:
./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 port nga bukas para sa access sa GDB server;-n rhino
- ngalan sa nag-unang module sa sistema (nagpundok nga aparato);-l user
— ngalan sa librarya aron pangitaon ang main module;-y library
- dalan sa pagpangita alang sa modules nga gilakip sa device;firmwarerhino_pass.bin
- dalan sa firmware file;- Ang COM26 ug COM28 mga virtual nga COM port.
Ingon usa ka sangputanan, usa ka prompt ang ipakita Python >
(o 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 >
Interaksyon sa IDA Pro
Aron pasimplehon ang pagsulay, gigamit namon ang Rhino firmware ingon gigikanan nga file alang sa pagtuki sa IDA sa porma
Mahimo usab nimo gamiton ang nag-unang firmware nga walay impormasyon sa meta.
Pagkahuman sa paglansad sa Kopycat sa IDA Pro, sa menu sa Debugger adto sa aytem nga "Ibalhin ang debugger…"Ug pilia"Hilit nga GDB debugger". Sunod, i-set up ang koneksyon: menu Debugger - Mga kapilian sa proseso…
Ibutang ang mga bili:
- Aplikasyon - bisan unsang kantidad
- Hostname: 127.0.0.1 (o ang IP address sa hilit nga makina diin nagdagan ang Kopycat)
- Port: 23946
Karon ang debugging button mahimong magamit (F9 key):
I-klik kini aron makonektar sa debugger module sa emulator. Ang IDA moadto sa debugging mode, dugang nga mga bintana mahimong magamit: kasayuran bahin sa mga rehistro, bahin sa stack.
Karon magamit na nato ang tanang standard features sa debugger:
- sunodsunod nga pagpatuman sa mga instruksiyon (Lakang sa и Lakang sa ibabaw - mga yawe F7 ug F8, matag usa);
- pagsugod ug paghunong sa pagpatay;
- paghimo og mga breakpoint alang sa code ug data (F2 key).
Ang pagkonektar sa usa ka debugger wala magpasabot sa pagpadagan sa firmware code. Ang kasamtangan nga posisyon sa pagpatay kinahanglan mao ang adres 0x08006A74
- pagsugod sa function Reset_Handler. Kung mag-scroll ka paubos sa listahan, imong makita ang function call nag-unang. Mahimo nimong ibutang ang cursor niini nga linya (address 0x08006ABE
) ug ipahigayon ang operasyon Pagdagan hangtod sa cursor (key F4).
Sunod, mahimo nimong ipadayon ang F7 aron makasulod sa function nag-unang.
Kung gipadagan nimo ang mando Ipadayon ang proseso (F9 key), unya ang "Palihug paghulat" nga bintana makita nga adunay usa ka buton Suspendido:
Sa imong pagpindot Suspendido Ang pagpatuman sa firmware code gisuspinde ug mahimong ipadayon gikan sa samang adres sa code diin kini nabalda.
Kung magpadayon ka sa pagpatuman sa code, imong makita ang mosunod nga mga linya sa mga terminal nga konektado sa virtual COM ports:
Ang presensya sa linya sa "state bypass" nagpakita nga ang virtual Bluetooth module mibalhin sa mode sa pagdawat sa datos gikan sa COM port sa user.
Karon sa Bluetooth terminal (COM29 sa hulagway) makasulod ka sa mga sugo subay sa Rhino protocol. Pananglitan, ang "MEOW" nga sugo ibalik ang string nga "mur-mur" sa Bluetooth terminal:
Sundoga ako dili sa hingpit
Kung magtukod usa ka emulator, mahimo nimong pilion ang lebel sa detalye / emulasyon sa usa ka partikular nga aparato. Pananglitan, ang Bluetooth module mahimong sundon sa lainlaing mga paagi:
- ang himan hingpit nga gisundog sa usa ka bug-os nga hugpong sa mga sugo;
- Ang mga sugo sa AT gisundog, ug ang data stream nadawat gikan sa COM port sa main system;
- ang virtual device naghatag og kompleto nga data redirection ngadto sa tinuod nga device;
- isip usa ka yano nga stub nga kanunay nagbalik nga "OK".
Ang kasamtangan nga bersyon sa emulator naggamit sa ikaduha nga pamaagi - ang virtual nga Bluetooth module naghimo sa pag-configure, pagkahuman kini mobalhin sa mode sa "proxying" nga datos gikan sa COM port sa main system ngadto sa UART port sa emulator.
Atong tagdon ang posibilidad sa yano nga instrumento sa code kung adunay pipila ka bahin sa periphery nga wala gipatuman. Pananglitan, kung ang usa ka timer nga responsable sa pagkontrol sa pagbalhin sa data sa DMA wala pa nahimo (ang pagsusi gihimo sa function ws2812b_paghulatnahimutang sa 0x08006840
), unya ang firmware kanunay maghulat alang sa bandila nga i-reset busynahimutang sa 0x200004C4
nga nagpakita sa occupancy sa DMA data line:
Masulbad nato kini nga sitwasyon pinaagi sa manual nga pag-reset sa bandila busy diha-diha dayon human sa pag-instalar niini. Sa IDA Pro, makahimo ka og Python function ug tawgon kini sa usa ka breakpoint, ug ibutang ang breakpoint mismo sa code human isulat ang value 1 sa flag busy.
Handler sa breakpoint
Una, maghimo kita ug Python function sa IDA. Menu File - Script nga sugo...
Pagdugang og bag-ong snippet sa lista sa wala, hatagi kini og ngalan (pananglitan, Ang BPT),
Sa text field sa tuo, isulod ang function code:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
Human niana kami mopadayon run ug isira ang script window.
Karon adto ta sa code sa 0x0800688A
, pagbutang ug breakpoint (F2 key), i-edit kini (context menu I-edit ang breakpoint...), ayaw kalimti ang pagbutang sa tipo sa script sa Python:
Kung ang karon nga kantidad sa bandila busy katumbas sa 1, nan kinahanglan nimo nga ipatuman ang function laktawan_dma sa linya sa script:
Kung gipadagan nimo ang firmware alang sa pagpatuman, ang pag-trigger sa breakpoint handler code makita sa bintana sa IDA output pinaagi sa linya Skipping wait ws2812...
. Karon ang firmware dili maghulat alang sa bandila nga i-reset busy.
Interaksyon sa emulator
Ang pagsundog alang sa pag-ulog-ulog lagmit dili makahatag kalipay ug kalipay. Kini labi ka makapaikag kung ang emulator makatabang sa tigdukiduki nga makita ang datos sa panumduman o matukod ang interaksyon sa mga hilo.
Ipakita namon kanimo kung giunsa ang dinamikong pag-establisar sa interaksyon tali sa mga buluhaton sa RTOS. Kinahanglan nimo nga ihunong una ang pagpatuman sa code kung kini nagdagan. Kung moadto ka sa function bluetooth_task_entry sa pagproseso nga sanga sa "LED" nga sugo (address 0x080057B8
), unya makita nimo kung unsa ang una nga gibuhat ug dayon ipadala sa pila sa sistema ledControlQueueHandle pipila ka mensahe.
Kinahanglan ka nga magbutang usa ka breakpoint aron ma-access ang variable ledControlQueueHandlenahimutang sa 0x20000624
ug ipadayon ang pagpatuman sa code:
Ingon usa ka sangputanan, ang paghunong mahitabo una sa adres 0x080057CA
sa wala pa tawagan ang function osMailAlloc, dayon sa adres 0x08005806
sa wala pa tawagan ang function osMailPut, unya pagkahuman sa usa ka panahon - sa adres 0x08005BD4
(sa wala pa tawagan ang function osMailGet), nga nahisakop sa function leds_task_entry (LED-task), nga mao, ang mga buluhaton gibalhin, ug karon ang LED-task nakadawat og kontrol.
Niining yano nga paagi maestablisar nimo kung giunsa ang mga buluhaton sa RTOS nakig-uban sa usag usa.
Siyempre, sa pagkatinuod, ang interaksyon sa mga buluhaton mahimong mas komplikado, apan gamit ang usa ka emulator, ang pagsubay niini nga interaksyon mahimong dili kaayo hago.
Ilunsad uban sa Radare2
Dili nimo mabalewala ang usa ka unibersal nga himan sama sa Radare2.
Aron makonektar sa emulator gamit ang r2, ang command ingon niini:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
Ang paglusad magamit na karon (dc
) ug ihunong ang pagpatuman (Ctrl+C).
Ikasubo, sa pagkakaron, ang r2 adunay mga problema kung nagtrabaho kauban ang hardware gdb server ug layout sa memorya; tungod niini, ang mga breakpoint ug Mga Lakang wala molihok (sugo ds
). Kami naglaum nga kini masulbad sa dili madugay.
Nagdagan uban ang Eclipse
Usa sa mga kapilian sa paggamit sa emulator mao ang pag-debug sa firmware sa device nga giugmad. Alang sa katin-awan, gamiton usab namo ang Rhino firmware. Mahimo nimong i-download ang mga gigikanan sa firmware
Atong gamiton ang Eclipse gikan sa set isip IDE
Aron ma-load sa emulator ang firmware nga direkta nga giipon sa Eclipse, kinahanglan nimo nga idugang ang parameter firmware=null
sa emulator launch command:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
Pag-set up sa debug configuration
Sa Eclipse, pilia ang menu Run - Debug Configuration... Sa bintana nga nagbukas, sa seksyon GDB Hardware Debugging kinahanglan nimong idugang ang usa ka bag-ong configuration, unya sa tab nga "Main" ipiho ang kasamtangan nga proyekto ug aplikasyon alang sa pag-debug:
Sa tab nga "Debugger" kinahanglan nimo nga ipiho ang mando sa GDB:
${openstm32_compiler_path}arm-none-eabi-gdb
Ug isulod usab ang mga parameter alang sa pagkonektar sa GDB server (host ug port):
Sa tab nga "Startup", kinahanglan nimo nga ipiho ang mosunod nga mga parameter:
- i-enable ang checkbox Ikarga ang hulagway (aron ang gitigum nga imahe sa firmware gikarga sa emulator);
- i-enable ang checkbox Ikarga ang mga simbolo;
- idugang ang mando sa paglansad:
set $pc = *0x08000004
(ibutang ang rehistro sa PC sa kantidad gikan sa memorya sa adres0x08000004
- ang adres gitipigan didto ResetHandler).
Pagtagad, kung dili nimo gusto nga i-download ang firmware file gikan sa Eclipse, unya ang mga kapilian Ikarga ang hulagway и Pagdalag mga sugo dili kinahanglan nga ipahibalo.
Human sa pag-klik sa Debug, mahimo kang magtrabaho sa debugger mode:
- lakang sa lakang nga pagpatuman sa code
- nakig-uban sa mga breakpoints
Примечание. Ang Eclipse adunay, hmm ... pipila ka mga quirks ... ug kinahanglan ka nga mopuyo uban kanila. Pananglitan, kung sa pagsugod sa debugger ang mensahe nga "Walay tinubdan nga magamit alang sa" 0x0 "" makita, unya ipatuman ang Lakang sugo (F5)
Kay sa usa ka konklusyon
Ang pagsundog sa lumad nga code usa ka makapaikag kaayo nga butang. Mahimong posible alang sa usa ka developer sa device nga i-debug ang firmware nga walay tinuod nga device. Alang sa usa ka tigdukiduki, kini usa ka oportunidad sa pagpahigayon sa dinamikong pagtuki sa code, nga dili kanunay posible bisan sa usa ka aparato.
Gusto namon nga hatagan ang mga espesyalista sa usa ka himan nga kombenyente, kasarangan nga yano ug wala magkinahanglan daghang paningkamot ug oras sa pag-set up ug pagdagan.
Isulat sa mga komento bahin sa imong kasinatian sa paggamit sa mga emulator sa hardware. Kami nagdapit kanimo sa paghisgot ug malipay sa pagtubag sa mga pangutana.
Ang mga rehistradong tiggamit lamang ang makaapil sa survey.
Unsa imong gamit sa emulator?
-
Nag-develop ko (debug) firmware
-
Nag-research ko sa firmware
-
Naglunsad ko og mga dula (Dendi, Sega, PSP)
-
lain pa (isulat sa mga komento)
7 ka tiggamit ang miboto. 2 ka tiggamit ang nag- abstain.
Unsa nga software ang imong gigamit sa pagsundog sa lumad nga code?
-
QEMU
-
Unicorn nga makina
-
Proteus
-
lain pa (isulat sa mga komento)
6 ka tiggamit ang miboto. 2 ka tiggamit ang nag- abstain.
Unsa ang gusto nimong pauswagon sa emulator nga imong gigamit?
-
Gusto ko nga paspas
-
Gusto nako ang kadali sa pag-setup / paglansad
-
Gusto ko og dugang nga mga kapilian sa pagpakig-uban sa emulator (API, mga kaw-it)
-
Nalipay ko sa tanan
-
lain pa (isulat sa mga komento)
8 user ang nagboto. 1 user ang ni- abstain.
Source: www.habr.com