äŒè°ã®äžç°ãšã㊠0x0A DC7831
ãã®èšäºã§ã¯ããšãã¥ã¬ãŒã¿ã§ããã€ã¹ ãã¡ãŒã ãŠã§ã¢ãå®è¡ãããããã¬ãšã®å¯Ÿè©±ã瀺ãããã¡ãŒã ãŠã§ã¢ã®å°èŠæš¡ãªåçåæãå®è¡ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
èæ¯
é ãæãé¥ã圌æ¹ã®é河系ã§
æ°å¹Žåãç§ãã¡ã®ç 究宀ã§ã¯ãããã€ã¹ã®ãã¡ãŒã ãŠã§ã¢ã調æ»ããå¿ èŠããããŸããã ãã¡ãŒã ãŠã§ã¢ã¯å§çž®ãããããŒãããŒããŒã§è§£åãããŸããã 圌ã¯ãããéåžžã«è€éãªæ¹æ³ã§è¡ããã¡ã¢ãªå ã®ããŒã¿ãæ°å移åããŸããã ãããŠããã¡ãŒã ãŠã§ã¢èªäœãåšèŸºæ©åšãšç©æ¥µçã«å¯Ÿè©±ããŸãã ãããã¯ãã¹ãŠ MIPS ã³ã¢äžã«ãããŸãã
客芳çãªçç±ãããå©çšå¯èœãªãšãã¥ã¬ãŒã¿ã¯ç§ãã¡ã«ã¯é©ããŠããŸããã§ããããããã§ãã³ãŒããå®è¡ããããšèããŠããŸããã ããã§ãæå°éã®æ©èœãåããã¡ã€ã³ ãã¡ãŒã ãŠã§ã¢ã解åã§ããç¬èªã®ãšãã¥ã¬ãŒã¿ãäœæããããšã«ããŸããã è©ŠããŠã¿ããããŸããããŸããã ç§ãã¡ã¯ãã¡ã€ã³ã®ãã¡ãŒã ãŠã§ã¢ãå®è¡ããåšèŸºæ©åšãè¿œå ãããã©ããªãããšèããŸããã ããã»ã©çã¿ã¯ãããŸããã§ããããããŸããããŸããã ç§ãã¡ã¯èãçŽããŠãæ¬æ Œçãªãšãã¥ã¬ãŒã¿ãäœæããããšã«ããŸããã
ãã®çµæçãŸããã®ããã³ã³ãã¥ãŒã¿ ã·ã¹ãã ãšãã¥ã¬ãŒã¿ã§ãã
ãªãã³ããŒãã£ãããªã®ãïŒ
èšèéã³ããããŸãã
- æš¡å£è (è±èªãåè© [ËkÉpɪkÊt]) - æš¡å£è ãæš¡å£è
- cat (è±èªãåè© [ËkÊt]) - ç«ãç« - ãããžã§ã¯ãã®äœæè ã® XNUMX 人ã®ãæ°ã«å ¥ãã®åç©
- æåãKã㯠Kotlin ããã°ã©ãã³ã°èšèªããæ¥ãŠããŸã
æš¡å£è
ãšãã¥ã¬ãŒã¿ãäœæãããšããéåžžã«å ·äœçãªç®æšãèšå®ãããŸããã
- æ°ããåšèŸºæ©åšãã¢ãžã¥ãŒã«ãããã»ããµ ã³ã¢ãè¿ éã«äœæããæ©èœã
- ããŸããŸãªã¢ãžã¥ãŒã«ããä»®æ³ããã€ã¹ãçµã¿ç«ãŠãæ©èœã
- ä»»æã®ãã€ã㪠ããŒã¿ (ãã¡ãŒã ãŠã§ã¢) ãä»®æ³ããã€ã¹ã®ã¡ã¢ãªã«ããŒãããæ©èœã
- ã¹ãããã·ã§ãã (ã·ã¹ãã ç¶æ ã®ã¹ãããã·ã§ãã) ãæäœããæ©èœã
- å èµãããã¬ãéããŠãšãã¥ã¬ãŒã¿ãšå¯Ÿè©±ããæ©èœã
- éçºã«æé©ãªçŸä»£èšèªã
ãã®çµæãå®è£ ããã¹ ã¢ãŒããã¯ã㣠(ã¢ãžã¥ãŒã«ãä»®æ³ããŒã¿ ãã¹ãä»ããŠçžäºã«éä¿¡ããå Žå)ãããã€ã¹èšè¿°åœ¢åŒãšã㊠JSONããããã¬ãŒãšã®å¯Ÿè©±çšãããã³ã«ãšã㊠GDB RSP ãå®è£ ã«éžæãããŸããã
éçºã¯ 86 幎äœãã«ããã£ãŠè¡ãããŠãããçŸåšãç©æ¥µçã«é²è¡äžã§ãã ãã®éã«ãMIPSãx850ãVXNUMXESãARMãããã³ PowerPC ããã»ããµ ã³ã¢ãå®è£ ãããŸããã
ãããžã§ã¯ãã¯æé·ãç¶ããŠãããåºãäžè¬ã«å ¬éããææãæ¥ãŸããã ãããžã§ã¯ãã®è©³çŽ°ã«ã€ããŠã¯åŸã»ã©èª¬æããŸãããããã§ã¯ Kopycat ã®äœ¿çšã«çŠç¹ãåœãŠãŸãã
æããã£ãã¡ãªæ¹ã®ããã«ããšãã¥ã¬ãŒã¿ã®ããã¢ãŒã·ã§ã³ ããŒãžã§ã³ã次ã®ãµã€ãããããŠã³ããŒãã§ããŸãã
ãšãã¥ã¬ãŒã¿å ã® Rhino
以åãSMARTRHINO-2018 ã«ã³ãã¡ã¬ã³ã¹ã«åããŠããªããŒã¹ ãšã³ãžãã¢ãªã³ã° ã¹ãã«ãæããããã«ãã¹ã ããã€ã¹ãRhinocerosããäœæãããããšãæãåºããŠãã ããã éçãã¡ãŒã ãŠã§ã¢è§£æã®ããã»ã¹ã«ã€ããŠã¯ãã
次ã«ããã¹ããŒã«ãŒããè¿œå ãããšãã¥ã¬ãŒã¿ã§ãã¡ãŒã ãŠã§ã¢ãå®è¡ããŠã¿ãŸãããã
ç§ãã¡ã¯ãå¿
èŠããããŸãã
1) Java 1.8
2) Pythonãšã¢ãžã¥ãŒã«
Windowsã®å ŽåïŒ
1)
2)
Linuxã®å Žå:
1) ãœã«ãã
EclipseãIDA ProããŸã㯠Radare2 ã GDB ã¯ã©ã€ã¢ã³ããšããŠäœ¿çšã§ããŸãã
ããã¯ã©ã®ããã«åäœããŸããïŒ
ãšãã¥ã¬ãŒã¿ã§ãã¡ãŒã ãŠã§ã¢ãå®è¡ããã«ã¯ãå®éã®ããã€ã¹ã«çžåœããä»®æ³ããã€ã¹ããã¢ã»ã³ãã«ãããå¿ èŠããããŸãã
å®éã®ããã€ã¹ (ãrhinoã) ã¯ãããã¯å³ã§ç€ºãããŸãã
ãšãã¥ã¬ãŒã¿ã¯ã¢ãžã¥ãŒã«æ§é ã«ãªã£ãŠãããæçµçãªä»®æ³ããã€ã¹ã¯ JSON ãã¡ã€ã«ã§èšè¿°ã§ããŸãã
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"]
]
}
ãã©ã¡ãŒã¿ã«æ³šæããŠãã ãã ãã¡ãŒã ãŠã§ã¢ ã»ã¯ã·ã§ã³ params㯠仮æ³ããã€ã¹ã«ãã¡ãŒã ãŠã§ã¢ãšããŠããŒãã§ãããã¡ã€ã«ã®ååã§ãã
ä»®æ³ããã€ã¹ãšãã®ã¡ã€ã³ ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãšã®å¯Ÿè©±ã¯ã次ã®å³ã§è¡šãããšãã§ããŸãã
ãšãã¥ã¬ãŒã¿ã®çŸåšã®ãã¹ã ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãã¡ã€ã³ OS ã® COM ããŒããšã®å¯Ÿè©±ãå«ãŸããŸã (ãããã° UART ããã³ Bluetooth ã¢ãžã¥ãŒã«çšã® UART)ã ãããã¯ãããã€ã¹ãæ¥ç¶ãããŠããå®éã®ããŒãããŸãã¯ä»®æ³ COM ããŒãã«ããããšãã§ããŸã (ããã«ã¯å¿ èŠãªãã®ã ããå¿ èŠã§ã) com0com/socat).
å€éšãããšãã¥ã¬ãŒã¿ãšå¯Ÿè©±ããã«ã¯ãçŸåš XNUMX ã€ã®äž»ãªæ¹æ³ããããŸãã
- GDB RSP ãããã³ã« (ãããã£ãŠããã®ãããã³ã«ããµããŒãããããŒã«ã¯ Eclipse/IDA/radare2 ã§ã)ã
- å éšãšãã¥ã¬ãŒã¿ ã³ãã³ã ã©ã€ã³ (Argparse ãŸã㯠Python)ã
ä»®æ³COMããŒã
ã¿ãŒããã«çµç±ã§ããŒã«ã« ãã·ã³äžã®ä»®æ³ããã€ã¹ã® UART ãšå¯Ÿè©±ããã«ã¯ãé¢é£ä»ããããä»®æ³ COM ããŒãã®ãã¢ãäœæããå¿ èŠããããŸãã ãã®äŸã§ã¯ãXNUMX ã€ã®ããŒãã¯ãšãã¥ã¬ãŒã¿ã«ãã£ãŠäœ¿çšãããXNUMX ã€ç®ã®ããŒãã¯ã¿ãŒããã« ããã°ã©ã (PuTTY ãŸã㯠screen) ã«ãã£ãŠäœ¿çšãããŸãã
com0comã®äœ¿çš
ä»®æ³ COM ããŒãã¯ãcom0com ããã (ã³ã³ãœãŒã« ããŒãžã§ã³ - C:ããã°ã©ã ãã¡ã€ã« (x86)com0comsetupÑ.exeã ãŸã㯠GUI ããŒãžã§ã³ - C:ããã°ã©ã ãã¡ã€ã« (x86)com0comsetupg.exe):
ãã§ãã¯ããã¯ã¹ããªã³ã«ããŸã ãããã¡ãªãŒããŒã©ã³ãæå¹ã«ãã ãã以å€ã®å Žåããšãã¥ã¬ãŒã¿ã¯ COM ããŒãããã®å¿çãåŸ ã¡ãŸãã
socatã®äœ¿çš
UNIX ã·ã¹ãã ã§ã¯ãä»®æ³ COM ããŒãã¯ãsocat ãŠãŒãã£ãªãã£ã䜿çšããŠãšãã¥ã¬ãŒã¿ã«ãã£ãŠèªåçã«äœæãããŸãããããè¡ãã«ã¯ããšãã¥ã¬ãŒã¿ã®èµ·åæã«ããŒãåã®ãã¬ãã£ãã¯ã¹ãæå®ããã ãã§ãã socat:
.
å éšã³ãã³ã ã©ã€ã³ ã€ã³ã¿ãŒãã§ã€ã¹ (Argparse ãŸã㯠Python)
Kopycat ã¯ã³ã³ãœãŒã« ã¢ããªã±ãŒã·ã§ã³ã§ããããããšãã¥ã¬ãŒã¿ã«ã¯ããã®ãªããžã§ã¯ããšå€æ°ãæäœããããã® XNUMX ã€ã®ã³ãã³ã ã©ã€ã³ ã€ã³ã¿ãŒãã§ã€ã¹ ãªãã·ã§ã³ (Argparse ãš Python) ãæäŸãããŸãã
Argparse 㯠Kopycat ã«çµã¿èŸŒãŸããŠãã CLI ã§ããã誰ã§ããã€ã§ãå©çšã§ããŸãã
代æ¿ã® CLI 㯠Python ã€ã³ã¿ãŒããªã¿ãŒã§ãã ããã䜿çšããã«ã¯ãJep Python ã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããPython ã§åäœããããã«ãšãã¥ã¬ãŒã¿ãŒãæ§æããå¿ èŠããããŸã (ãŠãŒã¶ãŒã®ã¡ã€ã³ ã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãããŠãã Python ã€ã³ã¿ãŒããªã¿ãŒã䜿çšãããŸã)ã
Pythonã¢ãžã¥ãŒã«Jepã®ã€ã³ã¹ããŒã«
Linux ã§ã¯ãJep 㯠pip çµç±ã§ã€ã³ã¹ããŒã«ã§ããŸãã
pip install jep
Windows ã« Jep ãã€ã³ã¹ããŒã«ããã«ã¯ããŸã Windows SDK ãšå¯Ÿå¿ãã Microsoft Visual Studio ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ããå°ãç°¡åã«ã§ããããã«ããŸããã
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
Jep ã®ã€ã³ã¹ããŒã«ã確èªããã«ã¯ãã³ãã³ã ã©ã€ã³ã§æ¬¡ãå®è¡ããå¿ èŠããããŸãã
python -c "import jep"
å¿çãšããŠæ¬¡ã®ã¡ãã»ãŒãžãè¿ãããã¯ãã§ãã
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
ã·ã¹ãã ã®ãšãã¥ã¬ãŒã¿ ããã ãã¡ã€ã«å
(ã³ããŒãã£ãã.ããã - Windowsã®å Žåã æš¡å£å - Linux ã®å Žå) ãã©ã¡ãŒã¿ã®ãªã¹ããž DEFAULT_JVM_OPTS
ãã©ã¡ãŒã¿ãè¿œå ãã Djava.library.path
â ã€ã³ã¹ããŒã«ãããŠãã Jep ã¢ãžã¥ãŒã«ãžã®ãã¹ãå«ãŸããŠããå¿
èŠããããŸãã
Windows ã®å Žåãçµæã¯æ¬¡ã®ãããªè¡ã«ãªãã¯ãã§ãã
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
Kopycatã®èµ·å
ãšãã¥ã¬ãŒã¿ã¯ã³ã³ãœãŒã« JVM ã¢ããªã±ãŒã·ã§ã³ã§ãã èµ·åã¯ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®ã³ãã³ã ã©ã€ã³ ã¹ã¯ãªãã (sh/cmd) ãéããŠå®è¡ãããŸãã
Windows ã§å®è¡ããã³ãã³ã:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
socat ãŠãŒãã£ãªãã£ã䜿çšã㊠Linux ã§å®è¡ããã³ãã³ã:
./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
â GDB ãµãŒããŒãžã®ã¢ã¯ã»ã¹ã®ããã«éããã TCP ããŒãã-n rhino
â ã¡ã€ã³ ã·ã¹ãã ã¢ãžã¥ãŒã« (çµã¿ç«ãŠãããããã€ã¹) ã®ååã-l user
â ã¡ã€ã³ã¢ãžã¥ãŒã«ãæ€çŽ¢ããã©ã€ãã©ãªã®ååã-y library
â ããã€ã¹ã«å«ãŸããã¢ãžã¥ãŒã«ãæ€çŽ¢ããããã®ãã¹ãfirmwarerhino_pass.bin
â ãã¡ãŒã ãŠã§ã¢ ãã¡ã€ã«ãžã®ãã¹ã- COM26 ãš COM28 ã¯ä»®æ³ COM ããŒãã§ãã
ãã®çµæãããã³ããã衚瀺ãããŸã Python >
ïŒãŸã㯠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 >
IDA Pro ãšã®å¯Ÿè©±
ãã¹ããç°¡çŽ åããããã«ãIDA ã§ã®åæçšã®ãœãŒã¹ ãã¡ã€ã«ãšã㊠Rhino ãã¡ãŒã ãŠã§ã¢ã次ã®åœ¢åŒã§äœ¿çšããŸãã
ã¡ã¿æ å ±ãªãã§ã¡ã€ã³ãã¡ãŒã ãŠã§ã¢ã䜿çšããããšãã§ããŸãã
IDA Pro 㧠Kopycat ãèµ·åããåŸããããã¬ãŒ ã¡ãã¥ãŒã§é ç®ããããã¬ãåãæ¿ãâŠãããéžæããŠããªã¢ãŒã GDB ãããã¬ãŒãã 次ã«ãæ¥ç¶ãèšå®ããŸã: ã¡ãã¥ãŒ ããã㬠- ããã»ã¹ ãªãã·ã§ã³âŠ
å€ãèšå®ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ - ä»»æã®å€
- ãã¹ãå: 127.0.0.1 (ãŸã㯠Kopycat ãå®è¡ãããŠãããªã¢ãŒã ãã·ã³ã® IP ã¢ãã¬ã¹)
- ããŒãïŒ23946
ããã§ããããã° ãã¿ã³ (F9 ããŒ) ã䜿çšå¯èœã«ãªããŸãã
ãããã¯ãªãã¯ããŠããšãã¥ã¬ãŒã¿ã®ããã㬠ã¢ãžã¥ãŒã«ã«æ¥ç¶ããŸãã IDA ã¯ãããã° ã¢ãŒãã«ãªããè¿œå ã®ãŠã£ã³ã㊠(ã¬ãžã¹ã¿ã«é¢ããæ å ±ãã¹ã¿ãã¯ã«é¢ããæ å ±) ãå©çšå¯èœã«ãªããŸãã
ããã§ããããã¬ãŒã®ãã¹ãŠã®æšæºæ©èœã䜿çšã§ããããã«ãªããŸããã
- åœä»€ã®æ®µéçãªå®è¡ (ã¹ãããã€ã³ О ã¹ããããªãŒã㌠â ãããã F7 ããŒãš F8 ããŒ)ã
- å®è¡ã®éå§ãšäžæåæ¢ã
- ã³ãŒããšããŒã¿ã®äž¡æ¹ã«ãã¬ãŒã¯ãã€ã³ããäœæããŸã (F2 ããŒ)ã
ãããã¬ãŒã«æ¥ç¶ããããšã¯ããã¡ãŒã ãŠã§ã¢ ã³ãŒããå®è¡ããããšãæå³ããããã§ã¯ãããŸããã çŸåšã®å®è¡äœçœ®ã¯ã¢ãã¬ã¹ã§ãªããã°ãªããŸãã 0x08006A74
â æ©èœã®éå§ Reset_Handlerã ãªã¹ããäžã«ã¹ã¯ããŒã«ãããšãé¢æ°åŒã³åºãã衚瀺ãããŸãã ã¡ã€ã³ã ãã®è¡ (ã¢ãã¬ã¹) ã«ã«ãŒãœã«ã眮ãããšãã§ããŸãã 0x08006ABE
)ããŠæäœãå®è¡ããŸã ã«ãŒãœã«ãŸã§å®è¡ (F4ããŒ)ã
次ã«ãF7 ãæŒããŠé¢æ°ã«å ¥ããŸãã ã¡ã€ã³.
ã³ãã³ããå®è¡ãããš ããã»ã¹ãç¶è¡ (F9 ããŒ) ãã¯ãªãã¯ãããšããã¿ã³ XNUMX ã€ã§ããåŸ ã¡ãã ããããŠã£ã³ããŠã衚瀺ãããŸãã ãµã¹ãã³ã:
æŒããš ãµã¹ãã³ã ãã¡ãŒã ãŠã§ã¢ ã³ãŒãã®å®è¡ã¯äžæåæ¢ãããäžæãããã³ãŒãå ã®åãã¢ãã¬ã¹ããç¶è¡ã§ããŸãã
ã³ãŒãã®å®è¡ãç¶ãããšãä»®æ³ COM ããŒãã«æ¥ç¶ãããŠãã端æ«ã«æ¬¡ã®è¡ã衚瀺ãããŸãã
ãç¶æ ãã€ãã¹ãè¡ã®ååšã¯ãä»®æ³ Bluetooth ã¢ãžã¥ãŒã«ããŠãŒã¶ãŒã® COM ããŒãããããŒã¿ãåä¿¡ããã¢ãŒãã«åãæ¿ãã£ãããšã瀺ããŸãã
ããã§ãBluetooth ã¿ãŒããã« (åçã® COM29) ã§ãRhino ãããã³ã«ã«åŸã£ãŠã³ãã³ããå ¥åã§ããããã«ãªããŸãã ããšãã°ããMEOWãã³ãã³ãã¯æååãmur-murãã Bluetooth 端æ«ã«è¿ããŸãã
ç§ãå®å šã«ãšãã¥ã¬ãŒãããŠã¯ãããªã
ãšãã¥ã¬ãŒã¿ãæ§ç¯ãããšããç¹å®ã®ããã€ã¹ã®è©³çŽ°/ãšãã¥ã¬ãŒã·ã§ã³ã®ã¬ãã«ãéžæã§ããŸãã ããšãã°ãBluetooth ã¢ãžã¥ãŒã«ã¯ããŸããŸãªæ¹æ³ã§ãšãã¥ã¬ãŒãã§ããŸãã
- ããã€ã¹ã¯ã³ãã³ãã®å®å šãªã»ããã§å®å šã«ãšãã¥ã¬ãŒããããŸãã
- AT ã³ãã³ãããšãã¥ã¬ãŒããããããŒã¿ ã¹ããªãŒã ãã¡ã€ã³ ã·ã¹ãã ã® COM ããŒãããåä¿¡ãããŸãã
- ä»®æ³ããã€ã¹ã¯å®ããã€ã¹ãžã®å®å šãªããŒã¿ ãªãã€ã¬ã¯ããæäŸããŸãã
- åžžã«ãOKããè¿ãåçŽãªã¹ã¿ããšããŠã
ãšãã¥ã¬ãŒã¿ã®çŸåšã®ããŒãžã§ã³ã§ã¯ XNUMX çªç®ã®ã¢ãããŒãã䜿çšãããŸããã€ãŸããä»®æ³ Bluetooth ã¢ãžã¥ãŒã«ãæ§æãå®è¡ãããã®åŸãã¡ã€ã³ ã·ã¹ãã ã® COM ããŒããããšãã¥ã¬ãŒã¿ã® UART ããŒãã«ããŒã¿ãããããã·ãããã¢ãŒãã«åãæ¿ãããŸãã
åšèŸºéšã®äžéšãå®è£
ãããŠããªãå Žåã«åããŠãã³ãŒããç°¡åã«ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã§ããå¯èœæ§ãèããŠã¿ãŸãããã ããšãã°ãDMA ãžã®ããŒã¿è»¢éãå¶åŸ¡ããã¿ã€ããŒãäœæãããŠããªãå Žå (ãã§ãã¯ã¯é¢æ°ã§å®è¡ãããŸã) ws2812b_waitã«ãããŸã 0x08006840
)ããã®å Žåããã¡ãŒã ãŠã§ã¢ã¯åžžã«ãã©ã°ããªã»ãããããã®ãåŸ
ã¡ãŸãã å¿ããã«ãããŸã 0x200004C4
ãã㯠DMA ããŒã¿ ã©ã€ã³ã®å æçã瀺ããŠããŸãã
ãã©ã°ãæåã§ãªã»ããããããšã§ããã®ç¶æ³ãåé¿ã§ããŸãã å¿ãã åãä»ããçŽåŸã IDA Pro ã§ã¯ãPython é¢æ°ãäœæããŠãã¬ãŒã¯ãã€ã³ãã§åŒã³åºãããã©ã°ã«å€ 1 ãæžã蟌ãã åŸã«ã³ãŒãã«ãã¬ãŒã¯ãã€ã³ãèªäœã眮ãããšãã§ããŸãã å¿ãã.
ãã¬ãŒã¯ãã€ã³ããã³ãã©ãŒ
ãŸããIDA 㧠Python é¢æ°ãäœæããŸãããã ã¡ãã¥ãŒ ãã¡ã€ã« - ã¹ã¯ãªããã³ãã³ã...
å·ŠåŽã®ãªã¹ãã«æ°ããã¹ãããããè¿œå ããååãä»ããŸã (äŸ: BPT),
å³åŽã®ããã¹ããã£ãŒã«ãã«ãæ©èœã³ãŒããå
¥åããŸãã
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
ãã®åŸãæŒããŸã ã©ã³ ãããŠã¹ã¯ãªãããŠã£ã³ããŠãéããŸãã
次ã«ã次ã®ã³ãŒãã«é²ã¿ãŸãããã 0x0800688A
ããã¬ãŒã¯ãã€ã³ããèšå®ã (F2 ããŒ)ãç·šéããŸã (ã³ã³ããã¹ã ã¡ãã¥ãŒ) ãã¬ãŒã¯ãã€ã³ããç·šé...)ãã¹ã¯ãªãã ã¿ã€ãã Python ã«èšå®ããããšãå¿ããªãã§ãã ããã
çŸåšã®ãã©ã°å€ã å¿ãã 1 ã«çããå Žåã¯ãé¢æ°ãå®è¡ããå¿ èŠããããŸã ã¹ããã_dma ã¹ã¯ãªããè¡å :
ãã¡ãŒã ãŠã§ã¢ãå®è¡ããå Žåããã¬ãŒã¯ãã€ã³ã ãã³ãã©ãŒ ã³ãŒãã®ããªã¬ãŒã IDA ãŠã£ã³ããŠã«è¡šç€ºãããŸãã åºå è¡ããšã« Skipping wait ws2812...
ã ãã¡ãŒã ãŠã§ã¢ã¯ãã©ã°ããªã»ãããããã®ãåŸ
ããªããªããŸãã å¿ãã.
ãšãã¥ã¬ãŒã¿ãšã®å¯Ÿè©±
æš¡å£ã®ããã®æš¡å£ã§ã¯ãåã³ãåã³ãçããå¯èœæ§ã¯äœãã§ãã ãšãã¥ã¬ãŒã¿ããç 究è ãã¡ã¢ãªå ã®ããŒã¿ã確èªããããã¹ã¬ããã®çžäºäœçšã確ç«ãããããã®ã«åœ¹ç«ã€ã®ã§ããã°ãããã«èå³æ·±ãããšã«ãªããŸãã
RTOS ã¿ã¹ã¯éã®å¯Ÿè©±ãåçã«ç¢ºç«ããæ¹æ³ã瀺ããŸãã ã³ãŒããå®è¡äžã®å Žåã¯ããŸããã®å®è¡ãäžæåæ¢ããå¿
èŠããããŸãã è¡äºã«è¡ããªã bluetooth_task_entry ãLEDãã³ãã³ãã®åŠçãã©ã³ããžïŒã¢ãã¬ã¹ 0x080057B8
)ãæåã«äœãäœæããããã®åŸã·ã¹ãã ãã¥ãŒã«éä¿¡ããããã確èªã§ããŸãã LEDControlQueueHandle äœãã®ã¡ãã»ãŒãžã
å€æ°ã«ã¢ã¯ã»ã¹ããã«ã¯ãã¬ãŒã¯ãã€ã³ããèšå®ããå¿
èŠããããŸã LEDControlQueueHandleã«ãããŸã 0x20000624
ã³ãŒãã®å®è¡ãç¶ããŸãã
ãã®çµæãã¢ãã¬ã¹ã§æåã«ã¹ããããçºçããŸãã 0x080057CA
é¢æ°ãåŒã³åºãåã« osMailAllocã次ã«ã¢ãã¬ã¹ã§ 0x08005806
é¢æ°ãåŒã³åºãåã« osMailPutããã°ããããŠãããã¢ãã¬ã¹ã« 0x08005BD4
(é¢æ°ãåŒã³åºãåã« osã¡ãŒã«ååŸ)ãé¢æ°ã«å±ããŸã LEDs_task_entry (LED ã¿ã¹ã¯)ãã€ãŸãã¿ã¹ã¯ãåãæ¿ãããLED ã¿ã¹ã¯ãå¶åŸ¡ãåãåããŸããã
ãã®ç°¡åãªæ¹æ³ã§ãRTOS ã¿ã¹ã¯ãçžäºã«å¯Ÿè©±ããæ¹æ³ã確ç«ã§ããŸãã
ãã¡ãããå®éã«ã¯ã¿ã¹ã¯ã®çžäºäœçšã¯ããã«è€éã«ãªãå¯èœæ§ããããŸããããšãã¥ã¬ãŒã¿ãŒã䜿çšãããšããã®çžäºäœçšã®è¿œè·¡ã®æéã軜æžãããŸãã
Radare2 ã§èµ·å
Radare2 ã®ãããªäžèœããŒã«ãç¡èŠããããšã¯ã§ããŸããã
r2 ã䜿çšããŠãšãã¥ã¬ãŒã¿ã«æ¥ç¶ããã«ã¯ãã³ãã³ãã¯æ¬¡ã®ããã«ãªããŸãã
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
çŸåšèµ·åå¯èœã§ã (dc
) ããå®è¡ãäžæåæ¢ããŸã (Ctrl+C)ã
æ®å¿µãªãããçŸæç¹ã§ã¯ãr2 ã«ã¯ããŒããŠã§ã¢ gdb ãµãŒããŒãšã¡ã¢ãª ã¬ã€ã¢ãŠãã®æäœæã«åé¡ãããããã®ãããã¬ãŒã¯ãã€ã³ããšã¹ããããæ©èœããŸãã (ã³ãã³ã ds
ïŒã ãã®åé¡ãããã«ä¿®æ£ãããããšãé¡ã£ãŠããŸãã
Eclipse ã§å®è¡ãã
ãšãã¥ã¬ãŒã¿ã䜿çšãããªãã·ã§ã³ã® XNUMX ã€ã¯ãéçºäžã®ããã€ã¹ã®ãã¡ãŒã ãŠã§ã¢ããããã°ããããšã§ãã ããããããããããã«ãRhino ãã¡ãŒã ãŠã§ã¢ã䜿çšããŸãã ãã¡ãŒã ãŠã§ã¢ã®ãœãŒã¹ãããŠã³ããŒãã§ããŸã
ã»ããã® Eclipse ã IDE ãšããŠäœ¿çšããŸãã
ãšãã¥ã¬ãŒã¿ã Eclipse ã§ã³ã³ãã€ã«ããããã¡ãŒã ãŠã§ã¢ãçŽæ¥ããŒãããã«ã¯ããã©ã¡ãŒã¿ãè¿œå ããå¿
èŠããããŸãã firmware=null
ãšãã¥ã¬ãŒã¿èµ·åã³ãã³ãã«æ¬¡ã®ããã«å
¥åããŸãã
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
ãããã°æ§æã®ã»ããã¢ãã
Eclipse ã§ã¡ãã¥ãŒãéžæããŸã å®è¡ - ãããã°æ§æ... éãããŠã£ã³ããŠã®ã»ã¯ã·ã§ã³ã§ GDB ããŒããŠã§ã¢ã®ãããã° æ°ããæ§æãè¿œå ãããã¡ã€ã³ãã¿ãã§ãããã°çšã®çŸåšã®ãããžã§ã¯ããšã¢ããªã±ãŒã·ã§ã³ãæå®ããå¿ èŠããããŸãã
ããããã¬ãŒãã¿ãã§ãGDB ã³ãã³ããæå®ããå¿
èŠããããŸãã
${openstm32_compiler_path}arm-none-eabi-gdb
ãŸããGDB ãµãŒããŒã«æ¥ç¶ããããã®ãã©ã¡ãŒã¿ãŒ (ãã¹ããšããŒã) ãå ¥åããŸãã
ãã¹ã¿ãŒãã¢ãããã¿ãã§ã次ã®ãã©ã¡ãŒã¿ãæå®ããå¿ èŠããããŸãã
- ãã§ãã¯ããã¯ã¹ãæå¹ã«ãã ç»åãèªã¿èŸŒã (ã¢ã»ã³ãã«ããããã¡ãŒã ãŠã§ã¢ ã€ã¡ãŒãžããšãã¥ã¬ãŒã¿ã«ããŒããããããã«);
- ãã§ãã¯ããã¯ã¹ãæå¹ã«ãã ã·ã³ãã«ãããŒããã;
- èµ·åã³ãã³ããè¿œå ããŸãã
set $pc = *0x08000004
(PC ã¬ãžã¹ã¿ãã¢ãã¬ã¹ã®ã¡ã¢ãªã®å€ã«èšå®ããŸã)0x08000004
- ã¢ãã¬ã¹ã¯ããã«ä¿åãããŸã ãªã»ãããã³ãã©).
泚æãEclipse ãããã¡ãŒã ãŠã§ã¢ ãã¡ã€ã«ãããŠã³ããŒãããããªãå Žåã¯ããªãã·ã§ã³ ç»åãèªã¿èŸŒã О ã³ãã³ããå®è¡ãã 瀺ãå¿ èŠã¯ãããŸããã
[ãããã°] ãã¯ãªãã¯ãããšããããã¬ãŒ ã¢ãŒãã§äœæ¥ã§ããããã«ãªããŸãã
- ã¹ããããã€ã¹ãããã®ã³ãŒãå®è¡
- ãã¬ãŒã¯ãã€ã³ããšã®å¯Ÿè©±
泚æ. Eclipse ã«ã¯ãããŒã...ããã€ãã®çããããŸã...ãããŠãããããšå ±åããªããã°ãªããŸããã ããšãã°ããããã¬ã®èµ·åæã«ã"0x0" ã«äœ¿çšã§ãããœãŒã¹ããããŸããããšããã¡ãã»ãŒãžã衚瀺ãããå Žåã¯ãã¹ããã ã³ãã³ã (F5) ãå®è¡ããŸãã
代ããã«ãçµè«ã®
ãã€ãã£ã ã³ãŒãã®ãšãã¥ã¬ãŒã·ã§ã³ã¯éåžžã«èå³æ·±ããã®ã§ãã ããã€ã¹éçºè ã¯ãå®éã®ããã€ã¹ã䜿çšããã«ãã¡ãŒã ãŠã§ã¢ããããã°ã§ããããã«ãªããŸãã ç 究è ã«ãšã£ãŠãããã¯ãããã€ã¹ããã£ãŠãåžžã«å¯èœã§ãããšã¯éããªãåçã³ãŒãåæãå®è¡ããæ©äŒã§ãã
ç§ãã¡ã¯ã䟿å©ã§é©åºŠã«ã·ã³ãã«ã§ãã»ããã¢ãããšå®è¡ã«å€ãã®åŽåãšæéãããããªãããŒã«ãå°é家ã«æäŸããããšèããŠããŸãã
ããŒããŠã§ã¢ ãšãã¥ã¬ãŒã¿ã䜿çšããçµéšã«ã€ããŠã³ã¡ã³ãã«æžã蟌ãã§ãã ããã ãã²ãè°è«ãã ãããã質åã«ã¯åãã§ãçãããããŸãã
ç»é²ãŠãŒã¶ãŒã®ã¿ãã¢ã³ã±ãŒãã«åå ã§ããŸãã
ãšãã¥ã¬ãŒã¿ãäœã«äœ¿çšããŸãã?
-
ãã¡ãŒã ãŠã§ã¢ãéçºïŒãããã°ïŒããŸã
-
ãã¡ãŒã ãŠã§ã¢ãç 究äžã§ã
-
ã²ãŒã ãèµ·åããŸã (DendiãSegaãPSP)
-
ä»ã«äœãïŒã³ã¡ã³ãã«æžããŠãã ããïŒ
7 人ã®ãŠãŒã¶ãŒãæ祚ããŸããã 2åã®ãŠãŒã¶ãŒãæ£æš©ããã
ãã€ãã£ã ã³ãŒãããšãã¥ã¬ãŒãããããã«ã©ã®ãœãããŠã§ã¢ã䜿çšããŸãã?
-
QEMU
-
ãŠãã³ãŒã³ãšã³ãžã³
-
ããããŠã¹
-
ä»ã«äœãïŒã³ã¡ã³ãã«æžããŠãã ããïŒ
6 人ã®ãŠãŒã¶ãŒãæ祚ããŸããã 2åã®ãŠãŒã¶ãŒãæ£æš©ããã
䜿çšããŠãããšãã¥ã¬ãŒã¿ã§æ¹åãããç¹ã¯äœã§ãã?
-
ã¹ããŒãã欲ãã
-
ã»ããã¢ãã/èµ·åãç°¡åã«ããã
-
ãšãã¥ã¬ãŒã¿ãšå¯Ÿè©±ããããã®ãªãã·ã§ã³ (APIãããã¯) ããã£ãšæ¬²ãã
-
ãã¹ãŠã«æºè¶³ããŠããŸã
-
ä»ã«äœãïŒã³ã¡ã³ãã«æžããŠãã ããïŒ
8 人ã®ãŠãŒã¶ãŒãæ祚ããŸããã 1 ãŠãŒã¶ãŒãæ£æš©ããŸããã
åºæïŒ habr.com