Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Uchrashuv doirasida 0x0A DC7831 DEF CON Nijniy Novgorod 16-fevral kuni biz ikkilik kodni emulyatsiya qilishning asosiy tamoyillari va o‘z ishlanmamiz – apparat platformasi emulyatori haqida hisobot taqdim etdik. Ko'chiruvchi.

Ushbu maqolada biz qurilma proshivkasini emulyatorda qanday ishga tushirishni, tuzatuvchi bilan o'zaro aloqani namoyish qilishni va proshivkaning kichik dinamik tahlilini o'tkazamiz.

Sana oldin

Uzoq vaqt oldin galaktikada

Bir necha yil oldin laboratoriyamizda qurilmaning dasturiy ta'minotini tekshirish zarurati paydo bo'ldi. Mikrodastur siqilgan va bootloader bilan ochilgan. U buni juda murakkab tarzda amalga oshirdi, xotiradagi ma'lumotlarni bir necha marta o'zgartirdi. Va mikrodasturning o'zi keyinchalik atrof-muhit birliklari bilan faol aloqada bo'ldi. Va bularning barchasi MIPS yadrosida.

Ob'ektiv sabablarga ko'ra mavjud emulyatorlar bizga mos kelmadi, ammo biz hali ham kodni ishga tushirishni xohladik. Keyin biz o'z emulyatorimizni yaratishga qaror qildik, u minimal darajada ishlaydi va asosiy dasturiy ta'minotni ochishga imkon beradi. Biz buni sinab ko'rdik va u ishladi. Biz asosiy dasturiy ta'minotni bajarish uchun tashqi qurilmalarni qo'shsak nima bo'ladi deb o'yladik. Bu unchalik zarar ko'rmadi - va u ham ishladi. Biz yana o'yladik va to'liq emulyator yaratishga qaror qildik.

Natijada kompyuter tizimlari emulyatori paydo bo'ldi Ko'chiruvchi.

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring
Nima uchun Kopycat?

So'zlar ustida o'yin bor.

  1. copycat (inglizcha, ot [ˈkɒpɪkæt]) - taqlid qiluvchi, taqlid qiluvchi
  2. mushuk (inglizcha, ot [ˈkæt]) - mushuk, mushuk - loyiha yaratuvchilardan birining sevimli hayvoni
  3. “K” harfi Kotlin dasturlash tilidan olingan

Ko'chiruvchi

Emulyatorni yaratishda juda aniq maqsadlar qo'yildi:

  • yangi tashqi qurilmalar, modullar, protsessor yadrolarini tezda yaratish qobiliyati;
  • turli modullardan virtual qurilmani yig'ish imkoniyati;
  • virtual qurilma xotirasiga har qanday ikkilik ma'lumotlarni (proshivka) yuklash imkoniyati;
  • oniy tasvirlar bilan ishlash qobiliyati (tizim holatining oniy tasvirlari);
  • o'rnatilgan tuzatuvchi orqali emulyator bilan o'zaro aloqa qilish imkoniyati;
  • rivojlanish uchun chiroyli zamonaviy til.

Natijada, Kotlin amalga oshirish uchun tanlangan, avtobus arxitekturasi (modullar virtual ma'lumotlar avtobuslari orqali bir-biri bilan bog'langanda), JSON qurilma tavsifi formati va GDB RSP tuzatuvchi bilan o'zaro ishlash protokoli sifatida.

Rivojlanish ikki yildan ko'proq vaqt davomida davom etmoqda va faol davom etmoqda. Bu vaqt ichida MIPS, x86, V850ES, ARM va PowerPC protsessor yadrolari amalga oshirildi.

Loyiha o'sib bormoqda va uni keng jamoatchilikka taqdim etish vaqti keldi. Biz loyihaning batafsil tavsifini keyinroq qilamiz, ammo hozircha biz Kopycat-dan foydalanishga e'tibor qaratamiz.

Eng sabrsizlar uchun emulyatorning promo versiyasini yuklab olish mumkin aloqa.

Emulyatorda Rhino

Eslatib o‘tamiz, avvalroq SMARTRHINO-2018 konferensiyasi uchun teskari muhandislik ko‘nikmalarini o‘rgatish uchun “Rhinoceros” sinov qurilmasi yaratilgan edi. Statik mikrodasturni tahlil qilish jarayoni maqolada tasvirlangan Ushbu maqola.

Keling, "dinamiklar" ni qo'shishga harakat qilaylik va proshivkani emulyatorda ishga tushiramiz.

Bizga kerak bo'ladi:
1) Java 1.8
2) Python va modul jep emulyator ichida Python dan foydalanish. Windows uchun Jep WHL modulini yaratishingiz mumkin bu yerdan yuklab oling.

Windows uchun:
1) com0com
2) macun

Linux uchun:
1) sot

GDB mijozi sifatida Eclipse, IDA Pro yoki radare2 dan foydalanishingiz mumkin.

U qanday ishlaydi?

Emulatorda proshivkani bajarish uchun haqiqiy qurilmaning analogi bo'lgan virtual qurilmani "yig'ish" kerak.

Haqiqiy qurilma ("karkidon") blok diagrammada ko'rsatilishi mumkin:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Emulyator modulli tuzilishga ega va yakuniy virtual qurilma JSON faylida tasvirlanishi mumkin.

JSON 105 qator

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

Parametrga e'tibor bering proshivka bo'lim params virtual qurilmaga proshivka sifatida yuklanishi mumkin bo'lgan fayl nomi.

Virtual qurilma va uning asosiy operatsion tizim bilan o'zaro ta'siri quyidagi diagramma bilan ifodalanishi mumkin:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Emulatorning joriy sinov namunasi asosiy operatsion tizimning COM portlari bilan o'zaro aloqani o'z ichiga oladi (Bluetooth moduli uchun UART va UART disk raskadrovka). Bu qurilmalar ulangan haqiqiy portlar yoki virtual MAQOMOTI portlari bo'lishi mumkin (buning uchun sizga kerak com0com/socat).

Hozirgi vaqtda emulyator bilan tashqi tomondan o'zaro aloqa qilishning ikkita asosiy usuli mavjud:

  • GDB RSP protokoli (mos ravishda, ushbu protokolni qo'llab-quvvatlaydigan vositalar Eclipse / IDA / radare2);
  • ichki emulyator buyruq qatori (Argparse yoki Python).

Virtual COM portlari

Terminal orqali mahalliy mashinada virtual qurilmaning UART bilan o'zaro aloqada bo'lish uchun siz bir-biriga bog'langan bir juft virtual MAQOMOTI portlarini yaratishingiz kerak. Bizning holatda, bitta port emulyator tomonidan, ikkinchisi esa terminal dasturi (PuTTY yoki ekran) tomonidan ishlatiladi:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

com0com dan foydalanish

Virtual COM portlari com0com to'plamidagi o'rnatish yordam dasturi yordamida sozlangan (konsol versiyasi - C: Dastur fayllari (x86)com0comsetups.exe, yoki GUI versiyasi - C: Dastur fayllari (x86) com0comsetupg.exe):

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Qutilarni belgilang buferni to'ldirishni yoqish barcha yaratilgan virtual portlar uchun, aks holda emulyator MAQOMOTI portidan javob kutadi.

socatdan foydalanish

UNIX tizimlarida virtual COM portlari emulyator tomonidan socat yordam dasturidan foydalangan holda avtomatik ravishda yaratiladi; buning uchun emulyatorni ishga tushirishda port nomidagi prefiksni ko'rsatish kifoya. socat:.

Ichki buyruq qatori interfeysi (Argparse yoki Python)

Kopycat konsol ilovasi bo'lganligi sababli, emulyator o'z ob'ektlari va o'zgaruvchilari bilan o'zaro ishlash uchun ikkita buyruq qatori interfeysini taqdim etadi: Argparse va Python.

Argparse - bu Kopycat-ga o'rnatilgan CLI va har doim hamma uchun mavjud.

Muqobil CLI Python tarjimonidir. Undan foydalanish uchun siz Jep Python modulini o'rnatishingiz va emulyatorni Python bilan ishlash uchun sozlashingiz kerak (foydalanuvchining asosiy tizimida o'rnatilgan Python tarjimonidan foydalaniladi).

Jep Python modulini o'rnatish

Linux ostida Jep-ni pip orqali o'rnatish mumkin:

pip install jep

Jep-ni Windows-ga o'rnatish uchun avval Windows SDK-ni va tegishli Microsoft Visual Studio-ni o'rnatishingiz kerak. Biz buni siz uchun biroz osonlashtirdik va WHL quradi Windows uchun Pythonning joriy versiyalari uchun JEP, shuning uchun modul fayldan o'rnatilishi mumkin:

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

Jep-ning o'rnatilishini tekshirish uchun siz buyruq satrida ishlashingiz kerak:

python -c "import jep"

Javob sifatida quyidagi xabarni olish kerak:

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

Tizimingiz uchun emulyatorning ommaviy ish faylida (copycat.bat - Windows uchun, ko'chiruvchi - Linux uchun) parametrlar ro'yxatiga DEFAULT_JVM_OPTS qo'shimcha parametr qo'shing Djava.library.path — u o'rnatilgan Jep moduliga yo'lni o'z ichiga olishi kerak.

Windows uchun natija quyidagicha bo'lishi kerak:

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

Kopycat ishga tushirilmoqda

Emulator konsol JVM ilovasidir. Ishga tushirish operatsion tizim buyruq qatori skripti (sh/cmd) orqali amalga oshiriladi.

Windows ostida ishlash uchun buyruq:

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

Socat yordam dasturi yordamida Linux ostida ishlash buyrug'i:

./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 serveriga kirish uchun ochiq bo'lgan TCP porti;
  • -n rhino — asosiy tizim modulining nomi (yig'ilgan qurilma);
  • -l user — asosiy modulni qidirish uchun kutubxona nomi;
  • -y library — qurilmaga kiritilgan modullarni qidirish yo'li;
  • firmwarerhino_pass.bin — proshivka fayliga yo'l;
  • COM26 va COM28 virtual COM portlaridir.

Natijada, so'rov ko'rsatiladi Python > (yoki 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 bilan o'zaro aloqa

Sinovni soddalashtirish uchun biz Rhino mikrodasturidan IDAda tahlil qilish uchun manba fayl sifatida foydalanamiz ELF fayli (meta-ma'lumot u erda saqlanadi).

Asosiy proshivkadan meta-ma'lumotsiz ham foydalanishingiz mumkin.

IDA Pro-da Kopycat-ni ishga tushirgandan so'ng, Debugger menyusida " bandiga o'ting.Tuzatish vositasini almashtirish…"va tanlang"Masofaviy GDB tuzatuvchisi". Keyin ulanishni o'rnating: menyu Nosozliklarni tuzatuvchi - Jarayon parametrlari…

Qiymatlarni o'rnating:

  • Ilova - har qanday qiymat
  • Xost nomi: 127.0.0.1 (yoki Kopycat ishlayotgan masofaviy mashinaning IP manzili)
  • Port: 23946

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Endi disk raskadrovka tugmasi mavjud bo'ladi (F9 tugmasi):

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Emulyatorda tuzatuvchi modulga ulanish uchun uni bosing. IDA disk raskadrovka rejimiga o'tadi, qo'shimcha oynalar mavjud bo'ladi: registrlar, stek haqida ma'lumot.

Endi biz tuzatuvchining barcha standart xususiyatlaridan foydalanishimiz mumkin:

  • ko'rsatmalarni bosqichma-bosqich bajarish (Qadam и Oldinga qadam qo'ying — mos ravishda F7 va F8 tugmalari);
  • bajarishni boshlash va to'xtatib turish;
  • kod va ma'lumotlar uchun to'xtash nuqtalarini yaratish (F2 tugmasi).

Nosozliklarni tuzatuvchiga ulanish proshivka kodini ishga tushirishni anglatmaydi. Joriy bajarilish pozitsiyasi manzil bo'lishi kerak 0x08006A74 - funktsiyaning boshlanishi Reset_Handler. Agar siz ro'yxatni pastga aylantirsangiz, funktsiya chaqiruvini ko'rishingiz mumkin asosiy. Kursorni ushbu qatorga qo'yishingiz mumkin (manzil 0x08006ABE) va operatsiyani bajaring Kursorga qadar ishga tushiring (F4 tugmasi).

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Keyinchalik, funktsiyani kiritish uchun F7 tugmasini bosishingiz mumkin asosiy.

Agar siz buyruqni bajarsangiz Jarayonni davom ettiring (F9 tugmasi), keyin bitta tugma bilan "Iltimos, kuting" oynasi paydo bo'ladi To'xtatib turing:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Siz bosganingizda To'xtatib turing proshivka kodining bajarilishi to'xtatiladi va u to'xtatilgan koddagi o'sha manzildan davom ettirilishi mumkin.

Agar siz kodni bajarishda davom etsangiz, virtual COM portlariga ulangan terminallarda quyidagi qatorlarni ko'rasiz:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

"Holatni aylanib o'tish" liniyasining mavjudligi virtual Bluetooth moduli foydalanuvchining MAQOMOTI portidan ma'lumotlarni qabul qilish rejimiga o'tganligini ko'rsatadi.

Endi Bluetooth terminalida (rasmda COM29) Rhino protokoliga muvofiq buyruqlarni kiritishingiz mumkin. Masalan, "MEOW" buyrug'i "mur-mur" qatorini Bluetooth terminaliga qaytaradi:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Menga to'liq taqlid qilmang

Emulatorni qurishda siz ma'lum bir qurilmaning detallari/emulsiya darajasini tanlashingiz mumkin. Masalan, Bluetooth modulini turli yo'llar bilan taqlid qilish mumkin:

  • qurilma to'liq buyruqlar to'plami bilan to'liq emulyatsiya qilingan;
  • AT buyruqlari emulyatsiya qilinadi va ma'lumotlar oqimi asosiy tizimning COM portidan olinadi;
  • virtual qurilma ma'lumotlarni haqiqiy qurilmaga to'liq yo'naltirishni ta'minlaydi;
  • har doim "OK" ni qaytaradigan oddiy stub sifatida.

Emulyatorning joriy versiyasi ikkinchi yondashuvdan foydalanadi - virtual Bluetooth moduli konfiguratsiyani amalga oshiradi, shundan so'ng u asosiy tizimning MAQOMOTI portidan emulyatorning UART portiga ma'lumotlarni "proksi" qilish rejimiga o'tadi.

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Agar periferiyaning ba'zi bir qismi amalga oshirilmagan bo'lsa, kodni oddiy asboblar bilan jihozlash imkoniyatini ko'rib chiqaylik. Misol uchun, agar DMA-ga ma'lumotlarni uzatishni boshqarish uchun mas'ul bo'lgan taymer yaratilmagan bo'lsa (tekshirish funktsiyada amalga oshiriladi) ws2812b_waitda joylashgan 0x08006840), keyin proshivka har doim bayroqning qayta o'rnatilishini kutadi bandda joylashgan 0x200004C4DMA ma'lumotlar liniyasining bandligini ko'rsatadi:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Biz bayroqni qo'lda qayta o'rnatish orqali bu vaziyatdan chiqishimiz mumkin band uni o'rnatgandan so'ng darhol. IDA Pro-da siz Python funktsiyasini yaratishingiz va uni to'xtash nuqtasida chaqirishingiz mumkin va bayroqqa 1 qiymatini yozganingizdan so'ng to'xtash nuqtasini kodga qo'yishingiz mumkin. band.

To'xtash nuqtasi ishlovchisi

Birinchidan, IDA da Python funksiyasini yarataylik. Menyu Fayl - Skript buyrug'i...

Chapdagi ro'yxatga yangi parcha qo'shing, unga nom bering (masalan, CPM),
O'ng tarafdagi matn maydoniga funktsiya kodini kiriting:

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

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Shundan so'ng biz bosamiz yugurish va skript oynasini yoping.

Endi kodga o'tamiz 0x0800688A, to'xtash nuqtasini o'rnating (F2 tugmasi), uni tahrirlang (kontekst menyusi To'xtash nuqtasini tahrirlash...), skript turini Pythonga o'rnatishni unutmang:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring
Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Agar joriy bayroq qiymati band 1 ga teng bo'lsa, funktsiyani bajarishingiz kerak skip_dma skript qatorida:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Agar siz proshivkani ishga tushirish uchun ishga tushirsangiz, to'xtash nuqtasi ishlov beruvchisi kodining ishga tushirilishi IDA oynasida ko'rish mumkin. chiqish chiziq bo'yicha Skipping wait ws2812.... Endi proshivka bayroqning qayta o'rnatilishini kutmaydi band.

Emulyator bilan o'zaro aloqa

O'xshatish uchun taqlid qilish zavq va quvonch keltirishi dargumon. Agar emulyator tadqiqotchiga xotiradagi ma'lumotlarni ko'rishga yoki iplarning o'zaro ta'sirini o'rnatishga yordam bersa, bu qiziqroq.

Biz sizga RTOS vazifalari o'rtasida o'zaro aloqani qanday dinamik ravishda o'rnatishni ko'rsatamiz. Agar kod ishlayotgan bo'lsa, avval uning bajarilishini to'xtatib qo'yishingiz kerak. Funktsiyaga kirsangiz bluetooth_task_entry "LED" buyrug'ining ishlov berish bo'limiga (manzil 0x080057B8), keyin siz avval yaratilgan va keyin tizim navbatiga yuborilgan narsalarni ko'rishingiz mumkin ledControlQueueHandle ba'zi xabar.

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

O'zgaruvchiga kirish uchun to'xtash nuqtasini o'rnatishingiz kerak ledControlQueueHandleda joylashgan 0x20000624 va kodni bajarishda davom eting:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Natijada, to'xtash birinchi navbatda manzilda sodir bo'ladi 0x080057CA funktsiyani chaqirishdan oldin osMailAlloc, keyin manzilda 0x08005806 funktsiyani chaqirishdan oldin osMailPut, keyin bir muncha vaqt o'tgach - manzilga 0x08005BD4 (funktsiyani chaqirishdan oldin osMailGet), funksiyaga tegishli leds_task_entry (LED-vazifa), ya'ni vazifalar almashtirildi va endi LED-vazifa boshqaruvni oldi.

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Ushbu oddiy usulda siz RTOS vazifalari bir-biri bilan qanday aloqada bo'lishini aniqlashingiz mumkin.

Albatta, aslida, vazifalarning o'zaro ta'siri murakkabroq bo'lishi mumkin, ammo emulyator yordamida bu shovqinni kuzatish kamroq mashaqqatli bo'ladi.

shu yerda Siz emulyatorning ishga tushirilishi va IDA Pro bilan o'zaro aloqasi haqidagi qisqa videoni tomosha qilishingiz mumkin.

Radare2 bilan ishga tushiring

Radare2 kabi universal vositani e'tiborsiz qoldirolmaysiz.

R2 yordamida emulyatorga ulanish uchun buyruq quyidagicha ko'rinadi:

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

Ishga tushirish hozir mavjud (dc) va bajarishni to'xtatib turish (Ctrl+C).

Afsuski, hozirda r2 apparat gdb serveri va xotira tartibi bilan ishlashda muammolarga duch kelmoqda; shu sababli to'xtash nuqtalari va qadamlar ishlamaydi (buyruq). ds). Umid qilamizki, bu tez orada tuzatiladi.

Eclipse bilan ishlash

Emulyatordan foydalanish variantlaridan biri ishlab chiqilayotgan qurilmaning dasturiy ta'minotini disk raskadrovka qilishdir. Aniqlik uchun biz Rhino dasturiy ta'minotidan ham foydalanamiz. Mikrodastur manbalarini yuklab olishingiz mumkin shu yerda.

Biz Eclipse-dan IDE sifatida foydalanamiz STM32 uchun tizim ishchi stoli.

Emulator to'g'ridan-to'g'ri Eclipse-da tuzilgan dasturiy ta'minotni yuklashi uchun siz parametrni qo'shishingiz kerak. firmware=null emulyatorni ishga tushirish buyrug'iga:

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

Nosozliklarni tuzatish konfiguratsiyasini sozlash

Eclipse-da menyuni tanlang Ishga tushirish - konfiguratsiyalarni tuzatish... Ochilgan oynada, bo'limda GDB Hardware Debugging yangi konfiguratsiyani qo'shishingiz kerak, keyin "Asosiy" yorlig'ida nosozliklarni tuzatish uchun joriy loyiha va dasturni belgilang:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

"Debugger" yorlig'ida siz GDB buyrug'ini ko'rsatishingiz kerak:
${openstm32_compiler_path}arm-none-eabi-gdb

Shuningdek, GDB serveriga (host va port) ulanish parametrlarini kiriting:

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

"Ishga tushirish" yorlig'ida siz quyidagi parametrlarni ko'rsatishingiz kerak:

  • belgilash katakchasini yoqing Rasm yuklash (yig'ilgan proshivka tasviri emulyatorga yuklanishi uchun);
  • belgilash katakchasini yoqing Belgilarni yuklash;
  • ishga tushirish buyrug'ini qo'shing: set $pc = *0x08000004 (ShK registrini manzildagi xotiradan olingan qiymatga o'rnating 0x08000004 - manzil u yerda saqlanadi ResetHandler).

E'tibor bering, agar siz Eclipse-dan proshivka faylini yuklab olishni xohlamasangiz, u holda variantlar Rasm yuklash и Buyruqlarni ishga tushirish ko'rsatishga hojat yo'q.

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Nosozliklarni tuzatish tugmasini bosgandan so'ng siz tuzatuvchi rejimida ishlashingiz mumkin:

  • bosqichma-bosqich kodni bajarish
    Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring
  • to'xtash nuqtalari bilan o'zaro ta'sir qilish
    Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

nota. Eclipse, hmm... ba'zi g'alati narsalarga ega ... va siz ular bilan yashashingiz kerak. Masalan, tuzatuvchini ishga tushirishda “0x0″ uchun manba mavjud emas” xabari paydo bo'lsa, qadam buyrug'ini bajaring (F5)

Mushuk ichidagi karkidon - Kopycat emulyatorida proshivkani ishga tushiring

Xulosa o'rniga

Mahalliy kodni taqlid qilish juda qiziq narsa. Qurilma ishlab chiqaruvchisi proshivkani haqiqiy qurilmasiz disk raskadrovka qilishi mumkin bo'ladi. Tadqiqotchi uchun bu dinamik kod tahlilini o'tkazish imkoniyatidir, bu hatto qurilma bilan ham har doim ham mumkin emas.

Biz mutaxassislarni qulay, o'rtacha darajada sodda va sozlash va ishga tushirish uchun ko'p kuch va vaqt talab qilmaydigan vosita bilan ta'minlamoqchimiz.

Uskuna emulyatorlaridan foydalanish tajribangiz haqida sharhlarda yozing. Biz sizni muhokama qilishga taklif qilamiz va savollarga javob berishdan xursand bo'lamiz.

So'rovda faqat ro'yxatdan o'tgan foydalanuvchilar ishtirok etishlari mumkin. tizimga kirishiltimos.

Emulyatordan nima uchun foydalanasiz?

  • Men dasturiy ta'minotni ishlab chiqaman (disk raskadrovka).

  • Men mikrodasturni o'rganyapman

  • Men o'yinlarni ishga tushiraman (Dendi, Sega, PSP)

  • boshqa narsa (izohlarda yozing)

7 nafar foydalanuvchi ovoz berdi. 2 nafar foydalanuvchi betaraf qolgan.

Mahalliy kodni taqlid qilish uchun qanday dasturdan foydalanasiz?

  • QEMU

  • Unicorn dvigateli

  • protey

  • boshqa narsa (izohlarda yozing)

6 nafar foydalanuvchi ovoz berdi. 2 nafar foydalanuvchi betaraf qolgan.

Siz foydalanayotgan emulyatorda nimani yaxshilashni xohlaysiz?

  • Men tezlikni xohlayman

  • Men sozlash/ishga tushirish qulayligini xohlayman

  • Men emulyator bilan ishlash uchun ko'proq imkoniyatlarni xohlayman (API, ilgaklar)

  • Men hamma narsadan mamnunman

  • boshqa narsa (izohlarda yozing)

8 ta foydalanuvchi ovoz berdi. 1 foydalanuvchi betaraf qoldi.

Manba: www.habr.com

a Izoh qo'shish