Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Njengenxalenye yentlanganiso 0x0A DC7831 DEF Con Nizhny Novgorod Ngomhla we-16 kaFebruwari, sinike ingxelo malunga nemigaqo esisiseko yokulinganisa ikhowudi yokubini kunye nophuhliso lwethu - i-platform ye-hardware emulator. Kopycat.

Kweli nqaku siza kuchaza indlela yokusebenzisa i-firmware yesixhobo kwi-emulator, bonisa ukusebenzisana ne-debugger, kwaye wenze uhlalutyo oluncinci lwe-firmware.

ukubuzwa

Kudala kumnyele kude lee

Kwiminyaka embalwa edlulileyo kwilabhoratri yethu bekukho isidingo sokuphanda i-firmware yesixhobo. I-firmware yayicinezelekile kwaye ikhutshwe nge-bootloader. Wenza oku ngendlela entsonkothileyo kakhulu, etshintsha idatha kwimemori izihlandlo ezininzi. Kwaye i-firmware ngokwayo emva koko isebenzisana ngokusebenzayo kunye neeperipherals. Kwaye konke oku kungundoqo we-MIPS.

Ngezizathu zenjongo, ii-emulators ezikhoyo azizange zisifanelane, kodwa besisafuna ukuqhuba ikhowudi. Emva koko sagqiba ekubeni senze i-emulator yethu, eya kwenza ubuncinane kwaye isivumele ukuba sikhuphe i-firmware ephambili. Sayizama kwaye yasebenza. Siye sacinga, kuthekani ukuba songeza iiperipherals ukwenza i-firmware ephambili. Akuzange kube buhlungu kakhulu - kwaye kwasebenza kwakhona. Saphinda sacinga kwaye sagqiba ekubeni senze i-emulator epheleleyo.

Isiphumo yaba sisilinganisi seenkqubo zekhompyutha Kopycat.

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat
Kutheni iKopycat?

Kukho umdlalo wamagama.

  1. copycat (IsiNgesi, noun [ˈkɒpɪkæt]) - ukulinganisa, ukulinganisa
  2. cat (англ., сущ. [ˈkæt]) — кошка, кот — любимое животное одного из создателей проекта
  3. Unobumba "K" uvela kulwimi lweprogram yeKotlin

Kopycat

При создании эмулятора ставились совершенно определённые цели:

  • ukukwazi ukwenza ngokukhawuleza iiperipherals ezintsha, iimodyuli, iiprosesa eziphambili;
  • возможность собрать виртуальное устройство из различных модулей;
  • ukukwazi ukulayisha nayiphi na idatha yokubini (i-firmware) kwinkumbulo yesixhobo esibonakalayo;
  • ukukwazi ukusebenza nge-snapshots (i-snapshots ye-system state);
  • возможность взаимодействия с эмулятором через встроенный отладчик;
  • приятный современный язык для разработки.

В итоге, для реализации был выбран Kotlin, шинная архитектура (это когда модули связываются между собой через виртуальные шины данных), JSON — в качестве формата описания устройства, и GDB RSP — в качестве протокола взаимодействия с отладчиком.

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

Iprojekthi iyakhula kwaye lixesha lokuyibonisa kuluntu ngokubanzi. Siza kwenza inkcazo ecacileyo yeprojekthi kamva, kodwa ngoku siza kugxila ekusebenziseni i-Kopycat.

Для самых нетерпеливых — промо-версию эмулятора можно скачать по unxibelelwano.

URhino kwi-emulator

Masikhumbule ukuba ngaphambili kwinkomfa ye-SMARTRHINO-2018, isixhobo sokuvavanya "i-Rhinoceros" senzelwe ukufundisa izakhono zobunjineli be-reverse. Inkqubo yohlalutyo lwe-static firmware yachazwa kwi eli nqaku.

Ngoku makhe sizame ukongeza "izithethi" kwaye siqhube i-firmware kwi-emulator.

Siza kudinga:
1) Java 1.8
2) Python и модуль jep для использования Python внутри эмулятора. WHL-cборку модуля Jep под Windows можно Khuphela apha.

ZeWindows:
1) com0com
2) I-PuTTY

KwiLinux:
1) socat

В качестве GDB-клиента можно использовать Eclipse, IDA Pro или radare2.

Isebenza njani?

Для того, чтобы выполнять прошивку в эмуляторе, необходимо «собрать» виртуальное устройство, которое представляет собой аналог реального устройства.

Isixhobo sokwenyani (“umkhombe”) sinokuboniswa kumzobo webhloko:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

I-emulator inesakhiwo semodyuli kwaye isixhobo sokugqibela senyani sinokuchazwa kwifayile ye-JSON.

JSON 105 imigca

{
  "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"]
  ]
}

Nika ingqalelo kwiparameter firmware kwicandelo iiparameter — это имя файла, который можно загружать в виртуальное устройство в качестве прошивки.

Isixhobo esinenyani kunye nokusebenzisana kwayo neyona nkqubo iphambili yokusebenza inokumelwa ngulo mzobo ulandelayo:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Текущий тестовый экземпляр эмулятора подразумевает взаимодействие с COM-портами основной ОС (отладочный UART и UART для Bluetooth-модуля). Это могут быть реальные порты, к которым подключены устройства или же виртуальные COM-порты (для этого как раз нужен com0com/socat).

Kukho iindlela ezimbini eziphambili zokunxibelelana ne-emulator ngaphandle:

  • Iprothokholi ye-GDB RSP (ngokuhambelanayo, izixhobo ezixhasa le protocol yi-Eclipse / IDA / radare2);
  • umgca womyalelo we-emulator yangaphakathi (Argparse okanye iPython).

Виртуальные COM-порты

Ukuze usebenzisane ne-UART yesixhobo senyani kumatshini wendawo ngokusebenzisa i-terminal, kufuneka udale iperi ye-COM izibuko ezihambelanayo. Kwimeko yethu, enye izibuko isetyenziswa ngumlinganisi, kwaye eyesibini yinkqubo yesiphelo (i-PuTTY okanye isikrini):

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

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

Виртуальные COM-порты настраиваются setup-утилитой из комплекта com0com (консольная версия — C:Program Files (x86)com0comsetupс.exe, или GUI-версия — C: Iifayile zeNkqubo (x86) com0comsetupg.exe):

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Khangela iibhokisi enable buffer overrun kuwo onke amazibuko enziweyo, kungenjalo i-emulator iya kulinda impendulo evela kwizibuko le-COM.

Ukusebenzisa i-socat

Kwiinkqubo ze-UNIX, izibuko ze-COM zenyani zenziwe ngokuzenzekelayo ngumlinganisi usebenzisa into eluncedo ye-socat ukwenza oku, khankanya nje isimaphambili segama lezibuko xa uqalisa umlinganisi socat:.

Ujongano lomgca womyalelo wangaphakathi (Argparse okanye iPython)

Ekubeni i-Kopycat sisicelo se-console, i-emulator ibonelela ngeendlela ezimbini zokujonga umgca womyalelo wokusebenzisana kunye nezinto zayo kunye nezinto eziguquguqukayo: i-Argparse kunye nePython.

Argparse — это CLI, встроенный в Kopycat, он доступен всегда и всем.

Альтернативный CLI — интерпретатор Python. Для его использования необходимо установить Python-модуль Jep и настроить эмулятор для работы с Python (будет использоваться интерпретатор Python, установленный в основной системе пользователя).

Ukufakela imodyuli yePython iJep

Ngaphantsi kweLinux Jep inokufakwa ngepip:

pip install jep

Для установки Jep под Windows необходимо предварительно установить Windows SDK и соответствующую Microsoft Visual Studio. Мы немного упростили вам задачу и сделали I-WHL iyakha I-JEP yeenguqulelo zangoku zePython yeWindows, ngoko ke imodyuli inokufakwa kwifayile:

pip install jep-3.8.2-cp27-cp27m-win_amd64.whl

Ukujonga ukufakwa kweJep, kufuneka usebenze kumgca womyalelo:

python -c "import jep"

Lo myalezo ulandelayo kufuneka ufunyenwe njengempendulo:

ImportError: Jep is not supported in standalone Python, it must be embedded in Java.

Kwifayile yebhetshi yomlinganisi wenkqubo yakho (kopycat.bat -yeWindows, ikopicat — для Linux) к списку параметров DEFAULT_JVM_OPTS добавьте дополнительный параметр Djava.library.path — kufuneka iqulathe indlela eya kwimodyuli yeJep efakiweyo.

Isiphumo seWindows kufuneka sibe ngumgca onje:

set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"

Ukuphehlelela iKopycat

Эмулятор представляет собой консольное JVM-приложение. Запуск осуществляется через сценарий командной строки операционной системы (sh/cmd).

Umyalelo wokuqhuba phantsi kweWindows:

binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28

Umyalelo wokuqhuba phantsi kweLinux usebenzisa i-socat utility:

./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 — Izibuko leTCP eliza kuvulelwa ukufikelela kwiseva ye-GDB;
  • -n rhino — igama lemodyuli yenkqubo engundoqo (isixhobo esidityanisiweyo);
  • -l user — igama lethala leencwadi lokukhangela eyona modyuli iphambili;
  • -y library — путь для поиска модулей, входящих в устройство;
  • firmwarerhino_pass.bin — путь к файлу прошивки;
  • COM26 и COM28 — виртуальные COM-порты.

Ngenxa yoko, i-prompt iya kuboniswa Python > (okanye 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 >

Ukusebenzisana ne-IDA Pro

Ukwenza lula uvavanyo, sisebenzisa iRhino firmware njengefayile yomthombo wohlalutyo kwi-IDA kwifom ELF-файла (там сохранена метаинформация).

Ungasebenzisa kwakhona i-firmware ephambili ngaphandle kolwazi lwemeta.

После запуска Kopycat в IDA Pro в меню Debugger идём в пункт «Tshintsha idebugger..."kwaye ukhethe"Idebugger ye-GDB ekude«. Далее настраиваем подключение: меню Debugger — Process options…

Seta amaxabiso:

  • Isicelo - naliphi na ixabiso
  • Hostname: 127.0.0.1 (или IP-адрес удаленной машины, где запущен Kopycat)
  • Port: 23946

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Ngoku iqhosha lokulungisa liyafumaneka (iqhosha le-F9):

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Cofa kuyo ukudibanisa kwimodyuli yedebugger kumlinganisi. I-IDA iya kwimodi yokuguqula, iifestile ezongezelelweyo zifumaneka: ulwazi malunga neerejista, malunga ne-stack.

Ngoku sinokusebenzisa zonke iimpawu eziqhelekileyo ze-debugger:

  • ukuphunyezwa kwenyathelo ngenyathelo lemiyalelo (Ngena kwi и Nyathela ngapha - izitshixo ze-F7 kunye ne-F8, ngokulandelanayo);
  • ukuqala kunye nokunqumamisa ukwenza;
  • ukudala iindawo zokuqhawula zombini ikhowudi kunye nedatha (iqhosha leF2).

Ukuqhagamshela kwi-debugger akuthethi ukuqhuba ikhowudi ye-firmware. Indawo yangoku yokuphumeza kufuneka ibe yidilesi 0x08006A74 — начало функции Reset_Handler. Ukuba uskrolela ezantsi kuluhlu, unokubona umsebenzi wokufowuna eyona. Ungabeka ikhesa kulo mgca (idilesi 0x08006ABE) kwaye wenze utyando Baleka de ikhesa (isitshixo F4).

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Далее можно нажать F7, чтобы зайти в функцию eyona.

Если выполнить команду Qhubeka nenkqubo (клавиша F9), то появится окно «Please wait» с единственной кнопкой Suspend:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Xa ucofa Suspend выполнение кода прошивки приостанавливается и может быть продолжено с того же адреса в коде, где было прервано.

Если продолжить выполнение кода, то в терминалах, подключенных к виртуальным COM-портам, можно увидеть следующие строки:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Ubukho bomgca we "state bypass" bubonisa ukuba imodyuli yeBluetooth ebonakalayo itshintshele kwindlela yokufumana idatha kwi-port ye-COM yomsebenzisi.

Теперь в Bluetooth-терминале (на рисунке — COM29) можно вводить команды в соответствии с протоколом «Носорога». Например, на команду «MEOW» в Bluetooth-терминал вернётся строка «mur-mur»:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Эмулируй меня не полностью

Xa usakha i-emulator, unokukhetha inqanaba leenkcukacha / ukulinganisa kwesixhobo esithile. Umzekelo, imodyuli yeBluetooth inokulinganisa ngeendlela ezahlukeneyo:

  • isixhobo senziwa ngokupheleleyo kunye neseti epheleleyo yemiyalelo;
  • эмулируются AT-команды, а поток данных принимается с COM-порта основной системы;
  • isixhobo senyani sinika ulwalathiso olupheleleyo lwedatha kwisixhobo sokwenyani;
  • njenge stub elula ehlala ibuyisela "Kulungile".

Inguqulo yangoku ye-emulator isebenzisa indlela yesibini - imodyuli yeBluetooth ebonakalayo yenza ulungelelwaniso, emva koko itshintshela kwimo yedatha "yeproxy" ukusuka kwi-COM port yenkqubo ephambili kwi-port ye-UART ye-emulator.

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Рассмотрим возможность простой инструментации кода в случае, если не реализована какая-то часть периферии. Например, если не создан таймер, отвечающий за контроль передачи данных в DMA (проверка выполняется в функции ws2812b_wait, raspolojennoy po adresu 0x08006840), то прошивка будет всегда ждать сброса флага ndixakekile, расположенного по адресу 0x200004C4, который показывает занятость линии данных DMA:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Мы можем обойти такую ситуацию путём «ручного» сброса флага ndixakekile сразу после его установки. В IDA Pro можно создать Python-функцию и вызывать её в breakpoint’е, при этом сам breakpoint поставить в коде после записи значения 1 во флаг ndixakekile.

Umphathi webreakpoint

Сначала создадим Python-функцию в IDA. Меню Ifayile- Umyalelo wescript...

Добавляем новый сниппет в списке слева, даём ему имя (например, I-BPT),
Kwindawo yokubhaliweyo ngasekunene, ngenisa ikhowudi yokusebenza:

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

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

После этого нажимаем Run kwaye uvale ifestile yeskripthi.

Ngoku masiye kwikhowudi ethi 0x0800688A, установим breakpoint (клавиша F2), отредактируем его (контекстное меню Hlela indawo yokwahlukana...), ungalibali ukuseta uhlobo lweskripthi kwiPython:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat
Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Ukuba ixabiso leflegi yangoku ndixakekile ilingana no 1, ngoko kufuneka uphumeze umsebenzi tsiba_dma kumgca wescript:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Ukuba usebenzisa i-firmware ukwenzela uphumezo, ngoko ukuxhokonxa kwekhowudi yomphathi webreakpoint kunokubonwa kwi IDA window. imveliso ngomgca Skipping wait ws2812.... Ngoku i-firmware ayiyi kulinda ukuba iflegi ibuyiselwe ndixakekile.

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

Ukulinganisa ngenxa yokulinganisa akunakwenzeka ukuba kubangele ulonwabo novuyo. Kuyathakazelisa ngakumbi ukuba i-emulator inceda umphandi ukuba abone idatha kwimemori okanye aseke intsebenziswano yemisonto.

Покажем, как в динамике установить взаимодействие RTOS-тасков. Предварительно следует приостановить выполнение кода, если оно запущено. Если перейти в функцию bluetooth_task_entry kwisebe lokuqhuba lomyalelo we "LED" (idilesi 0x080057B8), ngoko ungabona into eyenziwe kuqala kwaye emva koko ithunyelwe kumgca wendlela ledControlQueueHandle некоторое сообщение.

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Следует установить breakpoint на обращение к переменной ledControlQueueHandle, raspolojennoy po adresu 0x20000624 kwaye uqhubeke ngokwenza ikhowudi:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Ngenxa yoko, ukumisa kuya kuqala ukwenzeka kwidilesi 0x080057CA phambi kokubiza umsebenzi osMailAlloc, далее — по адресу 0x08005806 phambi kokubiza umsebenzi osMailPut, emva koko emva kwexesha - kwidilesi 0x08005BD4 (phambi kokubiza umsebenzi osMailGet), который принадлежит функции leds_task_entry (LED-таск), то есть произошло переключение тасков, и теперь управление получил LED-таск.

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Ngale ndlela ilula unokumisela ukuba imisebenzi ye-RTOS idibana njani.

Ewe, eneneni, ukunxibelelana kwemisebenzi kunokuba nzima ngakumbi, kodwa usebenzisa i-emulator, ukulandelela olu nxibelelwano kuba nzima kakhulu.

apha можно посмотреть небольшое видео запуска эмулятора и взаимодействия с IDA Pro.

Запуск с Radare2

Awunako ukusihoya isixhobo esinje jikelele njengeRadare2.

Ukuqhagamshela kwi-emulator usebenzisa i-r2, umyalelo unokujongeka ngolu hlobo:

radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf

Ukuqaliswa kuyafumaneka ngoku (dc) kwaye unqumame uphumezo (Ctrl+C).

Ngelishwa, okwangoku, i-r2 ineengxaki xa isebenza kunye nomncedisi we-hardware we-gdb kunye noyilo lwememori; ds). Siyathemba ukuba oku kuya kulungiswa kungekudala.

Запуск с Eclipse

Один из вариантов использования эмулятора — отладка прошивки разрабатываемого устройства. Для наглядности будем также использовать прошивку «Носорога». Скачать исходники прошивки можно kusuka apha.

Siza kusebenzisa i-Eclipse kwiseti njenge-IDE Inkqubo yokusebenzela ye-STM32.

Ukuze i-emulator ilayishe i-firmware ehlanganiswe ngokuthe ngqo kwi-Eclipse, kufuneka udibanise ipharamitha firmware=null kumyalelo wokuqaliswa kwe-emulator:

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

Настройка debug-конфигурации

Kwi-Eclipse, khetha imenyu Qhuba-Debug Configurations... В открывшемся окне в разделе GDB Hardware Debugging необходимо добавить новую конфигурацию, после чего на вкладке «Main» указать текущий проект и приложение для отладки:

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Kwithebhu ethi "Debugger" kufuneka ucacise umyalelo we-GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

А также ввести параметры для подключения к GDB-серверу (хост и порт):

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Kwithebhu ethi "Startup", kufuneka ucacise ezi parameters zilandelayo:

  • включить галочку Load image (ukuze umfanekiso we-firmware odibeneyo ulayishwe kwi-emulator);
  • включить галочку Load symbols;
  • добавить команду запуска: set $pc = *0x08000004 (выставить в регистр PC значение из памяти по адресу 0x08000004 - idilesi igcinwe apho ResetHandler).

Nika ingqalelo, ukuba awufuni ukukhuphela ifayile ye-firmware esuka kwi-Eclipse, ngoko ukhetho Load image и Qhuba imiyalelo указывать не нужно.

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Emva kokucofa i-Debug, ungasebenza kwimowudi ye-debugger:

  • step by step ikhowudi ukuphunyezwa
    Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat
  • ukunxibelelana neendawo zokuqhawula
    Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Qaphela:. I-Eclipse ine, hmm... ezinye ii-quirks ... kwaye kufuneka uhlale nazo. Umzekelo, ukuba xa uqala i-debugger umyalezo othi "Akukho mthombo ukhoyo we"0x0" uvela, emva koko uphumeze umyalelo weNyathelo (F5)

Irhinoceros ngaphakathi kwekati - sebenzisa i-firmware kwi-emulator ye-Kopycat

Endaweni yesiphelo

Ukulinganisa ikhowudi yemveli yinto enomdla kakhulu. Kuyenzeka ukuba umphuhlisi wesixhobo alungise i-firmware ngaphandle kwesixhobo sokwenyani. Kumphandi, yithuba lokuqhuba uhlalutyo lwekhowudi eguquguqukayo, engenakwenzeka njalo kunye nesixhobo.

Мы хотим предоставить специалистам инструмент, который был бы удобен, в меру прост и не отнимал много сил и времени на свою настройку и запуск.

Bhala kumagqabantshintshi malunga namava akho usebenzisa ii-emulators zehardware. Siyakumema ukuba uxoxe kwaye uya kukuvuyela ukuphendula imibuzo.

Ngabasebenzisi ababhalisiweyo kuphela abanokuthatha inxaxheba kuphando. Ngena, ndiyacela.

Uyisebenzisela ntoni i-emulator?

  • разрабатываю (отлаживаю) прошивки

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

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

  • enye into (bhala kwizimvo)

Bangama-7 abasebenzisi abavotileyo. Abasebenzisi abangama-2 abakhange.

Какой софт Вы используете для эмуляции нативного кода?

  • IQEMU

  • Injini ye-unicorn

  • Iproteus

  • enye into (bhala kwizimvo)

Bangama-6 abasebenzisi abavotileyo. Abasebenzisi abangama-2 abakhange.

Yintoni ongathanda ukuyiphucula kwi-emulator oyisebenzisayo?

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

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

  • Ndifuna ukhetho oluninzi lokusebenzisana ne-emulator (API, iigwegwe)

  • Ndonwabile ngayo yonke into

  • enye into (bhala kwizimvo)

Bali-8 abasebenzisi abavotileyo. Umsebenzisi om-1 akakhange.

umthombo: www.habr.com

Yongeza izimvo