๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํšŒ์˜์˜ ์ผํ™˜์œผ๋กœ 0x0A DC7831 ๋ฐํ”„์ฝ˜ ๋‹ˆ์ฆˆ๋‹ˆ๋…ธ๋ธŒ๊ณ ๋กœ๋“œ 16์›” XNUMX์ผ, ์šฐ๋ฆฌ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ ์—๋ฎฌ๋ ˆ์ด์…˜์˜ ๊ธฐ๋ณธ ์›์น™๊ณผ ์ž์ฒด ๊ฐœ๋ฐœ์ธ ํ•˜๋“œ์›จ์–ด ํ”Œ๋žซํผ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ๋ฅผ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐฉ๋ฒ”.

์ด ๋ฌธ์„œ์—์„œ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์žฅ์น˜ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋””๋ฒ„๊ฑฐ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์‹œ์—ฐํ•˜๊ณ , ํŽŒ์›จ์–ด์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋™์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์„ ์‚ฌ ์‹œ๋Œ€

์•„์ฃผ ๋จผ ์˜›๋‚ , ๋จธ๋‚˜๋จผ ์€ํ•˜๊ณ„์—์„œ

๋ช‡ ๋…„ ์ „ ์šฐ๋ฆฌ ์—ฐ๊ตฌ์‹ค์—์„œ๋Š” ์žฅ์น˜์˜ ํŽŒ์›จ์–ด๋ฅผ ์กฐ์‚ฌํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŽŒ์›จ์–ด๋Š” ๋ถ€ํŠธ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์••์ถ•๋˜๊ณ  ์••์ถ•์ด ํ’€๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ด๋™ํ•˜๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŽŒ์›จ์–ด ์ž์ฒด๊ฐ€ ์ฃผ๋ณ€ ์žฅ์น˜์™€ ์ ๊ทน์ ์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ๊ฒƒ์ด MIPS ์ฝ”์–ด์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ด€์ ์ธ ์ด์œ ๋กœ ๊ธฐ์กด ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ๋Š” ์ตœ์†Œํ•œ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ธฐ๋ณธ ํŽŒ์›จ์–ด์˜ ์••์ถ•์„ ํ’€ ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฉ”์ธ ํŽŒ์›จ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋ณ€ ์žฅ์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–จ๊นŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋กœ ์•„ํ”„์ง€ ์•Š์•˜๊ณ  ํšจ๊ณผ๋„ ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์‹œ ์ƒ๊ฐํ•˜๊ณ  ๋ณธ๊ฒฉ์ ์ธ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ๋Š” ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐฉ๋ฒ”.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์™œ ์ฝ”ํ”ผ์บฃ์ธ๊ฐ€?

๋ง์žฅ๋‚œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋ฐฉ๋ฒ” (์˜์–ด, ๋ช…์‚ฌ [หˆkษ’pหˆkรฆt]) - ๋ชจ๋ฐฉ์ž, ๋ชจ๋ฐฉ์ž
  2. ๋ฐฉ๋ฒ• (์˜์–ด, ๋ช…์‚ฌ [หˆkรฆt]) - ๊ณ ์–‘์ด, ๊ณ ์–‘์ด - ํ”„๋กœ์ ํŠธ ์ œ์ž‘์ž ์ค‘ ํ•œ ๋ช…์ด ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๋™๋ฌผ
  3. ๋ฌธ์ž "K"๋Š” Kotlin ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋”ฐ์™”์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐฉ๋ฒ”

์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ๋ชฉํ‘œ๊ฐ€ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ์ฃผ๋ณ€ ์žฅ์น˜, ๋ชจ๋“ˆ, ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ;
  • ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ƒ ์žฅ์น˜๋ฅผ ์กฐ๋ฆฝํ•˜๋Š” ๊ธฐ๋Šฅ;
  • ๊ฐ€์ƒ ์žฅ์น˜์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ(ํŽŒ์›จ์–ด)๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ;
  • ์Šค๋ƒ…์ƒท ์ž‘์—… ๊ธฐ๋Šฅ(์‹œ์Šคํ…œ ์ƒํƒœ์˜ ์Šค๋ƒ…์ƒท)
  • ๋‚ด์žฅ๋œ ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด ์—๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ธฐ๋Šฅ
  • ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ข‹์€ ํ˜„๋Œ€ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ Kotlin์ด ๊ตฌํ˜„, ๋ฒ„์Šค ์•„ํ‚คํ…์ฒ˜(๋ชจ๋“ˆ์ด ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ ๋ฒ„์Šค๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒฝ์šฐ), ์žฅ์น˜ ์„ค๋ช… ํ˜•์‹์œผ๋กœ JSON, ๋””๋ฒ„๊ฑฐ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ GDB RSP๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์€ 86๋…„ ๋‚จ์ง“ ์ง„ํ–‰๋˜์–ด ํ™œ๋ฐœํžˆ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ MIPS, x850, VXNUMXES, ARM ๋ฐ PowerPC ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด์ œ ์ด๋ฅผ ๋” ๋งŽ์€ ๋Œ€์ค‘์—๊ฒŒ ์„ ๋ณด์ผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ๋‚˜์ค‘์— ํ•  ์˜ˆ์ •์ด์ง€๋งŒ ์ง€๊ธˆ์€ Kopycat์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ฐธ์„์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ํ”„๋กœ๋ชจ์…˜ ๋ฒ„์ „์„ ๋‹ค์Œ์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ.

์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ Rhino

SMARTRHINO-2018 ์ปจํผ๋Ÿฐ์Šค ์ดˆ๊ธฐ์— ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๊ธฐ์ˆ ์„ ๊ฐ€๋ฅด์น˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์žฅ์น˜ "Rhinoceros"๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Œ์„ ๊ธฐ์–ตํ•ด ๋ด…์‹œ๋‹ค. ์ •์  ํŽŒ์›จ์–ด ๋ถ„์„ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ.

์ด์ œ "์Šคํ”ผ์ปค"๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :
1) ์ž๋ฐ” 1.8
2) ํŒŒ์ด์ฌ๊ณผ ๋ชจ๋“ˆ p ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋‚ด์—์„œ Python์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Windows์šฉ WHL ๋ชจ๋“ˆ Jep์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์‹ญ์‹œ์˜ค.

Windows์˜ ๊ฒฝ์šฐ :
1) ์ปดํˆฌ์ปด
2) ํผํ‹ฐ

๋ฆฌ๋ˆ…์Šค์˜ ๊ฒฝ์šฐ:
1) ์†Œ์บฃ

Eclipse, IDA Pro ๋˜๋Š” Radare2๋ฅผ GDB ํด๋ผ์ด์–ธํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์‹ค์ œ ์žฅ์น˜์™€ ์œ ์‚ฌํ•œ ๊ฐ€์ƒ ์žฅ์น˜๋ฅผ "์กฐ๋ฆฝ"ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์žฅ์น˜(โ€œrhinoโ€)๋Š” ๋ธ”๋ก ๋‹ค์ด์–ด๊ทธ๋žจ์— ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ๋ชจ๋“ˆ์‹ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ตœ์ข… ๊ฐ€์ƒ ์žฅ์น˜๋Š” 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"]
  ]
}

๋งค๊ฐœ๋ณ€์ˆ˜์— ์ฃผ์˜ํ•˜์„ธ์š”. ํŽŒ์›จ์–ด ์„น์…˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฐ€์ƒ ์žฅ์น˜์— ํŽŒ์›จ์–ด๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

๊ฐ€์ƒ ์žฅ์น˜์™€ ๊ธฐ๋ณธ ์šด์˜ ์ฒด์ œ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์€ ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ํ˜„์žฌ ํ…Œ์ŠคํŠธ ์ธ์Šคํ„ด์Šค์—๋Š” ๊ธฐ๋ณธ OS์˜ COM ํฌํŠธ(Bluetooth ๋ชจ๋“ˆ์šฉ UART ๋ฐ UART ๋””๋ฒ„๊ทธ)์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์žฅ์น˜๊ฐ€ ์—ฐ๊ฒฐ๋œ ์‹ค์ œ ํฌํŠธ์ด๊ฑฐ๋‚˜ ๊ฐ€์ƒ COM ํฌํŠธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. com0com/socat).

ํ˜„์žฌ ์™ธ๋ถ€์—์„œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • GDB RSP ํ”„๋กœํ† ์ฝœ(๋”ฐ๋ผ์„œ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๋Š” Eclipse/IDA/radare2์ž…๋‹ˆ๋‹ค)
  • ๋‚ด๋ถ€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋ช…๋ น์ค„(Argparse ๋˜๋Š” Python)

๊ฐ€์ƒ COM ํฌํŠธ

ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ๋กœ์ปฌ ์‹œ์Šคํ…œ์— ์žˆ๋Š” ๊ฐ€์ƒ ์žฅ์น˜์˜ UART์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ ค๋ฉด ์—ฐ๊ฒฐ๋œ ๊ฐ€์ƒ COM ํฌํŠธ ์Œ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ํ•œ ํฌํŠธ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ๋‘ ๋ฒˆ์งธ ํฌํŠธ๋Š” ํ„ฐ๋ฏธ๋„ ํ”„๋กœ๊ทธ๋žจ(PuTTY ๋˜๋Š” ํ™”๋ฉด)์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

com0com ์‚ฌ์šฉ

๊ฐ€์ƒ COM ํฌํŠธ๋Š” com0com ํ‚คํŠธ(์ฝ˜์†” ๋ฒ„์ „ - C:ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ(x86)com0comsetupั.exe, ๋˜๋Š” GUI ๋ฒ„์ „ - C:ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ(x86)com0comsetupg.exe):

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ™•์ธ๋ž€์„ ์„ ํƒํ•˜์„ธ์š”. ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ ํ™œ์„ฑํ™” ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฐ€์ƒ ํฌํŠธ์— ๋Œ€ํ•ด ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” 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๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. WHL ๋นŒ๋“œ Windows์šฉ Python์˜ ํ˜„์žฌ ๋ฒ„์ „์— ๋Œ€ํ•œ JEP์ด๋ฏ€๋กœ ํŒŒ์ผ์—์„œ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ๋ถ„์„์šฉ ์†Œ์Šค ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ELF ํŒŒ์ผ (๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ๊ฑฐ๊ธฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค).

๋ฉ”ํƒ€ ์ •๋ณด ์—†์ด ๋ฉ”์ธ ํŽŒ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

IDA Pro์—์„œ Kopycat์„ ์‹œ์ž‘ํ•œ ํ›„ Debugger ๋ฉ”๋‰ด์—์„œ " ํ•ญ๋ชฉ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.๋””๋ฒ„๊ฑฐ ์ „ํ™˜โ€ฆ"๋ฅผ ์„ ํƒํ•˜๊ณ  "์›๊ฒฉ GDB ๋””๋ฒ„๊ฑฐ". ๋‹ค์Œ์œผ๋กœ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜์„ธ์š”: ๋ฉ”๋‰ด ๋””๋ฒ„๊ฑฐ - ํ”„๋กœ์„ธ์Šค ์˜ต์…˜โ€ฆ

๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์ ์šฉ - ๋ชจ๋“  ๊ฐ’
  • ํ˜ธ์ŠคํŠธ ์ด๋ฆ„: 127.0.0.1(๋˜๋Š” Kopycat์ด ์‹คํ–‰ ์ค‘์ธ ์›๊ฒฉ ์‹œ์Šคํ…œ์˜ IP ์ฃผ์†Œ)
  • ํฌํŠธ : 23946

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋””๋ฒ„๊น… ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(F9 ํ‚ค).

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ฆญํ•˜๋ฉด ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ๋””๋ฒ„๊ฑฐ ๋ชจ๋“ˆ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. IDA๊ฐ€ ๋””๋ฒ„๊น… ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜๋ฉด ๋ ˆ์ง€์Šคํ„ฐ ์ •๋ณด, ์Šคํƒ ์ •๋ณด ๋“ฑ ์ถ”๊ฐ€ ์ฐฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋””๋ฒ„๊ฑฐ์˜ ๋ชจ๋“  ํ‘œ์ค€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹จ๊ณ„๋ณ„ ์ง€์นจ ์‹คํ–‰ (๋“ค์–ด๊ฐ€๊ธฐ ะธ ๋„˜์–ด๊ฐ€๋‹ค โ€” ๊ฐ๊ฐ F7 ๋ฐ F8 ํ‚ค)
  • ์‹คํ–‰ ์‹œ์ž‘ ๋ฐ ์ผ์‹œ ์ค‘์ง€;
  • ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ ๋ชจ๋‘์— ๋Œ€ํ•œ ์ค‘๋‹จ์  ์ƒ์„ฑ(F2 ํ‚ค)

๋””๋ฒ„๊ฑฐ์— ์—ฐ๊ฒฐํ•œ๋‹ค๊ณ  ํ•ด์„œ ํŽŒ์›จ์–ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹คํ–‰ ์œ„์น˜๋Š” ์ฃผ์†Œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 0x08006A74 โ€” ๊ธฐ๋Šฅ ์‹œ์ž‘ Reset_Handler. ๋ชฉ๋ก์„ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ๊ด€. ์ด ์ค„(์ฃผ์†Œ)์— ์ปค์„œ๋ฅผ ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0x08006ABE) ๊ทธ๋ฆฌ๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ปค์„œ๊นŒ์ง€ ์‹คํ–‰ (ํ‚ค F4).

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ F7์„ ๋ˆŒ๋Ÿฌ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ๊ด€.

๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๊ณ„์† ์ง„ํ–‰ (F9 ํ‚ค)๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ฒ„ํŠผ ํ•˜๋‚˜๋กœ "์ž ์‹œ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”" ์ฐฝ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค ์ค‘์ง€ํ•˜๋‹ค:

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๋ฅผ ๋•Œ ์ค‘์ง€ํ•˜๋‹ค ํŽŒ์›จ์–ด ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ์ค‘๋‹จ๋œ ์ฝ”๋“œ์˜ ๋™์ผํ•œ ์ฃผ์†Œ์—์„œ ๊ณ„์†๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•˜๋ฉด ๊ฐ€์ƒ COM ํฌํŠธ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ ์ค„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

"์ƒํƒœ ์šฐํšŒ" ๋ผ์ธ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐ€์ƒ Bluetooth ๋ชจ๋“ˆ์ด ์‚ฌ์šฉ์ž์˜ COM ํฌํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด์ œ Bluetooth ํ„ฐ๋ฏธ๋„(๊ทธ๋ฆผ์˜ COM29)์—์„œ Rhino ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ๋ช…๋ น์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "MEOW" ๋ช…๋ น์€ "mur-mur" ๋ฌธ์ž์—ด์„ Bluetooth ํ„ฐ๋ฏธ๋„์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์™„์ „ํžˆ ํ‰๋‚ด๋‚ด์ง€๋Š” ๋งˆ์„ธ์š”

์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ํŠน์ • ์žฅ์น˜์˜ ์„ธ๋ถ€์ •๋ณด/์—๋ฎฌ๋ ˆ์ด์…˜ ์ˆ˜์ค€์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Bluetooth ๋ชจ๋“ˆ์€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์—๋ฎฌ๋ ˆ์ด์…˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์žฅ์น˜๋Š” ์ „์ฒด ๋ช…๋ น ์„ธํŠธ๋กœ ์™„์ „ํžˆ ์—๋ฎฌ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๋‹ค.
  • AT ๋ช…๋ น์ด ์—๋ฎฌ๋ ˆ์ด์…˜๋˜๊ณ  ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ด ๋ฉ”์ธ ์‹œ์Šคํ…œ์˜ COM ํฌํŠธ์—์„œ ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์ƒ ์žฅ์น˜๋Š” ์‹ค์ œ ์žฅ์น˜๋กœ ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ ๋ฆฌ๋””๋ ‰์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ญ์ƒ "OK"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์Šคํ…์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„์ „์˜ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ๋‘ ๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ€์ƒ Bluetooth ๋ชจ๋“ˆ์ด ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋ฉ”์ธ ์‹œ์Šคํ…œ์˜ COM ํฌํŠธ์—์„œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ UART ํฌํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ "ํ”„๋ก์‹œ"ํ•˜๋Š” ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋ณ€์˜ ์ผ๋ถ€๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ณ„์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, DMA๋กœ์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹ํƒ€์ด๋จธ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(ํ™•์ธ์€ ํ•จ์ˆ˜์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.) ws2812b_wait์— ์œ„์น˜ํ•œ 0x08006840), ๊ทธ๋Ÿฌ๋ฉด ํŽŒ์›จ์–ด๋Š” ํ•ญ์ƒ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žฌ์„ค์ •๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฐ”์œ์— ์œ„์น˜ํ•œ 0x200004C4์ด๋Š” DMA ๋ฐ์ดํ„ฐ ๋ผ์ธ์˜ ์ ์œ ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์žฌ์„ค์ •ํ•˜์—ฌ ์ด ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์œ ์„ค์น˜ ์งํ›„. 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

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„ ์šฐ๋ฆฌ๋Š” ๋‹ฌ๋ฆฌ๊ธฐ ๊ทธ๋ฆฌ๊ณ  ์Šคํฌ๋ฆฝํŠธ ์ฐฝ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ์ด๋™ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 0x0800688A, ์ค‘๋‹จ์  ์„ค์ •(F2 ํ‚ค), ํŽธ์ง‘(์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด) ์ค‘๋‹จ์  ์ˆ˜์ •...), ์Šคํฌ๋ฆฝํŠธ ์œ ํ˜•์„ Python์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ”Œ๋ž˜๊ทธ ๊ฐ’์ธ ๊ฒฝ์šฐ ๋ฐ”์œ 1์ด๋ฉด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฑด๋„ˆ๋›ฐ๊ธฐ_dma ์Šคํฌ๋ฆฝํŠธ ์ค„์—์„œ:

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰์„ ์œ„ํ•ด ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด IDA ์ฐฝ์—์„œ ์ค‘๋‹จ์  ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ์˜ ํŠธ๋ฆฌ๊ฑฐ๋ง์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฐ์ถœ ์ค„๋ณ„๋กœ Skipping wait ws2812.... ์ด์ œ ํŽŒ์›จ์–ด๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žฌ์„ค์ •๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”์œ.

์—๋ฎฌ๋ ˆ์ดํ„ฐ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ

์—๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ์—๋ฎฌ๋ ˆ์ด์…˜์€ ๊ธฐ์จ๊ณผ ์ฆ๊ฑฐ์›€์„ ์„ ์‚ฌํ•  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์—ฐ๊ตฌ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

RTOS ์ž‘์—… ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋™์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ ๋จผ์ € ์ฝ”๋“œ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ธฐ๋Šฅ์œผ๋กœ ์ด๋™ํ•˜์‹œ๋ฉด bluetooth_task_entry "LED" ๋ช…๋ น์˜ ์ฒ˜๋ฆฌ ๋ถ„๊ธฐ(์ฃผ์†Œ 0x080057B8), ๊ทธ๋Ÿฌ๋ฉด ๋จผ์ € ์ƒ์„ฑ๋œ ๋‹ค์Œ ์‹œ์Šคํ…œ ๋Œ€๊ธฐ์—ด๋กœ ์ „์†ก๋˜๋Š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ledControlQueueHandle ์–ด๋–ค ๋ฉ”์‹œ์ง€.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ledControlQueueHandle์— ์œ„์น˜ํ•œ 0x20000624 ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ •์ง€๋Š” ๋จผ์ € ์ฃผ์†Œ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 0x080057CA ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— osMailAlloc, ๊ทธ ๋‹ค์Œ ์ฃผ์†Œ์—์„œ 0x08005806 ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— osMailPut, ๊ทธ๋ฆฌ๊ณ  ์ž ์‹œ ํ›„ - ์ฃผ์†Œ๋กœ 0x08005BD4 (ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— osMailGet), ์ด๋Š” ํ•จ์ˆ˜์— ์†ํ•ฉ๋‹ˆ๋‹ค. leds_task_entry (LED ์ž‘์—…), ์ฆ‰ ์ž‘์—…์ด ์ „ํ™˜๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ LED ์ž‘์—…์ด ์ œ์–ด๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ RTOS ์ž‘์—…์ด ์„œ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์‹ค์ œ๋กœ๋Š” ์ž‘์—…์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์ƒํ˜ธ ์ž‘์šฉ์„ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ๋œ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— IDA Pro๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋Œ€ํ•œ ์งง์€ ๋น„๋””์˜ค๋ฅผ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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๋กœ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. STM32์šฉ ์‹œ์Šคํ…œ ์›Œํฌ๋ฒค์น˜.

์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ Eclipse์—์„œ ์ง์ ‘ ์ปดํŒŒ์ผ๋œ ํŽŒ์›จ์–ด๋ฅผ ๋กœ๋“œํ•˜๋ ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. firmware=null ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‹คํ–‰ ๋ช…๋ น์—:

binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28

๋””๋ฒ„๊ทธ ๊ตฌ์„ฑ ์„ค์ •

Eclipse์—์„œ ๋ฉ”๋‰ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ - ๋””๋ฒ„๊ทธ ๊ตฌ์„ฑ... ์—ด๋ฆฌ๋Š” ์ฐฝ์—์„œ ์„น์…˜์—์„œ GDB ํ•˜๋“œ์›จ์–ด ๋””๋ฒ„๊น… ์ƒˆ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ "๊ธฐ๋ณธ" ํƒญ์—์„œ ๋””๋ฒ„๊น…ํ•  ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

"๋””๋ฒ„๊ฑฐ" ํƒญ์—์„œ GDB ๋ช…๋ น์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
${openstm32_compiler_path}arm-none-eabi-gdb

๋˜ํ•œ GDB ์„œ๋ฒ„(ํ˜ธ์ŠคํŠธ ๋ฐ ํฌํŠธ)์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

"์‹œ์ž‘" ํƒญ์—์„œ ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฒดํฌ๋ฐ•์Šค ํ™œ์„ฑํ™” ์ด๋ฏธ์ง€ ๋กœ๋“œ (์–ด์…ˆ๋ธ”๋œ ํŽŒ์›จ์–ด ์ด๋ฏธ์ง€๊ฐ€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋กœ๋“œ๋˜๋„๋ก)
  • ์ฒดํฌ๋ฐ•์Šค ํ™œ์„ฑํ™” ๊ธฐํ˜ธ ๋กœ๋“œ;
  • ์‹คํ–‰ ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”: set $pc = *0x08000004 (์ฃผ์†Œ์— ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์œผ๋กœ PC ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 0x08000004 - ์ฃผ์†Œ๊ฐ€ ๊ฑฐ๊ธฐ์— ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค ResetHandler).

์ฃผ์˜, Eclipse์—์„œ ํŽŒ์›จ์–ด ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์˜ต์…˜์„ ์„ ํƒํ•˜์„ธ์š”. ์ด๋ฏธ์ง€ ๋กœ๋“œ ะธ ๋ช…๋ น ์‹คํ–‰ ํ‘œ์‹œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ๋ฅผ ํด๋ฆญํ•œ ํ›„ ๋””๋ฒ„๊ฑฐ ๋ชจ๋“œ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹จ๊ณ„๋ณ„ ์ฝ”๋“œ ์‹คํ–‰
    ๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘๋‹จ์ ๊ณผ ์ƒํ˜ธ ์ž‘์šฉ
    ๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜. Eclipse์—๋Š” ํ ... ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋””๋ฒ„๊ฑฐ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ "0x0"์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ๋‹จ๊ณ„ ๋ช…๋ น(F5)์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์–‘์ด ์•ˆ์˜ Rhinoceros - Kopycat ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํŽŒ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‹  ๊ฒฐ๋ก 

๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ์ผ์ž…๋‹ˆ๋‹ค. ์žฅ์น˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ œ ์žฅ์น˜ ์—†์ด ํŽŒ์›จ์–ด๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ตฌ์›์—๊ฒŒ๋Š” ๊ธฐ๊ธฐ๋กœ๋„ ํ•ญ์ƒ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๋™์  ์ฝ”๋“œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํŽธ๋ฆฌํ•˜๊ณ  ์ ๋‹นํžˆ ๋‹จ์ˆœํ•˜๋ฉฐ ์„ค์ • ๋ฐ ์‹คํ–‰์— ๋งŽ์€ ๋…ธ๋ ฅ๊ณผ ์‹œ๊ฐ„์„ ๋“ค์ด์ง€ ์•Š๋Š” ๋„๊ตฌ๋ฅผ ์ „๋ฌธ๊ฐ€์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‚ฌ์šฉ ๊ฒฝํ—˜์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์ ์–ด์ฃผ์„ธ์š”. ํ† ๋ก ์— ์ฐธ์—ฌํ•ด ๋ณด์‹œ๊ณ  ์งˆ๋ฌธ์— ๊ธฐ๊บผ์ด ๋‹ต๋ณ€ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž๋งŒ ์„ค๋ฌธ ์กฐ์‚ฌ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์ œ๋ฐœ

์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์–ด๋–ค ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜์‹œ๋‚˜์š”?

  • ๋‚˜๋Š” ํŽŒ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœ(๋””๋ฒ„๊น…)ํ•œ๋‹ค

  • ํŽŒ์›จ์–ด๋ฅผ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ์–ด์š”

  • ๊ฒŒ์ž„์„ ์ถœ์‹œํ•ฉ๋‹ˆ๋‹ค(Dendi, Sega, PSP)

  • ๋‹ค๋ฅธ ๊ฒƒ (๋Œ“๊ธ€์— ์ ์–ด์ฃผ์„ธ์š”)

7๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 2๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

  • QEMU

  • ์œ ๋‹ˆ์ฝ˜ ์—”์ง„

  • ํ”„๋กœํ…Œ์šฐ์Šค

  • ๋‹ค๋ฅธ ๊ฒƒ (๋Œ“๊ธ€์— ์ ์–ด์ฃผ์„ธ์š”)

6๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 2๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์ค‘์ธ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๊ฐœ์„ ํ•˜๊ณ  ์‹ถ์€ ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ๋‚˜๋Š” ์†๋„๋ฅผ ์›ํ•œ๋‹ค

  • ๊ฐ„ํŽธํ•œ ์„ค์ •/์‹คํ–‰์„ ์›ํ•จ

  • ์—๋ฎฌ๋ ˆ์ดํ„ฐ(API, ํ›„ํฌ)์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋” ๋งŽ์€ ์˜ต์…˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋งŒ์กฑํ•œ๋‹ค

  • ๋‹ค๋ฅธ ๊ฒƒ (๋Œ“๊ธ€์— ์ ์–ด์ฃผ์„ธ์š”)

8๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 1๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€