ืืืกืืจืช ืืคืืืฉื 0x0A DC7831
ืืืืืจ ืื ื ืชืืจ ืืืฆื ืืืคืขืื ืืช ืงืืฉืืช ืืืืฉืืจ ืืืืืืืืจ, ืืืืืื ืืื ืืจืืงืฆืื ืขื ื-debugger, ืืืืฆืข ื ืืชืื ืืื ืื ืงืื ืฉื ืืงืืฉืื.
ืคืจืืืกืืืจืื
ืืคื ื ืืจืื ืืื ืืืืงืกืื ืจืืืงื ืจืืืงื
ืืคื ื ืืื ืฉื ืื ืืืขืืื ืฉืื ื ืืื ืฆืืจื ืืืงืืจ ืืช ืืงืืฉืื ืฉื ืืืฉืืจ. ืืงืืฉืื ื ืืืกื ืืคืืจืงื ืขื ืืืขื ืืชืืื. ืืื ืขืฉื ืืืช ืืฆืืจื ืืืื ืืกืืืืช, ืืืขืืืจ ืืช ืื ืชืื ืื ืืืืืจืื ืืกืคืจ ืคืขืืื. ืืืงืืฉืื ืขืฆืื ืขืฉืชื ืื ืืื ืืจืืงืฆืื ืืงืืืืืช ืขื ืืฆืืื ืืืืงืคื. ืืื ืื ืืืืืช MIPS.
ืืกืืืืช ืืืืืืงืืืืืืช, ืืืืืืืืจืื ืืืืื ืื ืื ืืชืืืื ืื ื, ืืื ืืื ืืืช ืจืฆืื ื ืืืคืขืื ืืช ืืงืื. ืืื ืืืืื ื ืืืฆืืจ ืืืืืืืจ ืืฉืื ื, ืฉืืขืฉื ืืช ืืืื ืืืื ืืืืคืฉืจ ืื ื ืืคืจืง ืืช ืืงืืฉืื ืืจืืฉืืช. ื ืืกืื ื ืืช ืื ืืื ืขืื. ืืฉืื ื, ืื ืื ื ืืกืืฃ ืฆืืื ืืืงืคื ืืื ืืืฆืข ืื ืืช ืืงืืฉืื ืืจืืฉืืช. ืื ืื ืืื ืืืืืื - ืืื ืื ืืกืชืืจ. ืืฉืื ื ืฉืื ืืืืืื ื ืืขืฉืืช ืืืืืืืจ ืื ืืื ืืื.
ืืชืืฆืื ืืืืชื ืืืืืืืจ ืืขืจืืืช ืืืฉื
ืืื ืงืืคืืงืื?
ืืฉ ืืฉืืง ืืืืื.
- ืืงืืื (ืื ืืืืช, ืฉื ืขืฆื [หkษpษชkรฆt]) - ืืงืืื, ืืงืืื
- ืืชืื (ืื ืืืืช, ืฉื ืขืฆื [หkรฆt]) - ืืชืื, ืืชืื - ืืืื ืืืืืื ืขื ืืื ืืืืฆืจื ืืคืจืืืงื
- ืืืืช "K" ืืื ืืฉืคืช ืืชืื ืืช Kotlin
ืขืืชืง
ืืขืช ืืฆืืจืช ืืืืืืืืจ, ืืืืืจื ืืขืืื ืืืื ืกืคืฆืืคืืื:
- ืืืืืืช ืืืฆืืจ ืืืืืจืืช ืฆืืื ืืืงืคื, ืืืืืืื, ืืืืืช ืืขืืืื ืืืฉืื;
- ืืืืืืช ืืืจืืื ืืืฉืืจ ืืืจืืืืื ืืืืืืืื ืฉืื ืื;
- ืืืืืืช ืืืขืื ืื ื ืชืื ืื ืืื ืืจืืื (ืงืืฉืื) ืืืืืจืื ืฉื ืืืฉืืจ ืืืจืืืืื;
- ืืืืืช ืืขืืื ืขื ืชืฆืืืื ืืฆื (ืชืฆืืืืื ืฉื ืืฆื ืืืขืจืืช);
- ืืืืืืช ืืืฆืืจ ืืื ืืจืืงืฆืื ืขื ืืืืืืืืจ ืืืืฆืขืืช ืืืชืจ ืืืืืื ืืืืื ื;
- ืฉืคื ืืืืจื ืืช ื ืืืื ืืืชืคืชืืืช.
ืืชืืฆืื ืืื, Kotlin ื ืืืจ ืืืืฉืื, ืืจืืืืงืืืจืช ืืืืืืืืก (ืื ืืืฉืจ ืืืืืืื ืืชืงืฉืจืื ืื ืขื ืื ืืืืฆืขืืช ืืคืืงื ื ืชืื ืื ืืืจืืืืืืื), JSON ืืคืืจืื ืชืืืืจ ืืืืฉืืจ, ื-GDB RSP ืืคืจืืืืงืื ืืืื ืืจืืงืฆืื ืขื ื-debugger.
ืืคืืชืื ื ืืฉื ืงืฆืช ืืืชืจ ืืฉื ืชืืื ืื ืืฉื ืืืืคื ืคืขืื. ืืืืื ืชืงืืคื ืื ืืืฉืื ืืืืืช ืืขืื MIPS, x86, V850ES, ARM ื-PowerPC.
ืืคืจืืืงื ืฆืืื ืืืืืข ืืืื ืืืฆืื ืืืชื ืืฆืืืืจ ืืจืื. ืื ื ื ืขืฉื ืชืืืืจ ืืคืืจื ืฉื ืืคืจืืืงื ืืืืืจ ืืืชืจ, ืื ืืขืช ืขืชื ื ืชืืงื ืืฉืืืืฉ ืืงืืคืืงืื.
ืขืืืจ ืืกืจื ืืกืืื ืืช ืืืืชืจ, ื ืืชื ืืืืจืื ืืจืกืช ืคืจืืื ืฉื ืืืืืืืืจ
ืงืจื ืฃ ืืืืืืืืจ
ืืื ื ืืืืจ ืื ืืืงืื ืืืชืจ ืขืืืจ ืื ืก SMARTRHINO-2018, ื ืืฆืจ ืืืฉืืจ ืืืืงื "ืงืจื ืฃ" ืืืืจืืช ืืืืื ืืืืช ืื ืืกื ืืคืืื. ืืชืืืื ืฉื ื ืืชืื ืงืืฉืื ืกืืื ืชืืืจ ื
ืืขืช ื ื ืกื ืืืืกืืฃ "ืจืืงืืืื" ืืืืคืขืื ืืช ืืงืืฉืื ืืืืืืืืจ.
ืื ืื ื ืฆืจืืืื:
1) Java 1.8
2) ืคืืืชืื ืืืืืื
ืขืืืจ Windows:
1)
2)
ืขืืืจ ืืื ืืงืก:
1) socat
ืืชื ืืืื ืืืฉืชืืฉ ื-Eclipse, IDA Pro ืื radare2 ืืืงืื GDB.
ืืื ืื ืขืืื?
ืขื ืื ืช ืืืฆืข ืงืืฉืื ืืืืืืืืจ, ืืฉ ืฆืืจื "ืืืจืืื" ืืืฉืืจ ืืืจืืืืื, ืฉืืื ืื ืืืื ืืืืฉืืจ ืืืืชื.
ื ืืชื ืืืฆืื ืืช ืืืืฉืืจ ืืืืืชื ("ืงืจื ืฃ") ืืชืจืฉืื ืืืืืง:
ืืืืืืืืจ ืืื ื ืืืืืืจื ืื ืืชื ืืชืืจ ืืช ืืืืฉืืจ ืืืืจืืืืื ืืกืืคื ืืงืืืฅ 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 ืืื ืฉื ืฉื ืงืืืฅ ืฉื ืืชื ืืืขืื ืืืืฉืืจ ืืืจืืืืื ืืชืืจ ืงืืฉืื.
ื ืืชื ืืืืฆื ืืช ืืืืฉืืจ ืืืืจืืืืื ืืืืื ืืจืืงืฆืื ืฉืื ืขื ืืขืจืืช ืืืคืขืื ืืจืืฉืืช ืืืืฆืขืืช ืืืืืืจืื ืืืื:
ืืืคืข ืืืืืงื ืื ืืืื ืฉื ืืืืืืืืจ ืืืื ืืื ืืจืืงืฆืื ืขื ืืฆืืืืช ื-COM ืฉื ืืขืจืืช ืืืคืขืื ืืจืืฉืืช (ื ืืคืื ืืืืื ื-UART ื-UART ืขืืืจ ืืืืื ื-Bluetooth). ืืื ืืืืืืช ืืืืืช ืืฆืืืืช ืืืืชืืืช ืฉืืืืื ืืืืืจืื ืืชืงื ืื ืื ืืฆืืืืช COM ืืืจืืืืืืืช (ืืฉืืื ืื ืืชื ืจืง ืฆืจืื com0com/socat).
ืืื ืืืฆืืจ ืืื ืืจืืงืฆืื ืขื ืืืืืืืืจ ืืืืืฅ, ืืฉ ืืจืืข ืฉืชื ืืจืืื ืขืืงืจืืืช:
- ืคืจืืืืงืื GDB RSP (ืืืชืื, ืืืืื ืืชืืืืื ืืคืจืืืืงืื ืื ืื Eclipse / IDA / radare2);
- ืฉืืจืช ืืคืงืืื ืืคื ืืืืช ืฉื ืืืืืืืจ (Argparse ืื Python).
ืืฆืืืืช COM ืืืจืืืืืืืช
ืขื ืื ืช ืืืฆืืจ ืืื ืืจืืงืฆืื ืขื UART ืฉื ืืืฉืืจ ืืืจืืืืื ืืืืฉื ืืืงืืื ืืืืฆืขืืช ืืกืืฃ, ืขืืื ืืืฆืืจ ืืื ืืฆืืืืช COM ืืืจืืืืืืืช ืืฉืืืืืช. ืืืงืจื ืฉืื ื, ืืฆืืื ืืืช ืืฉืืฉืช ืืช ืืืืืืืืจ, ืืืฉื ืืื ืขื ืืื ืชืืื ืืช ืืกืืฃ (PuTTY ืื ืืกื):
ืฉืืืืฉ ื-com0com
ืืฆืืืืช COM ืืืจืืืืืืืช ืืืืืจืืช ืืืืฆืขืืช ืชืืื ืืช ืืฉืืจืืช ืืืืืจื ืืืขืจืืช com0com (ืืจืกืช ืืืกืืฃ - C:Program Files (x86)com0comsetupั.exe, ืื ืืจืกืช GUI - C:Program Files (x86)com0comsetupg.exe):
ืกืื ืืช ืืชืืืืช ืืคืฉืจ ืืฆืคืช ืืืืจ ืขืืืจ ืื ืืืฆืืืืช ืืืืจืืืืืืืช ืฉื ืืฆืจื, ืืืจืช ืืืืืืืืจ ืืืชืื ืืชืืืื ืืืฆืืืช ื-COM.
ืืืืฆืขืืช socat
ืืืขืจืืืช UNIX, ืืฆืืืืช COM ืืืจืืืืืืืช ื ืืฆืจืืช ืืืืืืืืช ืขื ืืื ืืืืืืืืจ ืืืืฆืขืืช ืืื ืืฉืืจืืช socat; ืืฉื ืื, ืคืฉืื ืฆืืื ืืช ืืงืืืืืช ืืฉื ืืืฆืืื ืืขืช ืืคืขืืช ืืืืืืืืจ socat:
.
ืืืฉืง ืฉืืจืช ืคืงืืื ืคื ืืื (Argparse ืื Python)
ืืืืืื ืฉืงืืคืืงื ืืื ืืืฉืื ืืกืืฃ, ืืืืืืืืจ ืืกืคืง ืฉืชื ืืคืฉืจืืืืช ืืืฉืง ืฉืืจืช ืคืงืืื ืืืื ืืจืืงืฆืื ืขื ืืืืืืืงืืื ืืืืฉืชื ืื ืฉืื: Argparse ื-Python.
Argparse ืืื CLI ืืืื ื ืืงืืคืืงืื ืืืืื ืชืืื ืืืืื.
CLI ืืืืคื ืืื ืืชืืจืืื Python. ืืื ืืืฉืชืืฉ ืื, ืขืืื ืืืชืงืื ืืช ืืืืื Jep Python ืืืืืืืจ ืืช ืืืืืืืืจ ืืขืืื ืขื Python (ืืืขืฉื ืฉืืืืฉ ืืืชืืจืืื ืฉื Python ืืืืชืงื ืืืขืจืืช ืืจืืฉืืช ืฉื ืืืฉืชืืฉ).
ืืชืงื ืช ืืืืื Python Jep
ืชืืช Linux Jep ื ืืชื ืืืชืงืื ืืืืฆืขืืช pip:
pip install jep
ืืื ืืืชืงืื ืืช Jep ื-Windows, ืชืืืื ืขืืื ืืืชืงืื ืืช 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.
ืืงืืืฅ ืืืฆืืื ืฉื ืืืืืืืืจ ืขืืืจ ืืืขืจืืช ืฉืื (copycat.bat - ืขืืืจ Windows, ืขืืชืง - ืขืืืจ ืืื ืืงืก) ืืจืฉืืืช ืืคืจืืืจืื 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:
./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 ืฉืชืืื ืคืชืืื ืืืืฉื ืืฉืจืช GDB;-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
ืืื ืืคืฉื ืืช ืืืืืงืืช, ืื ื ืืฉืชืืฉืื ืืงืืฉืื ืฉื Rhino ืืงืืืฅ ืืืงืืจ ืื ืืชืื ื-IDA ืืืืคืก
ืืชื ืืืื ืื ืืืฉืชืืฉ ืืงืืฉืื ืืจืืฉืืช ืืื ืืื ืืืืข.
ืืืืจ ืืฉืงืช Kopycat ื-IDA Pro, ืืชืคืจืื Debugger ืขืืืจ ืื ืืคืจืื "ืืืืฃ ืืืชืจ ืืืืื..." ืืืืจ "ืืืชืจ ืืืืื ืืจืืืง ืฉื GDB". ืืืืจ ืืื, ืืืืจ ืืช ืชืคืจืื ืืืืืืจ: ืืืชืจ ืืืืื - ืืคืฉืจืืืืช ืชืืืื...
ืืืืจ ืืช ืืขืจืืื:
- ืืืฉืื - ืื ืขืจื
- ืฉื ืืืจื: 127.0.0.1 (ืื ืืชืืืช ื-IP ืฉื ืืืืฉื ืืืจืืืง ืฉืื ืคืืขื Kopycat)
- ืื ืื: 23946
ืืขืช ืืคืชืืจ ืืืชืืจ ืืืืืื ืืืคื ืืืืื (ืืงืฉ F9):
ืืืฅ ืขืืื ืืื ืืืชืืืจ ืืืืืื ื ืืคืื ืืืืืื ืืืืืืืืจ. IDA ื ืื ืก ืืืฆื ืืืชืืจ ืืืืื, ืืืื ืืช ื ืืกืคืื ืืืคืืื ืืืืื ืื: ืืืืข ืขื ืืืืจืื, ืขื ืืืืกื ืืช.
ืืขืช ื ืืื ืืืฉืชืืฉ ืืื ืืชืืื ืืช ืืกืื ืืจืืืืช ืฉื ืืืชืจ ืืืืืื:
- ืืืฆืืข ืฆืขื ืืืจ ืฆืขื ืฉื ืืืจืืืช (ืืืื ืก ืืชืื ะธ ืืืจืื ืืขื - ืืคืชืืืช F7 ื- F8, ืืืชืืื);
- ืืชืืื ืืืฉืืืืช ืืืฆืืข;
- ืืฆืืจืช ื ืงืืืืช ืฉืืืจื ืื ืขืืืจ ืงืื ืืื ืขืืืจ ื ืชืื ืื (ืืงืฉ F2).
ืืืืืจ ื-debugger ืื ืืืืจ ืืืคืขืื ืืช ืงืื ืืงืืฉืื. ืขืืืช ืืืืฆืืข ืื ืืืืืช ืืืืืช ืืืืืช ืืืชืืืช 0x08006A74
- ืชืืืืช ืืคืื ืงืฆืื Reset_Handler. ืื ืชืืืื ืืืื ืืจืืฉืื, ืชืืื ืืจืืืช ืืช ืฉืืืช ืืคืื ืงืฆืื ืจืืฉื. ืืชื ืืืื ืืืงื ืืช ืืกืื ืขื ืฉืืจื ืื (ืืชืืืช 0x08006ABE
) ืืืืฆืข ืืช ืืคืขืืื ืืคืขื ืขื ืืกืื (ืืงืฉ F4).
ืืืืจ ืืื, ืชืืื ืืืืืฅ ืขื F7 ืืื ืืืืื ืก ืืคืื ืงืฆืื ืจืืฉื.
ืื ืชืคืขืื ืืช ืืคืงืืื ืืืฉื ืืชืืืื (ืืงืฉ F9), ืืื ืืืคืืข ืืืื "ื ื ืืืชื" ืขื ืืคืชืืจ ืืืื ืืืฉืขืืช:
ืืฉืืชื ืืืืฅ ืืืฉืขืืช ืืืฆืืข ืงืื ืืงืืฉืื ืืืฉืขื ืื ืืชื ืืืืฉืื ืืืชื ืืืืชื ืืชืืืช ืืงืื ืฉืื ืืื ืืืคืกืง.
ืื ืชืืฉืื ืืืืฆืืข ืืงืื, ืชืจืื ืืช ืืฉืืจืืช ืืืืืช ืืืกืืคืื ืืืืืืจืื ืืืฆืืืืช ื-COM ืืืืจืืืืืืืช:
ืื ืืืืืช ืฉื ืงื "ืขืงืืคืช ืืืืื ื" ืืฆืืืขื ืขื ืื ืฉืืืืื ื-Bluetooth ืืืืจืืืืื ืขืืจ ืืืฆื ืฉื ืงืืืช ื ืชืื ืื ืืืฆืืืช ื-COM ืฉื ืืืฉืชืืฉ.
ืืขืช ืืืกืืฃ ืืืืืืช' (COM29 ืืชืืื ื) ื ืืชื ืืืืื ืคืงืืืืช ืืืชืื ืืคืจืืืืงืื Rhino. ืืืืืื, ืืคืงืืื "MEOW" ืชืืืืจ ืืช ืืืืจืืืช "mur-mur" ืืืกืืฃ ื-Bluetooth:
ืชืืงื ืืืชื ืื ืืืืจื
ืืขืช ืื ืืืช ืืืืืืืจ, ื ืืชื ืืืืืจ ืืช ืจืืช ืืคืืจืื/ืืืืืื ืฉื ืืืฉืืจ ืืกืืื. ืืืืืื, ื ืืชื ืืืงืืช ืืช ืืืืื ื-Bluetooth ืืืจืืื ืฉืื ืืช:
- ืืืืฉืืจ ืืืืืง ืืืืืื ืขื ืงืืืฆื ืืืื ืฉื ืคืงืืืืช;
- ืคืงืืืืช AT ืืืืงืืช, ืืืจื ืื ืชืื ืื ืืชืงืื ืืืฆืืืช ื-COM ืฉื ืืืขืจืืช ืืจืืฉืืช;
- ืืืืฉืืจ ืืืืจืืืืื ืืกืคืง ืืคื ืืืช ื ืชืื ืื ืืืื ืืืืฉืืจ ืืืืืชื;
- ืืชืืจ ืืื ืคืฉืื ืฉืชืืื ืืืืืจ "ืืกืืจ".
ืืืจืกื ืื ืืืืืช ืฉื ืืืืืืืืจ ืืฉืชืืฉืช ืืืืฉื ืืฉื ืืื - ืืืืื ื-Bluetooth ืืืืจืืืืื ืืืฆืข ืชืฆืืจื, ืืืืืจ ืืื ืืื ืขืืืจ ืืืฆื ืฉื "ืคืจืืงืกื" ื ืชืื ืื ืืืฆืืืช ื-COM ืฉื ืืืขืจืืช ืืจืืฉืืช ืืืฆืืืช UART ืฉื ืืืืืืืืจ.
ืืืื ื ืฉืงืื ืืช ืืืคืฉืจืืช ืฉื ืืืฉืืจ ืคืฉืื ืฉื ืืงืื ืืืงืจื ืฉืืืง ืืืคืจืืคืจืื ืื ืืืืฉื. ืืืืืื, ืื ืื ื ืืฆืจ ืืืืืจ ืฉืืืจืื ืขื ืืงืจืช ืืขืืจืช ืื ืชืื ืื ื-DMA (ืืืืืงื ืืชืืฆืขืช ืืคืื ืงืฆืื ws2812b_waitืืืืงื ื 0x08006840
), ืื ืืงืืฉืื ืชืืื ืชืืื ืืืืคืืก ืืืื ืขืกืืงืืืืงื ื 0x200004C4
ืฉืืจืื ืืช ืืชืคืืกื ืฉื ืงื ืื ืชืื ืื ืฉื DMA:
ื ืืื ืืขืงืืฃ ืืช ืืืฆื ืืื ืขื ืืื ืืืคืืก ืืื ื ืฉื ืืืื ืขืกืืง ืืื ืืืืจ ืืชืงื ืชื. ื-IDA Pro ืืคืฉืจ ืืืฆืืจ ืคืื ืงืฆืืืช Python ืืืงืจืื ืื ื-breakpoint, ืืืฉืื ืืช ื-breakpoint ืขืฆืื ืืงืื ืืืืจ ืืชืืืช ืืขืจื 1 ืืืื ืขืกืืง.
ืืืคื ืื ืงืืืช ืฉืืืจื
ืจืืฉืืช, ืืืื ื ืืฆืืจ ืคืื ืงืฆืืืช Python ื-IDA. ืชึทืคืจึดืื ืงืืืฅ - ืคืงืืืช ืกืงืจืืคื...
ืืืกืฃ ืงืืข ืงืื ืืืฉ ืืจืฉืืื ืืฉืืื, ืชื ืื ืฉื (ืืืืืื, BPT),
ืืฉืื ืืืงืกื ืืฆื ืืืื, ืืื ืืช ืงืื ืืคืื ืงืฆืื:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
ืืืจื ืื ืื ืื ื ืืืืฆืื ืืคืขืื ืืกืืืจ ืืช ืืืื ืืกืงืจืืคื.
ืืขืช ื ืขืืืจ ืืงืื ื- 0x0800688A
, ืืืืจ ื ืงืืืช ืขืฆืืจื (ืืงืฉ F2), ืขืจืื ืืืชื (ืชืคืจืื ืืืงืฉืจ ืขืจืื ื ืงืืืช ืขืฆืืจื...), ืื ืชืฉืื ืืืืืืจ ืืช ืกืื ืืกืงืจืืคื ืืคืืืชืื:
ืื ืขืจื ืืืื ืื ืืืื ืขืกืืง ืฉืืื ื-1, ืื ืขืืื ืืืฆืข ืืช ืืคืื ืงืฆืื skip_dma ืืฉืืจืช ืืชืกืจืื:
ืื ืืชื ืืคืขืื ืืช ืืงืืฉืื ืืืืฆืืข, ื ืืชื ืืจืืืช ืืช ืืืคืขืื ืฉื ืงืื ืืืืคื ืื ืงืืืช ืืคืกืืงื ืืืืื IDA ืชึฐืคืึผืงึธื ืืคื ืงื Skipping wait ws2812...
. ืืขืช ืืงืืฉืื ืื ืชืืื ืืืืคืืก ืืืื ืขืกืืง.
ืืื ืืจืืงืฆืื ืขื ืืืืืืืืจ
ืื ืกืืืจ ืฉืืืืืืฆืื ืืฉื ืืืงืื ืชืืจืื ืืขืื ื ืืฉืืื. ืื ืืจืื ืืืชืจ ืืขื ืืื ืื ืืืืืืืืจ ืขืืืจ ืืืืงืจ ืืจืืืช ืืช ืื ืชืื ืื ืืืืืจืื ืื ืืืกืก ืืช ืืืื ืืจืืงืฆืื ืฉื ืฉืจืฉืืจืื.
ืื ื ื ืจืื ืื ืืืฆื ืืืฆืืจ ืืื ืืจืืงืฆืื ืืื ืืืช ืืื ืืฉืืืืช RTOS. ืชืืืื ืขืืื ืืืฉืืืช ืืช ืืืฆืืข ืืงืื ืื ืืื ืคืืขื. ืื ืืชื ืืืื ืืคืื ืงืฆืื bluetooth_task_entry ืืขื ืฃ ืืขืืืื ืฉื ืคืงืืืช "LED" (ืืชืืืช 0x080057B8
), ืืื ืชืืื ืืจืืืช ืื ื ืืฆืจ ืืจืืฉืื ื ืืืืืจ ืืื ื ืฉืื ืืชืืจ ืืืขืจืืช ledControlQueueHandle ืืืืขื ืืืฉืื.
ืขืืื ืืืืืืจ ื ืงืืืช ืขืฆืืจื ืืื ืืืฉืช ืืืฉืชื ื ledControlQueueHandleืืืืงื ื 0x20000624
ืืืืฉื ืืืืฆืืข ืืงืื:
ืืชืืฆืื ืืื, ืืขืฆืืจื ืชืชืจืืฉ ืชืืืื ืืืชืืืช 0x080057CA
ืืคื ื ืืงืจืืื ืืคืื ืงืฆืื osMailAlloc, ืืื ืืืชืืืช 0x08005806
ืืคื ื ืืงืจืืื ืืคืื ืงืฆืื osMailPut, ืืื ืืืืจ ืืื ืื - ืืืชืืืช 0x08005BD4
(ืืคื ื ืงืจืืืช ืืคืื ืงืฆืื osMailGet), ืืฉืืื ืืคืื ืงืฆืื 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
ืืืช ืืืคืฉืจืืืืช ืืฉืืืืฉ ืืืืืืืืจ ืืื ืืืชืืจ ืืืืื ืืงืืฉืื ืฉื ืืืืฉืืจ ืืืคืืชื. ืืืขื ืืืืืจืืช, ื ืฉืชืืฉ ืื ืืงืืฉืื ืฉื 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 ืืชื ืฆืจืื ืืืืกืืฃ ืชืฆืืจื ืืืฉื, ืืืืืจ ืืื ืืืจืืืกืืื "ืจืืฉื" ืฆืืื ืืช ืืคืจืืืงื ืื ืืืื ืืืช ืืืืฉืื ืืืืชืืจ ืืืืื:
ืืืจืืืกืืื "Debugger" ืขืืื ืืฆืืื ืืช ืคืงืืืช GDB:
${openstm32_compiler_path}arm-none-eabi-gdb
ืืื ืืื ืืช ืืคืจืืืจืื ืืืืืืจ ืืฉืจืช GDB (ืืืจื ืืืฆืืื):
ืืืจืืืกืืื "ืืชืืื", ืขืืื ืืฆืืื ืืช ืืคืจืืืจืื ืืืืื:
- ืชืืืช ืกืืืื ืืคืฉืจ ืืขื ืชืืื ื (ืื ืฉืชืืื ืช ืืงืืฉืื ืืืืจืืืช ืชืืืขื ืืืืืืืืจ);
- ืชืืืช ืกืืืื ืืคืฉืจ ืืขื ืกืืืื;
- ืืืกืฃ ืคืงืืืช ืืคืขืื:
set $pc = *0x08000004
(ืืืืจ ืืช ืืืืจ ืืืืฉื ืืขืจื ืืืืืืจืื ืืืชืืืช0x08000004
- ืืืชืืืช ืืืืืกื ืช ืฉื ResetHandler).
ืฉืื ืื, ืื ืืื ื ืจืืฆื ืืืืจืื ืืช ืงืืืฅ ืืงืืฉืื ืืืงืืืคืก, ืื ืืืคืฉืจืืืืช ืืขื ืชืืื ื ะธ ืืคืขื ืคืงืืืืช ืืื ืฆืืจื ืืฆืืื.
ืืืืจ ืืืืฆื ืขื ืืืชืืจ ืืืืื, ืชืืื ืืขืืื ืืืฆื ื ืืคืื ืืืืื:
- ืืืฆืืข ืงืื ืฆืขื ืืืจ ืฆืขื
- ืืื ืืจืืงืฆืื ืขื ื ืงืืืืช ืฉืืืจื
ืฉืื ืื. ืืืืงืื ืืฉ, ืืื... ืืื ืืืืจืืืืช... ืืืชื ืฆืจืื ืืืืืช ืืืชื. ืืืืืื, ืื ืืขืช ืืคืขืืช ืืืชืจ ืืืืืื ืืืคืืขื ืืืืืขื "ืืื ืืงืืจ ืืืื ืขืืืจ "0x0", ืื ืืฆืข ืืช ืืคืงืืื Step (F5)
ืืืงืื ืืกืงื ื
ืืืืืฆืื ืฉื ืงืื ืืงืืจื ืืื ืืืจ ืืืื ืืขื ืืื. ืื ืืืคื ืืืืืช ืืคืฉืจื ืขืืืจ ืืคืชื ืืืฉืืจืื ืื ืคืืช ืืืืื ืืงืืฉืื ืืื ืืืฉืืจ ืืืืชื. ืขืืืจ ืืืงืจ, ืื ืืืืื ืืช ืืืฆืข ื ืืชืื ืงืื ืืื ืื, ืื ืฉืื ืชืืื ืืคืฉืจื ืืคืืื ืขื ืืืฉืืจ.
ืื ื ืจืืฆืื ืืกืคืง ืืืืืืื ืืื ื ืื, ืคืฉืื ืืืืื ืืื ืืืงื ืืจืื ืืืืฅ ืืืื ืืืชืงืื ืืืืคืขืื.
ืืชืื ืืืขืจืืช ืขื ืืืืืื ืฉืื ืืฉืืืืฉ ืืืืืืืืจืื ืฉื ืืืืจื. ืื ื ืืืืื ืื ืืชืื ืืืื ืื ืฉืื ืืขื ืืช ืขื ืฉืืืืช.
ืจืง ืืฉืชืืฉืื ืจืฉืืืื ืืืืืื ืืืฉืชืชืฃ ืืกืงืจ.
ืืฉืืื ืื ืืชื ืืฉืชืืฉ ืืืืืืืืจ?
-
ืื ื ืืคืชื (ืืืืื) ืงืืฉืื
-
ืื ื ืืืงืจ ืงืืฉืื
-
ืื ื ืืฉืืง ืืฉืืงืื (Dendi, Sega, PSP)
-
ืืฉืื ืืืจ (ืืชืื ืืชืืืืืช)
7 ืืฉืชืืฉืื ืืฆืืืขื. 2 ืืฉืชืืฉืื ื ืื ืขื.
ืืืืื ืชืืื ื ืืชื ืืฉืชืืฉ ืืื ืืืงืืช ืงืื ืืงืืจื?
-
QEMU
-
ืื ืืข ืื ืงืจื
-
ืคืจืืืืืก
-
ืืฉืื ืืืจ (ืืชืื ืืชืืืืืช)
6 ืืฉืชืืฉืื ืืฆืืืขื. 2 ืืฉืชืืฉืื ื ืื ืขื.
ืื ืชืจืฆื ืืฉืคืจ ืืืืืืืืจ ืฉืื ืืชื ืืฉืชืืฉ?
-
ืื ื ืจืืฆื ืืืืจืืช
-
ืื ื ืจืืฆื ืงืืืช ืืชืงื ื/ืืฉืงื
-
ืื ื ืจืืฆื ืืคืฉืจืืืืช ื ืืกืคืืช ืืืื ืืจืืงืฆืื ืขื ืืืืืืืืจ (API, hooks)
-
ืื ื ืืจืืฆื ืืืื
-
ืืฉืื ืืืจ (ืืชืื ืืชืืืืืช)
8 ืืฉืชืืฉืื ืืฆืืืขื. ืืฉืชืืฉ ืืื ื ืื ืข.
ืืงืืจ: www.habr.com