Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° β€” запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… встрСчи 0x0A DC7831 DEF CON НиТний Новгород 16 фСвраля ΠΌΡ‹ прСдставили Π΄ΠΎΠΊΠ»Π°Π΄ ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… эмуляции Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ собствСнной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ β€” эмуляторС Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Kopycat.

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ описаниС запуска ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ устройства Π² эмуляторС, продСмонстрируСм взаимодСйствиС с ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ нСбольшой динамичСский Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ.

ΠŸΡ€Π΅Π΄Ρ‹ΡΡ‚ΠΎΡ€ΠΈΡ

A long time ago in a galaxy far far away

ΠŸΠ°Ρ€Ρƒ Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄ Π² нашСй Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ устройства. ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° Π±Ρ‹Π»Π° сТата, Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π»Π°ΡΡŒ bootloader’ΠΎΠΌ. Π”Π΅Π»Π°Π» ΠΎΠ½ это вСсьма Π·Π°ΠΌΠΎΡ€ΠΎΡ‡Π΅Π½Π½Ρ‹ΠΌ способом, нСсколько Ρ€Π°Π· пСрСкладывая Π΄Π°Π½Π½Ρ‹Π΅ Π² памяти. Π”Π° ΠΈ сама ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΌ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ взаимодСйствовала с ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠ΅ΠΉ. И всё это Π½Π° ядрС MIPS.

Π˜ΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ эмуляторы ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ нас Π½Π΅ устроили, Π° Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ всё-Ρ‚Π°ΠΊΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄. Π’ΠΎΠ³Π΄Π° Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свой эмулятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сдСлаСт ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. ΠŸΠΎΠ΄ΡƒΠΌΠ°Π»ΠΈ, Π° Ρ‡Ρ‚ΠΎ Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‰Π΅ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ. Π‘Ρ‹Π»ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ больно β€” ΠΈ Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. Π‘Π½ΠΎΠ²Π° ΠΏΠΎΠ΄ΡƒΠΌΠ°Π»ΠΈ ΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ эмулятор.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ получился эмулятор Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм Kopycat.

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat
ΠŸΠΎΡ‡Π΅ΠΌΡƒ Kopycat?

Π˜ΠΌΠ΅Π΅Ρ‚ мСсто ΠΈΠ³Ρ€Π° слов.

  1. copycat (Π°Π½Π³Π»., сущ. [ˈkΙ’pΙͺkΓ¦t]) β€” ΠΏΠΎΠ΄Ρ€Π°ΠΆΠ°Ρ‚Π΅Π»ΡŒ, ΠΈΠΌΠΈΡ‚Π°Ρ‚ΠΎΡ€
  2. cat (Π°Π½Π³Π»., сущ. [ˈkΓ¦t]) β€” кошка, ΠΊΠΎΡ‚ β€” любимоС ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· создатСлСй ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
  3. Π‘ΡƒΠΊΠ²Π° «K» β€” ΠΎΡ‚ языка программирования Kotlin

Kopycat

ΠŸΡ€ΠΈ создании эмулятора ΡΡ‚Π°Π²ΠΈΠ»ΠΈΡΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Ρ†Π΅Π»ΠΈ:

  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ достаточно быстро ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΡŽ, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, процСссорноС ядро;
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ устройство ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ;
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ устройства Π»ΡŽΠ±Ρ‹Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ);
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со ΡΠ½Π°ΠΏΡˆΠΎΡ‚Π°ΠΌΠΈ (снимки состояния систСмы);
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ взаимодСйствия с эмулятором Ρ‡Π΅Ρ€Π΅Π· встроСнный ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ;
  • приятный соврСмСнный язык для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅, для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ Kotlin, шинная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° (это ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Ρ‡Π΅Ρ€Π΅Π· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡˆΠΈΠ½Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…), JSON β€” Π² качСствС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° описания устройства, ΠΈ GDB RSP β€” Π² качСствС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° взаимодСйствия с ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ΄Ρ‘Ρ‚ Π½Π° протяТСнии Ρ‡ΡƒΡ‚ΡŒ большС Π΄Π²ΡƒΡ… Π»Π΅Ρ‚ ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ продолТаСтся. Π—Π° это врСмя Π±Ρ‹Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ процСссорныС ядра MIPS, x86, V850ES, ARM, PowerPC.

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ растСт, ΠΈ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΉ общСствСнности. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° сдСлаСм ΠΏΠΎΠ·ΠΆΠ΅, Π° сСйчас сосрСдоточимся Π½Π° использовании Kopycat.

Для самых Π½Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π»ΠΈΠ²Ρ‹Ρ… β€” ΠΏΡ€ΠΎΠΌΠΎ-Π²Π΅Ρ€ΡΠΈΡŽ эмулятора ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎ ссылкС.

Носорог Π² эмуляторС

Напомним, Ρ€Π°Π½Π΅Π΅ для ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ SMARTRHINO-2018 Π±Ρ‹Π»ΠΎ создано тСстовоС устройство «ΠΠΎΡΠΎΡ€ΠΎΠ³» для обучСния Π½Π°Π²Ρ‹ΠΊΠ°ΠΌ рСвСрс-ΠΈΠ½ΠΆΠΈΠ½ΠΈΡ€ΠΈΠ½Π³Π°. ΠŸΡ€ΠΎΡ†Π΅ΡΡ статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Π±Ρ‹Π» описан Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ «Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠΈ» ΠΈ запустим ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС.

Нам понадобятся:
1) Java 1.8
2) Python ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Jep для использования Python Π²Π½ΡƒΡ‚Ρ€ΠΈ эмулятора. WHL-cΠ±ΠΎΡ€ΠΊΡƒ модуля Jep ΠΏΠΎΠ΄ Windows ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Ρ‚ΡƒΡ‚.

Для Windows:
1) com0com
2) PuTTY

Для Linux:
1) socat

Π’ качСствС GDB-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Eclipse, IDA Pro ΠΈΠ»ΠΈ radare2.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ «ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ» Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ устройство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт собой Π°Π½Π°Π»ΠΎΠ³ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ устройства.

РСальноС устройство («Π½ΠΎΡΠΎΡ€ΠΎΠ³») ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° структурной схСмС:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС 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"]
  ]
}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ firmware Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ params β€” это имя Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ устройство Π² качСствС ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ устройство ΠΈ Π΅Π³ΠΎ взаимодСйствиС с основной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ схСмой:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ тСстовый экзСмпляр эмулятора ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ взаимодСйствиС с COM-ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ основной ОБ (ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ UART ΠΈ UART для Bluetooth-модуля). Π­Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ€Ρ‚Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ устройства ΠΈΠ»ΠΈ ΠΆΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ COM-ΠΏΠΎΡ€Ρ‚Ρ‹ (для этого ΠΊΠ°ΠΊ Ρ€Π°Π· Π½ΡƒΠΆΠ΅Π½ com0com / socat).

Для взаимодСйствия с эмулятором ΠΈΠ·Π²Π½Π΅ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сущСствуСт Π΄Π²Π° основных способа:

  • ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» GDB RSP (соотвСтствСнно, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ этот ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», инструмСнты β€” Eclipse / IDA / radare2);
  • внутрСнняя командная строка эмулятора (Argparse ΠΈΠ»ΠΈ Python).

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ COM-ΠΏΠΎΡ€Ρ‚Ρ‹

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с UART-ΠΎΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ устройства Π½Π° локальной машинС Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ связанных Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… COM-ΠΏΠΎΡ€Ρ‚ΠΎΠ². Π’ нашСм случаС ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ€Ρ‚ задСйствуСт эмулятор, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» (PuTTY ΠΈΠ»ΠΈ screen):

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

ИспользованиС com0com

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ COM-ΠΏΠΎΡ€Ρ‚Ρ‹ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ setup-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ ΠΈΠ· ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π° com0com (консольная вСрсия β€” C:Program Files (x86)com0comsetupс.exe, ΠΈΠ»ΠΈ GUI-вСрсия β€” C:Program Files (x86)com0comsetupg.exe):

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΠΈ enable buffer overrun для всСх созданных Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΈΠ½Π°Ρ‡Π΅ эмулятор Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΎΡ‚ COM-ΠΏΠΎΡ€Ρ‚Π°.

ИспользованиС socat

На UNIX-систСмах Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ COM-ΠΏΠΎΡ€Ρ‚Ρ‹ автоматичСски ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ эмулятором ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ socat, для этого достаточно ΠΏΡ€ΠΈ запускС эмулятора Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΡ€Ρ‚Π° ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ прСфикс socat:.

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки (Argparse ΠΈΠ»ΠΈ Python)

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Kopycat прСдставляСт собой консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, для взаимодСйствия со своими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ эмулятор прСдоставляСт Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° интСрфСйса ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: Argparse ΠΈ Python.

Argparse β€” это CLI, встроСнный Π² Kopycat, ΠΎΠ½ доступСн всСгда ΠΈ всСм.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ CLI β€” ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python. Для Π΅Π³ΠΎ использования Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Python-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Jep ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ эмулятор для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Python (Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python, установлСнный Π² основной систСмС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ).

Установка Python-модуля Jep

Под Linux Jep ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн Ρ‡Π΅Ρ€Π΅Π· pip:

pip install jep

Для установки Jep ΠΏΠΎΠ΄ Windows Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Windows SDK ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Microsoft Visual Studio. ΠœΡ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ упростили Π²Π°ΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈ сдСлали WHL-сборки JEP ΠΏΠΎΠ΄ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ вСрсии Python для Windows, поэтому ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°:

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.

Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ эмулятора для вашСй систСмы (kopycat.bat β€” для Windows, kopycat β€” для 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

Команда для запуска ΠΏΠΎΠ΄ Linux с использованиСм ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ 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

Π’ качСствС исходного Ρ„Π°ΠΉΠ»Π° для Π°Π½Π°Π»ΠΈΠ·Π° Π² IDA для упрощСния тСстирования ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ «Носорога» Π² Π²ΠΈΠ΄Π΅ ELF-Ρ„Π°ΠΉΠ»Π° (Ρ‚Π°ΠΌ сохранСна мСтаинформация).

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π±Π΅Π· ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

ПослС запуска Kopycat Π² IDA Pro Π² мСню Debugger ΠΈΠ΄Ρ‘ΠΌ Π² ΠΏΡƒΠ½ΠΊΡ‚ «Switch debugger…» ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ «Remote GDB debugger«. Π”Π°Π»Π΅Π΅ настраиваСм ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: мСню Debugger β€” Process options…

УстанавливаСм значСния:

  • Application β€” любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
  • Hostname: 127.0.0.1 (ΠΈΠ»ΠΈ IP-адрСс ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π³Π΄Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Kopycat)
  • Port: 23946

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Π’Π΅ΠΏΠ΅Ρ€ΡŒ становится доступна ΠΊΠ½ΠΎΠΏΠΊΠ° запуска ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ (клавиша F9):

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

НаТимаСм Π΅Ρ‘ β€” происходит ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π² эмуляторС. IDA ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, становятся доступны Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΊΠ½Π°: информация ΠΎ рСгистрах, ΠΎ стСкС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС стандартныС возмоТности Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ:

  • пошаговоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ инструкций (Step into ΠΈ Step over β€” клавиши F7 ΠΈ F8, соотвСтствСнно);
  • запуск ΠΈ приостановка выполнСния;
  • созданиС Ρ‚ΠΎΡ‡Π΅ΠΊ останова ΠΊΠ°ΠΊ Π½Π° ΠΊΠΎΠ΄, Ρ‚Π°ΠΊ ΠΈ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅ (клавиша F2).

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΡƒ Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ запуска ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ. Π’Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ для выполнСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ адрСс 0x08006A74 β€” Π½Π°Ρ‡Π°Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Reset_Handler. Если ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ листинг Π½ΠΈΠΆΠ΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main. МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ курсор Π½Π° этой строкС (адрСс 0x08006ABE) ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Run until cursor (клавиша F4).

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Π”Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ F7, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΉΡ‚ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main.

Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Continue process (клавиша F9), Ρ‚ΠΎ появится ΠΎΠΊΠ½ΠΎ «Please wait» с СдинствСнной ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Suspend:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Suspend Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ приостанавливаСтся ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΎ с Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ адрСса Π² ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Ρ€Π²Π°Π½ΠΎ.

Если ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Ρ‚ΠΎ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ…, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ COM-ΠΏΠΎΡ€Ρ‚Π°ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

НаличиС строки «state bypass» Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Bluetooth-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΠ΅Ρ€Π΅ΡˆΡ‘Π» Π² Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΈΡ‘ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ COM-ΠΏΠΎΡ€Ρ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Bluetooth-Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ (Π½Π° рисункС β€” COM29) ΠΌΠΎΠΆΠ½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² соотвСтствии с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ «ΠΠΎΡΠΎΡ€ΠΎΠ³Π°». НапримСр, Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ «MEOW» Π² Bluetooth-Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» вСрнётся строка «mur-mur»:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Π­ΠΌΡƒΠ»ΠΈΡ€ΡƒΠΉ мСня Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ

ΠŸΡ€ΠΈ построСнии эмулятора ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ/эмуляции Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ устройства. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Bluetooth ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ:

  • эмулируСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ устройство с ΠΏΠΎΠ»Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄;
  • ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ AT-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π° ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… принимаСтся с COM-ΠΏΠΎΡ€Ρ‚Π° основной систСмы;
  • Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ устройство обСспСчиваСт ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ устройство;
  • Π² Π²ΠΈΠ΄Π΅ простой Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ, которая всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ «OK».

Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии эмулятора ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ β€” Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Bluetooth-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ выполняСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, послС Ρ‡Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ «ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ» Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· COM-ΠΏΠΎΡ€Ρ‚Π° основной систСмы Π² UART-ΠΏΠΎΡ€Ρ‚ эмулятора.

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Рассмотрим Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ простой инструмСнтации ΠΊΠΎΠ΄Π° Π² случаС, Ссли Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° какая-Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΈ. НапримСр, Ссли Π½Π΅ создан Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² DMA (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° выполняСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ws2812b_wait, располоТСнной ΠΏΠΎ адрСсу 0x08006840), Ρ‚ΠΎ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ всСгда ΠΆΠ΄Π°Ρ‚ΡŒ сброса Ρ„Π»Π°Π³Π° busy, располоТСнного ΠΏΠΎ адрСсу 0x200004C4, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π·Π°Π½ΡΡ‚ΠΎΡΡ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… DMA:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΏΡƒΡ‚Ρ‘ΠΌ «Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ» сброса Ρ„Π»Π°Π³Π° busy сразу послС Π΅Π³ΠΎ установки. Π’ IDA Pro ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Python-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‘ Π² breakpoint’Π΅, ΠΏΡ€ΠΈ этом сам breakpoint ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ послС записи значСния 1 Π²ΠΎ Ρ„Π»Π°Π³ busy.

Breakpoint-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ

Π‘Π½Π°Ρ‡Π°Π»Π° создадим Python-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² IDA. МСню File β€” Script command…

ДобавляСм Π½ΠΎΠ²Ρ‹ΠΉ сниппСт Π² спискС слСва, Π΄Π°Ρ‘ΠΌ Π΅ΠΌΡƒ имя (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, BPT),
Π² тСкстовом ΠΏΠΎΠ»Π΅ справа Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

def skip_dma():
    print "Skipping wait ws2812..."
    value = Byte(0x200004C4)
    if value == 1:
        PatchDbgByte(0x200004C4, 0)
return False

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

ПослС этого Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Run ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ скриптов.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ Π² ΠΊΠΎΠ΄ ΠΏΠΎ адрСсу 0x0800688A, установим breakpoint (клавиша F2), ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ (контСкстноС мСню Edit breakpoint…), Π½Π΅ Π·Π°Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ скрипта – Python:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat
Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Если Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° busy Ρ€Π°Π²Π½ΠΎ 1, Ρ‚ΠΎ слСдуСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ skip_dma Π² строкС скриптов:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ срабатываниС ΠΊΠΎΠ΄Π° breakpoint-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² IDA Π² ΠΎΠΊΠ½Π΅ Output ΠΏΠΎ строкС Skipping wait ws2812.... Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ сброс Ρ„Π»Π°Π³Π° busy.

ВзаимодСйствиС с эмулятором

Эмуляция Ρ€Π°Π΄ΠΈ эмуляции вряд Π»ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ восторг ΠΈ Ρ€Π°Π΄ΠΎΡΡ‚ΡŒ. Π“ΠΎΡ€Π°Π·Π΄ΠΎ интСрСснСС, Ссли эмулятор ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² памяти ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ взаимодСйствиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

ПокаТСм, ΠΊΠ°ΠΊ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ взаимодСйствиС RTOS-тасков. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слСдуСт ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Ссли ΠΎΠ½ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ. Если ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bluetooth_task_entry Π² Π²Π΅Ρ‚ΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ «LED » (адрСс 0x080057B8), Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сначала создаСтся, Π° ΠΏΠΎΡ‚ΠΎΠΌ отправляСтся Π² ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ledControlQueueHandle Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сообщСниС.

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ breakpoint Π½Π° ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ledControlQueueHandle, располоТСнной ΠΏΠΎ адрСсу 0x20000624 ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ сначала ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ останов ΠΏΠΎ адрСсу 0x080057CA ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ osMailAlloc, Π΄Π°Π»Π΅Π΅ β€” ΠΏΠΎ адрСсу 0x08005806 ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ osMailPut, ΠΏΠΎΡ‚ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя β€” ΠΏΠΎ адрСсу 0x08005BD4 (ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ osMailGet), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ leds_task_entry (LED-таск), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ тасков, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» LED-таск.

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС 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-сСрвСром ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ памяти, ΠΈΠ·-Π·Π° этого Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ останова ΠΈ Step’Ρ‹ (ΠΊΠΎΠΌΠ°Π½Π΄Π° ds). НадССмся, Π² блиТайшСС врСмя это Π±ΡƒΠ΄Π΅Ρ‚ исправлСно.

Запуск с Eclipse

Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования эмулятора β€” ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ устройства. Для наглядности Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ «Носорога». Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ исходники ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΡŽΠ΄Π°.

Π’ качСствС IDE Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Eclipse ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° System Workbench for STM32.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² эмулятор Π·Π°Π³Ρ€ΡƒΠΆΠ°Π»Π°ΡΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° нСпосрСдствСнно собранная Π² Eclipse, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ firmware=null Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ запуска эмулятора:

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

Настройка debug-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Π’ Eclipse Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ мСню Run β€” Debug Configurations… Π’ ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΌΡΡ ΠΎΠΊΠ½Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ GDB Hardware Debugging Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, послС Ρ‡Π΅Π³ΠΎ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ «Main» ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ «Debugger» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ GDB-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:
${openstm32_compiler_path}arm-none-eabi-gdb

А Ρ‚Π°ΠΊΠΆΠ΅ ввСсти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ GDB-сСрвСру (хост ΠΈ ΠΏΠΎΡ€Ρ‚):

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ «Startup» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Load image (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π² эмулятор собранного ΠΎΠ±Ρ€Π°Π·Π° ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ);
  • Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Load symbols;
  • Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ запуска: set $pc = *0x08000004 (Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² рСгистр PC Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· памяти ΠΏΠΎ адрСсу 0x08000004 β€” Ρ‚Π°ΠΌ хранится адрСс ResetHandler’Π°).

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ссли Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΠΈΠ· Eclipse, Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Load image ΠΈ Run commands ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

ПослС наТатия Debug ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°:

  • пошаговоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°
    Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat
  • взаимодСйствиС с Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ останова
    Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π’ Eclipse Π΅ΡΡ‚ΡŒ, хмм… Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнности… ΠΈ с Π½ΠΈΠΌΠΈ приходится ΠΆΠΈΡ‚ΡŒ. Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли ΠΏΡ€ΠΈ запускС ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° появится сообщСниС «No source available for «0x0″», Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Step (F5)

Носорог Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚Π° — запускаСм ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² эмуляторС Kopycat

ВмСсто Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Эмуляция Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° β€” Π΄Π΅Π»ΠΎ вСсьма интСрСсноС. Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° устройств появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π±Π΅Π· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ устройства. Для исслСдоватСля β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ динамичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ Π½Π΅ всСгда Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ устройства.

ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ спСциалистам инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π΅Π½, Π² ΠΌΠ΅Ρ€Ρƒ прост ΠΈ Π½Π΅ ΠΎΡ‚Π½ΠΈΠΌΠ°Π» ΠΌΠ½ΠΎΠ³ΠΎ сил ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° свою настройку ΠΈ запуск.

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях ΠΎ своём ΠΎΠΏΡ‹Ρ‚Π΅ использования Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… эмуляторов. ΠŸΡ€ΠΈΠ³Π»Π°ΡˆΠ°Π΅ΠΌ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π΄Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопросы.

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

Для Ρ‡Π΅Π³ΠΎ Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ эмулятор?

  • Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽ (ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°ΡŽ) ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ

  • ΠΈΡΡΠ»Π΅Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ

  • Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ ΠΈΠ³Ρ€Ρ‹ (Dendi, Sega, PSP)

  • Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ (Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ)

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 7 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ 2 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Какой софт Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ для эмуляции Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°?

  • QEMU

  • Unicorn engine

  • Proteus

  • Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ (Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ)

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 6 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ 2 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π§Ρ‚ΠΎ Π±Ρ‹ Π’Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌ эмуляторС?

  • хочСтся скорости

  • хочСтся удобства настройки/запуска

  • хочСтся большС возмоТностСй взаимодСйствия с эмулятором (API, Ρ…ΡƒΠΊΠΈ)

  • мСня всё устраиваСт

  • Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ (Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ)

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 8 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. ВоздСрТался 1 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ