ํ์์ ์ผํ์ผ๋ก 0x0A DC7831
์ด ๋ฌธ์์์๋ ์๋ฎฌ๋ ์ดํฐ์์ ์ฅ์น ํ์จ์ด๋ฅผ ์คํํ๊ณ , ๋๋ฒ๊ฑฐ์์ ์ํธ ์์ฉ์ ์์ฐํ๊ณ , ํ์จ์ด์ ๋ํ ๊ฐ๋จํ ๋์ ๋ถ์์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ ์ฌ ์๋
์์ฃผ ๋จผ ์๋ , ๋จธ๋๋จผ ์ํ๊ณ์์
๋ช ๋ ์ ์ฐ๋ฆฌ ์ฐ๊ตฌ์ค์์๋ ์ฅ์น์ ํ์จ์ด๋ฅผ ์กฐ์ฌํ ํ์๊ฐ ์์์ต๋๋ค. ํ์จ์ด๋ ๋ถํธ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ถ๋๊ณ ์์ถ์ด ํ๋ ธ์ต๋๋ค. ๊ทธ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ด๋ํ๋ ๋งค์ฐ ๋ณต์กํ ๋ฐฉ์์ผ๋ก ์ด ์์ ์ ์ํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์จ์ด ์์ฒด๊ฐ ์ฃผ๋ณ ์ฅ์น์ ์ ๊ทน์ ์ผ๋ก ์ํธ ์์ฉํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๊ฒ์ด MIPS ์ฝ์ด์ ์์ต๋๋ค.
๊ฐ๊ด์ ์ธ ์ด์ ๋ก ๊ธฐ์กด ์๋ฎฌ๋ ์ดํฐ๋ ์ฐ๋ฆฌ์๊ฒ ์ ํฉํ์ง ์์์ง๋ง ์ฌ์ ํ ์ฝ๋๋ฅผ ์คํํ๊ณ ์ถ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ ์ต์ํ์ ์์ ์ ์ํํ๊ณ ๊ธฐ๋ณธ ํ์จ์ด์ ์์ถ์ ํ ์ ์๋ ์์ฒด ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๋ํ๊ณ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ฉ์ธ ํ์จ์ด๋ฅผ ์ํํ๊ธฐ ์ํด ์ฃผ๋ณ ์ฅ์น๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋จ๊น ์๊ฐํ์ต๋๋ค. ๋ณ๋ก ์ํ์ง ์์๊ณ ํจ๊ณผ๋ ์ข์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ค์ ์๊ฐํ๊ณ ๋ณธ๊ฒฉ์ ์ธ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ๋ ์ปดํจํฐ ์์คํ
์๋ฎฌ๋ ์ดํฐ์์ต๋๋ค.
์ ์ฝํผ์บฃ์ธ๊ฐ?
๋ง์ฅ๋์ด ์์ต๋๋ค.
- ๋ชจ๋ฐฉ๋ฒ (์์ด, ๋ช ์ฌ [หkษpหkรฆt]) - ๋ชจ๋ฐฉ์, ๋ชจ๋ฐฉ์
- ๋ฐฉ๋ฒ (์์ด, ๋ช ์ฌ [หkรฆt]) - ๊ณ ์์ด, ๊ณ ์์ด - ํ๋ก์ ํธ ์ ์์ ์ค ํ ๋ช ์ด ๊ฐ์ฅ ์ข์ํ๋ ๋๋ฌผ
- ๋ฌธ์ "K"๋ Kotlin ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ฐ์์ต๋๋ค.
๋ชจ๋ฐฉ๋ฒ
์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋ง๋ค ๋ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ๋ชฉํ๊ฐ ์ค์ ๋์์ต๋๋ค.
- ์๋ก์ด ์ฃผ๋ณ ์ฅ์น, ๋ชจ๋, ํ๋ก์ธ์ ์ฝ์ด๋ฅผ ์ ์ํ๊ฒ ์์ฑํ๋ ๊ธฐ๋ฅ;
- ๋ค์ํ ๋ชจ๋์์ ๊ฐ์ ์ฅ์น๋ฅผ ์กฐ๋ฆฝํ๋ ๊ธฐ๋ฅ;
- ๊ฐ์ ์ฅ์น์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ(ํ์จ์ด)๋ฅผ ๋ก๋ํ๋ ๊ธฐ๋ฅ;
- ์ค๋ ์ท ์์ ๊ธฐ๋ฅ(์์คํ ์ํ์ ์ค๋ ์ท)
- ๋ด์ฅ๋ ๋๋ฒ๊ฑฐ๋ฅผ ํตํด ์๋ฎฌ๋ ์ดํฐ์ ์ํธ ์์ฉํ๋ ๊ธฐ๋ฅ
- ๊ฐ๋ฐ์ ์ํ ์ข์ ํ๋ ์ธ์ด์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก Kotlin์ด ๊ตฌํ, ๋ฒ์ค ์ํคํ ์ฒ(๋ชจ๋์ด ๊ฐ์ ๋ฐ์ดํฐ ๋ฒ์ค๋ฅผ ํตํด ์๋ก ํต์ ํ๋ ๊ฒฝ์ฐ), ์ฅ์น ์ค๋ช ํ์์ผ๋ก JSON, ๋๋ฒ๊ฑฐ์์ ์ํธ ์์ฉ์ ์ํ ํ๋กํ ์ฝ๋ก GDB RSP๊ฐ ์ ํ๋์์ต๋๋ค.
๊ฐ๋ฐ์ 86๋ ๋จ์ง ์งํ๋์ด ํ๋ฐํ ์งํ๋๊ณ ์์ต๋๋ค. ์ด ๊ธฐ๊ฐ ๋์ MIPS, x850, VXNUMXES, ARM ๋ฐ PowerPC ํ๋ก์ธ์ ์ฝ์ด๊ฐ ๊ตฌํ๋์์ต๋๋ค.
ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํ๊ณ ์์ผ๋ฉฐ ์ด์ ์ด๋ฅผ ๋ ๋ง์ ๋์ค์๊ฒ ์ ๋ณด์ผ ์๊ฐ์ ๋๋ค. ํ๋ก์ ํธ์ ๋ํ ์์ธํ ์ค๋ช ์ ๋์ค์ ํ ์์ ์ด์ง๋ง ์ง๊ธ์ Kopycat์ ์ฌ์ฉํ๋ ๋ฐ ์ค์ ์ ๋๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ์ฐธ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ์๋ฎฌ๋ ์ดํฐ์ ํ๋ก๋ชจ์
๋ฒ์ ์ ๋ค์์์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
์๋ฎฌ๋ ์ดํฐ์ Rhino
SMARTRHINO-2018 ์ปจํผ๋ฐ์ค ์ด๊ธฐ์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ๊ธฐ์ ์ ๊ฐ๋ฅด์น๊ธฐ ์ํด ํ
์คํธ ์ฅ์น "Rhinoceros"๊ฐ ๋ง๋ค์ด์ก์์ ๊ธฐ์ตํด ๋ด
์๋ค. ์ ์ ํ์จ์ด ๋ถ์ ํ๋ก์ธ์ค๋ ๋ค์ ํญ๋ชฉ์ ์ค๋ช
๋์ด ์์ต๋๋ค.
์ด์ "์คํผ์ปค"๋ฅผ ์ถ๊ฐํ๊ณ ์๋ฎฌ๋ ์ดํฐ์์ ํ์จ์ด๋ฅผ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค :
1) ์๋ฐ 1.8
2) ํ์ด์ฌ๊ณผ ๋ชจ๋
Windows์ ๊ฒฝ์ฐ :
1)
2)
๋ฆฌ๋
์ค์ ๊ฒฝ์ฐ:
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"]
]
}
๋งค๊ฐ๋ณ์์ ์ฃผ์ํ์ธ์. ํ์จ์ด ์น์ ๋งค๊ฐ ๋ณ์ ๊ฐ์ ์ฅ์น์ ํ์จ์ด๋ก ๋ก๋ํ ์ ์๋ ํ์ผ ์ด๋ฆ์ ๋๋ค.
๊ฐ์ ์ฅ์น์ ๊ธฐ๋ณธ ์ด์ ์ฒด์ ์์ ์ํธ ์์ฉ์ ๋ค์ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
์๋ฎฌ๋ ์ดํฐ์ ํ์ฌ ํ ์คํธ ์ธ์คํด์ค์๋ ๊ธฐ๋ณธ OS์ COM ํฌํธ(Bluetooth ๋ชจ๋์ฉ UART ๋ฐ UART ๋๋ฒ๊ทธ)์์ ์ํธ ์์ฉ์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ ์ฅ์น๊ฐ ์ฐ๊ฒฐ๋ ์ค์ ํฌํธ์ด๊ฑฐ๋ ๊ฐ์ COM ํฌํธ์ผ ์ ์์ต๋๋ค. com0com/socat).
ํ์ฌ ์ธ๋ถ์์ ์๋ฎฌ๋ ์ดํฐ์ ์ํธ์์ฉํ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- GDB RSP ํ๋กํ ์ฝ(๋ฐ๋ผ์ ์ด ํ๋กํ ์ฝ์ ์ง์ํ๋ ๋๊ตฌ๋ Eclipse/IDA/radare2์ ๋๋ค)
- ๋ด๋ถ ์๋ฎฌ๋ ์ดํฐ ๋ช ๋ น์ค(Argparse ๋๋ Python)
๊ฐ์ COM ํฌํธ
ํฐ๋ฏธ๋์ ํตํด ๋ก์ปฌ ์์คํ ์ ์๋ ๊ฐ์ ์ฅ์น์ UART์ ์ํธ ์์ฉํ๋ ค๋ฉด ์ฐ๊ฒฐ๋ ๊ฐ์ COM ํฌํธ ์์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ํ ํฌํธ๋ ์๋ฎฌ๋ ์ดํฐ์์ ์ฌ์ฉ๋๊ณ ๋ ๋ฒ์งธ ํฌํธ๋ ํฐ๋ฏธ๋ ํ๋ก๊ทธ๋จ(PuTTY ๋๋ ํ๋ฉด)์์ ์ฌ์ฉ๋ฉ๋๋ค.
com0com ์ฌ์ฉ
๊ฐ์ COM ํฌํธ๋ com0com ํคํธ(์ฝ์ ๋ฒ์ - C:ํ๋ก๊ทธ๋จ ํ์ผ(x86)com0comsetupั.exe, ๋๋ GUI ๋ฒ์ - C:ํ๋ก๊ทธ๋จ ํ์ผ(x86)com0comsetupg.exe):
ํ์ธ๋์ ์ ํํ์ธ์. ๋ฒํผ ์ค๋ฒ๋ฐ ํ์ฑํ ์์ฑ๋ ๋ชจ๋ ๊ฐ์ ํฌํธ์ ๋ํด ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฎฌ๋ ์ดํฐ๋ COM ํฌํธ์ ์๋ต์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
socat ์ฌ์ฉ
UNIX ์์คํ
์์๋ ๊ฐ์ COM ํฌํธ๊ฐ socat ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฎฌ๋ ์ดํฐ์ ์ํด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์์ํ ๋ ํฌํธ ์ด๋ฆ์ ์ ๋์ฌ๋ฅผ ์ง์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. socat:
.
๋ด๋ถ ๋ช ๋ น์ค ์ธํฐํ์ด์ค(Argparse ๋๋ Python)
Kopycat์ ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏ๋ก ์๋ฎฌ๋ ์ดํฐ๋ ๊ฐ์ฒด ๋ฐ ๋ณ์์ ์ํธ ์์ฉํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๋ช ๋ น์ค ์ธํฐํ์ด์ค ์ต์ ์ธ Argparse์ Python์ ์ ๊ณตํฉ๋๋ค.
Argparse๋ Kopycat์ ๋ด์ฅ๋ CLI์ด๋ฉฐ ๋๊ตฌ๋ ํญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋์ฒด CLI๋ Python ์ธํฐํ๋ฆฌํฐ์ ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Jep Python ๋ชจ๋์ ์ค์นํ๊ณ Python๊ณผ ์๋ํ๋๋ก ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค(์ฌ์ฉ์์ ๊ธฐ๋ณธ ์์คํ ์ ์ค์น๋ Python ์ธํฐํ๋ฆฌํฐ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค).
Python ๋ชจ๋ Jep ์ค์น
Linux์์๋ pip๋ฅผ ํตํด Jep์ ์ค์นํ ์ ์์ต๋๋ค.
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.
์์คํ
์ ์๋ฎฌ๋ ์ดํฐ ๋ฐฐ์น ํ์ผ(copycat.bat - ์๋์ฐ์ ๊ฒฝ์ฐ, ๋ชจ๋ฐฉ๋ฒ - 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์์ ์ํธ ์์ฉ
ํ
์คํธ๋ฅผ ๋จ์ํํ๊ธฐ ์ํด Rhino ํ์จ์ด๋ฅผ IDA ๋ถ์์ฉ ์์ค ํ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
๋ฉํ ์ ๋ณด ์์ด ๋ฉ์ธ ํ์จ์ด๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
IDA Pro์์ Kopycat์ ์์ํ ํ Debugger ๋ฉ๋ด์์ " ํญ๋ชฉ์ผ๋ก ์ด๋ํฉ๋๋ค.๋๋ฒ๊ฑฐ ์ ํโฆ"๋ฅผ ์ ํํ๊ณ "์๊ฒฉ GDB ๋๋ฒ๊ฑฐ". ๋ค์์ผ๋ก ์ฐ๊ฒฐ์ ์ค์ ํ์ธ์: ๋ฉ๋ด ๋๋ฒ๊ฑฐ - ํ๋ก์ธ์ค ์ต์ โฆ
๊ฐ์ ์ค์ ํฉ๋๋ค.
- ์ ์ฉ - ๋ชจ๋ ๊ฐ
- ํธ์คํธ ์ด๋ฆ: 127.0.0.1(๋๋ Kopycat์ด ์คํ ์ค์ธ ์๊ฒฉ ์์คํ ์ IP ์ฃผ์)
- ํฌํธ : 23946
์ด์ ๋๋ฒ๊น ๋ฒํผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค(F9 ํค).
ํด๋ฆญํ๋ฉด ์๋ฎฌ๋ ์ดํฐ์ ๋๋ฒ๊ฑฐ ๋ชจ๋์ ์ฐ๊ฒฐ๋ฉ๋๋ค. IDA๊ฐ ๋๋ฒ๊น ๋ชจ๋๋ก ์ ํ๋๋ฉด ๋ ์ง์คํฐ ์ ๋ณด, ์คํ ์ ๋ณด ๋ฑ ์ถ๊ฐ ์ฐฝ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด์ ๋๋ฒ๊ฑฐ์ ๋ชจ๋ ํ์ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋จ๊ณ๋ณ ์ง์นจ ์คํ (๋ค์ด๊ฐ๊ธฐ ะธ ๋์ด๊ฐ๋ค โ ๊ฐ๊ฐ F7 ๋ฐ F8 ํค)
- ์คํ ์์ ๋ฐ ์ผ์ ์ค์ง;
- ์ฝ๋์ ๋ฐ์ดํฐ ๋ชจ๋์ ๋ํ ์ค๋จ์ ์์ฑ(F2 ํค)
๋๋ฒ๊ฑฐ์ ์ฐ๊ฒฐํ๋ค๊ณ ํด์ ํ์จ์ด ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ ์๋๋๋ค. ํ์ฌ ์คํ ์์น๋ ์ฃผ์์ฌ์ผ ํฉ๋๋ค. 0x08006A74
โ ๊ธฐ๋ฅ ์์ Reset_Handler. ๋ชฉ๋ก์ ์๋๋ก ์คํฌ๋กคํ๋ฉด ํจ์ ํธ์ถ์ ๋ณผ ์ ์์ต๋๋ค. ๋ณธ๊ด. ์ด ์ค(์ฃผ์)์ ์ปค์๋ฅผ ๋์ ์ ์์ต๋๋ค. 0x08006ABE
) ๊ทธ๋ฆฌ๊ณ ์์
์ ์ํํฉ๋๋ค. ์ปค์๊น์ง ์คํ (ํค F4).
๋ค์์ผ๋ก F7์ ๋๋ฌ ํด๋น ๊ธฐ๋ฅ์ ์ ๋ ฅํ ์ ์์ต๋๋ค. ๋ณธ๊ด.
๋ช ๋ น์ ์คํํ๋ฉด ๊ณ์ ์งํ (F9 ํค)๋ฅผ ๋๋ฅด๋ฉด ๋ฒํผ ํ๋๋ก "์ ์ ๊ธฐ๋ค๋ ค์ฃผ์ธ์" ์ฐฝ์ด ๋ํ๋ฉ๋๋ค ์ค์งํ๋ค:
๋๋ฅผ ๋ ์ค์งํ๋ค ํ์จ์ด ์ฝ๋์ ์คํ์ด ์ผ์ ์ค์ง๋๊ณ ์ค๋จ๋ ์ฝ๋์ ๋์ผํ ์ฃผ์์์ ๊ณ์๋ ์ ์์ต๋๋ค.
์ฝ๋๋ฅผ ๊ณ์ ์คํํ๋ฉด ๊ฐ์ COM ํฌํธ์ ์ฐ๊ฒฐ๋ ํฐ๋ฏธ๋์ ๋ค์ ์ค์ด ํ์๋ฉ๋๋ค.
"์ํ ์ฐํ" ๋ผ์ธ์ด ์๋ค๋ ๊ฒ์ ๊ฐ์ Bluetooth ๋ชจ๋์ด ์ฌ์ฉ์์ COM ํฌํธ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๋ชจ๋๋ก ์ ํ๋์์์ ๋ํ๋ ๋๋ค.
์ด์ Bluetooth ํฐ๋ฏธ๋(๊ทธ๋ฆผ์ COM29)์์ Rhino ํ๋กํ ์ฝ์ ๋ฐ๋ผ ๋ช ๋ น์ ์ ๋ ฅํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, "MEOW" ๋ช ๋ น์ "mur-mur" ๋ฌธ์์ด์ Bluetooth ํฐ๋ฏธ๋์ ๋ฐํํฉ๋๋ค.
๋๋ฅผ ์์ ํ ํ๋ด๋ด์ง๋ ๋ง์ธ์
์๋ฎฌ๋ ์ดํฐ๋ฅผ ๊ตฌ์ถํ ๋ ํน์ ์ฅ์น์ ์ธ๋ถ์ ๋ณด/์๋ฎฌ๋ ์ด์ ์์ค์ ์ ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Bluetooth ๋ชจ๋์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์๋ฎฌ๋ ์ด์ ๋ ์ ์์ต๋๋ค.
- ์ฅ์น๋ ์ ์ฒด ๋ช ๋ น ์ธํธ๋ก ์์ ํ ์๋ฎฌ๋ ์ด์ ๋ฉ๋๋ค.
- AT ๋ช ๋ น์ด ์๋ฎฌ๋ ์ด์ ๋๊ณ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ด ๋ฉ์ธ ์์คํ ์ COM ํฌํธ์์ ์์ ๋ฉ๋๋ค.
- ๊ฐ์ ์ฅ์น๋ ์ค์ ์ฅ์น๋ก ์์ ํ ๋ฐ์ดํฐ ๋ฆฌ๋๋ ์ ์ ์ ๊ณตํฉ๋๋ค.
- ํญ์ "OK"๋ฅผ ๋ฐํํ๋ ๊ฐ๋จํ ์คํ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ฌ ๋ฒ์ ์ ์๋ฎฌ๋ ์ดํฐ๋ ๋ ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ๊ฐ์ 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
(ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ 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 ํ๋์จ์ด ๋๋ฒ๊น ์ ๊ตฌ์ฑ์ ์ถ๊ฐํ ๋ค์ "๊ธฐ๋ณธ" ํญ์์ ๋๋ฒ๊น ํ ํ์ฌ ํ๋ก์ ํธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ํด์ผ ํฉ๋๋ค.
"๋๋ฒ๊ฑฐ" ํญ์์ GDB ๋ช
๋ น์ ์ง์ ํด์ผ ํฉ๋๋ค:
${openstm32_compiler_path}arm-none-eabi-gdb
๋ํ GDB ์๋ฒ(ํธ์คํธ ๋ฐ ํฌํธ)์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ ฅํฉ๋๋ค.
"์์" ํญ์์ ๋ค์ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
- ์ฒดํฌ๋ฐ์ค ํ์ฑํ ์ด๋ฏธ์ง ๋ก๋ (์ด์ ๋ธ๋ ํ์จ์ด ์ด๋ฏธ์ง๊ฐ ์๋ฎฌ๋ ์ดํฐ์ ๋ก๋๋๋๋ก)
- ์ฒดํฌ๋ฐ์ค ํ์ฑํ ๊ธฐํธ ๋ก๋;
- ์คํ ๋ช
๋ น์ ์ถ๊ฐํ์ธ์:
set $pc = *0x08000004
(์ฃผ์์ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ผ๋ก PC ๋ ์ง์คํฐ๋ฅผ ์ค์ ํฉ๋๋ค.0x08000004
- ์ฃผ์๊ฐ ๊ฑฐ๊ธฐ์ ์ ์ฅ๋์ด ์์ต๋๋ค ResetHandler).
์ฃผ์, Eclipse์์ ํ์จ์ด ํ์ผ์ ๋ค์ด๋ก๋ํ์ง ์์ผ๋ ค๋ฉด ์ต์ ์ ์ ํํ์ธ์. ์ด๋ฏธ์ง ๋ก๋ ะธ ๋ช ๋ น ์คํ ํ์ํ ํ์๊ฐ ์์ต๋๋ค.
๋๋ฒ๊ทธ๋ฅผ ํด๋ฆญํ ํ ๋๋ฒ๊ฑฐ ๋ชจ๋์์ ์์ ํ ์ ์์ต๋๋ค.
- ๋จ๊ณ๋ณ ์ฝ๋ ์คํ
- ์ค๋จ์ ๊ณผ ์ํธ ์์ฉ
์ฃผ์. Eclipse์๋ ํ ... ๋ช ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค... ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ๊ทธ๊ฒ๋ค๊ณผ ํจ๊ป ์ด์์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋๋ฒ๊ฑฐ๋ฅผ ์์ํ ๋ "0x0"์ ์ฌ์ฉํ ์ ์๋ ์์ค๊ฐ ์์ต๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ๋ํ๋๋ฉด ๋จ๊ณ ๋ช ๋ น(F5)์ ์คํํฉ๋๋ค.
๋์ ๊ฒฐ๋ก
๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ๊ฒ์ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ์ผ์ ๋๋ค. ์ฅ์น ๊ฐ๋ฐ์๊ฐ ์ค์ ์ฅ์น ์์ด ํ์จ์ด๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค. ์ฐ๊ตฌ์์๊ฒ๋ ๊ธฐ๊ธฐ๋ก๋ ํญ์ ๊ฐ๋ฅํ์ง ์์ ๋์ ์ฝ๋ ๋ถ์์ ์ํํ ์ ์๋ ๊ธฐํ์ ๋๋ค.
์ฐ๋ฆฌ๋ ํธ๋ฆฌํ๊ณ ์ ๋นํ ๋จ์ํ๋ฉฐ ์ค์ ๋ฐ ์คํ์ ๋ง์ ๋ ธ๋ ฅ๊ณผ ์๊ฐ์ ๋ค์ด์ง ์๋ ๋๊ตฌ๋ฅผ ์ ๋ฌธ๊ฐ์๊ฒ ์ ๊ณตํ๊ณ ์ถ์ต๋๋ค.
ํ๋์จ์ด ์๋ฎฌ๋ ์ดํฐ ์ฌ์ฉ ๊ฒฝํ์ ๋ํ ์๊ฒฌ์ ์ ์ด์ฃผ์ธ์. ํ ๋ก ์ ์ฐธ์ฌํด ๋ณด์๊ณ ์ง๋ฌธ์ ๊ธฐ๊บผ์ด ๋ต๋ณํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ฑ๋ก๋ ์ฌ์ฉ์๋ง ์ค๋ฌธ ์กฐ์ฌ์ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ด๋ค ์ฉ๋๋ก ์ฌ์ฉํ์๋์?
-
๋๋ ํ์จ์ด๋ฅผ ๊ฐ๋ฐ(๋๋ฒ๊น )ํ๋ค
-
ํ์จ์ด๋ฅผ ์ฐ๊ตฌํ๊ณ ์์ด์
-
๊ฒ์์ ์ถ์ํฉ๋๋ค(Dendi, Sega, PSP)
-
๋ค๋ฅธ ๊ฒ (๋๊ธ์ ์ ์ด์ฃผ์ธ์)
7๋ช ์ ์ฌ์ฉ์๊ฐ ํฌํํ์ต๋๋ค. 2๋ช ์ ์ฌ์ฉ์๊ฐ ๊ธฐ๊ถํ์ต๋๋ค.
๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์๋ฎฌ๋ ์ดํธํ๊ธฐ ์ํด ์ด๋ค ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํฉ๋๊น?
-
QEMU
-
์ ๋์ฝ ์์ง
-
ํ๋กํ ์ฐ์ค
-
๋ค๋ฅธ ๊ฒ (๋๊ธ์ ์ ์ด์ฃผ์ธ์)
6๋ช ์ ์ฌ์ฉ์๊ฐ ํฌํํ์ต๋๋ค. 2๋ช ์ ์ฌ์ฉ์๊ฐ ๊ธฐ๊ถํ์ต๋๋ค.
์ฌ์ฉ ์ค์ธ ์๋ฎฌ๋ ์ดํฐ์์ ๊ฐ์ ํ๊ณ ์ถ์ ์ ์ ๋ฌด์์ ๋๊น?
-
๋๋ ์๋๋ฅผ ์ํ๋ค
-
๊ฐํธํ ์ค์ /์คํ์ ์ํจ
-
์๋ฎฌ๋ ์ดํฐ(API, ํํฌ)์ ์ํธ์์ฉํ๊ธฐ ์ํ ๋ ๋ง์ ์ต์ ์ ์ํฉ๋๋ค.
-
๋๋ ๋ชจ๋ ๊ฒ์ ๋ง์กฑํ๋ค
-
๋ค๋ฅธ ๊ฒ (๋๊ธ์ ์ ์ด์ฃผ์ธ์)
8๋ช
์ ์ฌ์ฉ์๊ฐ ํฌํํ์ต๋๋ค. 1๋ช
์ ์ฌ์ฉ์๊ฐ ๊ธฐ๊ถํ์ต๋๋ค.
์ถ์ฒ : habr.com