Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

У рамках зустрічі 0x0A DC7831 DEF CON Нижній Новгород 16 лютого ми представили доповідь про базові принципи емуляції бінарного коду та власну розробку — емулятор апаратних платформ Kopycat.

У статті ми наведемо опис запуску прошивки пристрою в емуляторі, продемонструємо взаємодію з налагоджувачем та виконаємо невеликий динамічний аналіз прошивки.

Передісторія

Тривалий рік тому в galaxy far far away

Кілька років тому в нашій лабораторії виникла потреба дослідити прошивку пристрою. Прошивка була стиснута, розпаковувалась bootloader'ом. Робив він це вельми замороченим способом, кілька разів перекладаючи дані у пам'яті. Та й сама прошивка згодом активно взаємодіяла з периферією. І все це на ядрі MIPS.

Наявні емулятори з об'єктивних причин нас не влаштували, а хотілося все-таки запустити код. Тоді вирішили зробити свій емулятор, який зробить мінімум і дозволить розпакувати основну прошивку. Спробували – вийшло. Подумали, а якщо додати периферію, щоб ще й основну прошивку виконувати. Було не дуже боляче – і теж вийшло. Знову подумали та вирішили робити повноцінний емулятор.

У результаті вийшов емулятор обчислювальних систем Kopycat.

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat
Чому Kopycat?

Наявна гра слів.

  1. мавпа (англ., сут. [ˈkɒpɪkæt]) - наслідувач, імітатор
  2. як (англ., сут. [ˈkæt]) - кішка, кіт - улюблена тварина одного із творців проекту
  3. Літера "K" - від мови програмування Kotlin

Kopycat

При створенні емулятора ставилися певні цілі:

  • можливість досить швидко створити нову периферію, модуль, процесорне ядро;
  • можливість зібрати віртуальний пристрій із різних модулів;
  • можливість завантажити на згадку про віртуальний пристрій будь-які двійкові дані (прошивку);
  • можливість роботи із снапшотами (знімки стану системи);
  • можливість взаємодії з емулятором через вбудований налагоджувач;
  • приємна сучасна мова для розробки.

У результаті, для реалізації був обраний Kotlin, шинна архітектура (це коли модулі зв'язуються між собою через віртуальні шини даних), JSON - як формат опису пристрою, і GDB RSP - як протокол взаємодії з відладчиком.

Розробка триває трохи більше двох років і активно продовжується. За цей час було реалізовано процесорні ядра MIPS, x86, V850ES, ARM, PowerPC.

Проект зростає, і настав час уявити його широкому загалу. Детальний опис проекту зробимо пізніше, а зараз зосередимося на використанні Kopycat.

Для найбільш нетерплячих - промо-версію емулятора можна завантажити за посиланням.

Носоріг в емуляторі

Нагадаємо, раніше для конференції SMARTRHINO-2018 було створено тестовий пристрій «Носоріг» для навчання навичкам реверс-інжинірингу. Процес статичного аналізу прошивки був описаний у цієї статті.

Тепер спробуємо додати «динаміки» і запустимо прошивку в емуляторі.

Нам знадобляться:
1) Java 1.8
2) Python та модуль Джеп для використання Python всередині емулятора. WHL-складання модуля 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 у розділі Титули — це ім'я файлу, який можна завантажувати у віртуальний пристрій як прошивку.

Віртуальний пристрій та його взаємодія з основною операційною системою можна уявити ось такою схемою:

Носоріг усередині кота – запускаємо прошивку в емуляторі 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)
  • Порт: 23946

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Тепер стає доступною кнопка запуску налагодження (клавіша F9):

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Натискаємо її - відбувається підключення до модуля відладчика в емуляторі. IDA переходить у режим налагодження, стають доступні додаткові вікна: інформація про регістри, про стек.

Тепер ми можемо використовувати всі стандартні можливості роботи з відладчиком:

  • покрокове виконання інструкцій (Крок у и Переступити - клавіші F7 та F8, відповідно);
  • запуск та призупинення виконання;
  • створення точок зупинки як у код, і на дані (клавіша F2).

Підключення до налагоджувача не означає запуску коду прошивки. Поточною позицією для виконання має бути адреса 0x08006A74 - Початок функції Reset_Handler. Якщо прокрутити листинг нижче, можна побачити виклик функції основний. Можна встановити курсор на цьому рядку (адреса 0x08006ABE) та виконати операцію Run until cursor (Клавіша F4).

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Далі можна натиснути F7, щоб зайти у функцію основний.

Якщо виконати команду Continue process (клавіша F9), то з'явиться вікно "Please wait" з єдиною кнопкою Призупиняти:

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

При натисканні Призупиняти виконання коду прошивки припиняється і може бути продовжено з тієї ж адреси в коді, де було перервано.

Якщо продовжити виконання коду, то в терміналах, підключених до віртуальних 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), то прошивка завжди чекатиме скидання прапора зайнятий, розташованого за адресою 0x200004C4, який показує зайнятість лінії даних DMA:

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Ми можемо обійти таку ситуацію шляхом «ручного» скидання прапора зайнятий відразу після його встановлення. У IDA Pro можна створити Python-функцію та викликати її в breakpoint'і, при цьому сам breakpoint поставити в коді після запису значення 1 у прапор зайнятий.

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

Після цього натискаємо прогін та закриваємо вікно скриптів.

Тепер перейдемо до коду за адресою 0x0800688A, встановимо breakpoint (клавіша F2), відредагуємо його (контекстне меню Edit breakpoint…), не забудемо встановити тип скрипту - Python:

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat
Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Якщо поточне значення прапора зайнятий одно 1, то слід виконати функцію skip_dma у рядку скриптів:

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Якщо запустити прошивку на виконання, то спрацювання коду breakpoint-обробника можна побачити в IDA у вікні Вихід по рядку Skipping wait ws2812.... Тепер прошивка не чекатиме на скидання прапора зайнятий.

Взаємодія з емулятором

Емуляція заради емуляції навряд чи викличе захоплення та радість. Набагато цікавіше, якщо емулятор допоможе досліднику побачити дані в пам'яті або встановити взаємодію потоків.

Покажемо, як у динаміці встановити взаємодію 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 symbols;
  • додати команду запуску: set $pc = *0x08000004 (Виставити в регістр PC значення з пам'яті за адресою 0x08000004 - там зберігається адреса ResetHandler'а).

Зверніть увагуЯкщо ви не хочете завантажувати файл прошивки з Eclipse, то параметри Завантажити зображення и Виконати команди вказувати не потрібно.

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Після натискання Debug можна працювати в режимі налагодження:

  • покрокове виконання коду
    Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat
  • взаємодія з точками зупинки
    Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Примітка. У Eclipse є, хмм… деякі особливості… і з ними доводиться жити. Ось, наприклад, якщо при запуску відладчика з'явиться повідомлення "No source available for "0x0"", виконайте команду Step (F5)

Носоріг усередині кота – запускаємо прошивку в емуляторі Kopycat

Замість висновку

Емуляція нативного коду – справа дуже цікава. Для розробника пристроїв з'являється можливість налагоджувати прошивку без реального пристрою. Для дослідника можливість проводити динамічний аналіз коду, що не завжди можливо навіть за наявності пристрою.

Ми хочемо надати спеціалістам інструмент, який був би зручний, в міру простий і не забирав багато сил та часу на своє налаштування та запуск.

Напишіть у коментарях про свій досвід використання апаратних емуляторів. Запрошуємо до обговорення та будемо раді відповісти на запитання.

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

Навіщо Ви використовуєте емулятор?

  • розробляю (налагоджую) прошивки

  • досліджую прошивки

  • запускаю ігри (Dendi, Sega, PSP)

  • щось інше (напишіть у коментарі)

Проголосували 7 користувачів. Утрималися 2 користувача.

Який програмний засіб Ви використовуєте для емуляції нативного коду?

  • QEMU

  • Unicorn engine

  • Протей

  • щось інше (напишіть у коментарі)

Проголосували 6 користувачів. Утрималися 2 користувача.

Що б Вам хотілося поліпшити в емуляторі?

  • хочеться швидкості

  • хочеться зручності налаштування/запуску

  • хочеться більше можливостей взаємодії з емулятором (API, хуки)

  • мене все влаштовує

  • щось інше (напишіть у коментарі)

Проголосували 8 користувачів. Утримався 1 користувач.

Джерело: habr.com

Додати коментар або відгук