Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Жиналыс аясында 0x0A DC7831 DEF CON Нижний Новгород 16 ақпанда біз екілік кодты эмуляциялаудың негізгі принциптері және өзіміздің дамуымыз – аппараттық платформа эмуляторы туралы баяндаманы ұсындық. Көшірме.

Бұл мақалада біз эмуляторда құрылғының микробағдарламасын қалай іске қосу керектігін, отладчикпен өзара әрекеттесуді көрсетуді және микробағдарламаның шағын динамикалық талдауын орындауды сипаттаймыз.

тарихын

Баяғыда алыстағы галактикада

Бірнеше жыл бұрын біздің зертханада құрылғының микробағдарламасын зерттеу қажеттілігі туындады. Микробағдарлама жүктегішпен қысылып, қаптамадан шығарылды. Ол мұны өте күрделі түрде жасады, жадтағы деректерді бірнеше рет ауыстырды. Ал микробағдарлама өзі содан кейін перифериялық құрылғылармен белсенді әрекеттесті. Мұның бәрі MIPS ядросында.

Объективті себептерге байланысты бар эмуляторлар бізге сәйкес келмеді, бірақ біз әлі де кодты іске қосқымыз келді. Содан кейін біз өз эмуляторымызды жасауды шештік, ол минимумды жасайды және негізгі микробағдарламаны шығаруға мүмкіндік береді. Біз оны қолданып көрдік және ол жұмыс істеді. Біз негізгі микробағдарламаны орындау үшін перифериялық құрылғыларды қоссақ ше деп ойладық. Бұл қатты ауыртпады - және ол да жұмыс істеді. Біз тағы да ойланып, толыққанды эмулятор жасауды шештік.

Нәтиже компьютерлік жүйелер эмуляторы болды Көшірме.

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз
Неліктен Kopycat?

Сөз ойыны бар.

  1. еліктеме (ағылшынша, зат есім [ˈkɒpɪkæt]) – еліктеуіш, еліктеуіш
  2. мысық (ағылшынша, зат есім [ˈkæt]) - мысық, мысық - жобаны жасаушылардың бірінің сүйікті жануары
  3. «K» әрпі Котлин бағдарламалау тілінен алынған

Көшірме

Эмуляторды жасау кезінде өте нақты мақсаттар қойылды:

  • жаңа перифериялық құрылғыларды, модульдерді, процессор ядроларын жылдам жасау мүмкіндігі;
  • әртүрлі модульдерден виртуалды құрылғыны құрастыру мүмкіндігі;
  • виртуалды құрылғының жадына кез келген екілік деректерді (микробағдарламаны) жүктеу мүмкіндігі;
  • суреттермен жұмыс істеу мүмкіндігі (жүйе күйінің суреті);
  • кірістірілген отладчик арқылы эмулятормен өзара әрекеттесу мүмкіндігі;
  • дамыту үшін тамаша заманауи тіл.

Нәтижесінде іске асыру үшін Котлин таңдалды, автобус архитектурасы (бұл модульдер бір-бірімен виртуалды деректер шиналары арқылы байланысады), құрылғыны сипаттау пішімі ретінде JSON және отладчикпен өзара әрекеттесу хаттамасы ретінде GDB RSP.

Әзірлеу екі жылдан сәл астам уақыт бойы жүріп жатыр және белсенді түрде жалғасуда. Осы уақыт ішінде MIPS, x86, V850ES, ARM және PowerPC процессорларының ядролары енгізілді.

Жоба өсіп келеді және оны көпшілікке таныстыратын кез келді. Біз жобаның егжей-тегжейлі сипаттамасын кейінірек жасаймыз, бірақ әзірге біз Kopycat-ті пайдалануға назар аударамыз.

Ең шыдамсыздар үшін эмулятордың промо-нұсқасын жүктеп алуға болады байланыс.

Эмулятордағы мүйізтұмсық

Еске салайық, бұған дейін SMARTRHINO-2018 конференциясы үшін кері инженерия дағдыларын үйрету үшін «Мүйізтұмсық» сынақ құрылғысы жасалған болатын. Микробағдарламаны статикалық талдау процесі сипатталған Бұл мақала.

Енді «динамиктерді» қосып, микробағдарламаны эмуляторда іске қосып көрейік.

Бізге қажет:
1) Java 1.8
2) Python және модуль Джеп эмулятор ішінде Python пайдалану үшін. Windows жүйесіне арналған Jep WHL модулін құрастыруға болады мұнда жүктеп алыңыз.

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

Параметрге назар аударыңыз микробағдарлама бөлім параменттер виртуалды құрылғыға микробағдарлама ретінде жүктелетін файлдың атауы.

Виртуалды құрылғы және оның негізгі операциялық жүйемен әрекеттесуін келесі диаграмма арқылы көрсетуге болады:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Эмулятордың ағымдағы сынақ данасы негізгі ОЖ-ның COM порттарымен өзара әрекеттесуді қамтиды (Bluetooth модулі үшін UART және UART жөндеу). Бұл құрылғылар қосылған нақты порттар немесе виртуалды COM порттары болуы мүмкін (бұл үшін сізге қажет com0com/socat).

Қазіргі уақытта эмулятормен сырттан әрекеттесудің екі негізгі жолы бар:

  • GDB RSP протоколы (сәйкесінше, осы протоколды қолдайтын құралдар Eclipse / IDA / radare2);
  • ішкі эмулятор пәрмен жолы (Argparse немесе Python).

Виртуалды COM порттары

Терминал арқылы жергілікті компьютердегі виртуалды құрылғының UART-пен өзара әрекеттесу үшін сізге байланысты виртуалды COM порттарының жұбын жасау керек. Біздің жағдайда бір портты эмулятор, ал екіншісін терминалдық бағдарлама (PuTTY немесе экран) пайдаланады:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

com0com пайдалану

Виртуалды COM порттары com0com жинағындағы орнату утилитасының көмегімен конфигурацияланады (консоль нұсқасы - C: Program Files (x86)com0comsetupс.exe, немесе GUI нұсқасы - C: Program Files (x86)com0comsetupg.exe):

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Ұяшықтарды белгілеңіз буфердің асып кетуін қосыңыз барлық жасалған виртуалды порттар үшін, әйтпесе эмулятор COM портынан жауап күтеді.

socat пайдалану

UNIX жүйелерінде виртуалды COM порттарын эмулятор socat утилитасын пайдаланып автоматты түрде жасайды; бұл үшін эмуляторды іске қосқан кезде порт атауында префиксті көрсету жеткілікті. socat:.

Ішкі пәрмен жолы интерфейсі (Argparse немесе Python)

Kopycat консольдік қолданба болғандықтан, эмулятор оның нысандарымен және айнымалы мәндерімен әрекеттесу үшін екі пәрмен жолы интерфейсін ұсынады: Argparse және Python.

Argparse - Kopycat ішіне орнатылған CLI және әрқашан барлығына қол жетімді.

Балама CLI - Python интерпретаторы. Оны пайдалану үшін Jep Python модулін орнату және эмуляторды Python-мен жұмыс істеу үшін конфигурациялау қажет (пайдаланушының негізгі жүйесінде орнатылған Python интерпретаторы пайдаланылады).

Python модулін орнату Jep

Linux астында Jep пип арқылы орнатылуы мүмкін:

pip install jep

Windows жүйесінде Jep орнату үшін алдымен Windows SDK және сәйкес Microsoft Visual Studio бағдарламасын орнату керек. Біз мұны сізге сәл жеңілдеттік және WHL құрастырады Windows жүйесіне арналған Python бағдарламасының ағымдағы нұсқалары үшін JEP, сондықтан модульді файлдан орнатуға болады:

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

Jep орнатуды тексеру үшін пәрмен жолында іске қосу керек:

python -c "import jep"

Жауап ретінде келесі хабарлама алынуы керек:

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

Жүйеңізге арналған эмулятор пакеттік файлында (copycat.bat - Windows үшін, көшірмеші - Linux үшін) параметрлер тізіміне DEFAULT_JVM_OPTS қосымша параметрді қосыңыз Djava.library.path — ол орнатылған Jep модуліне жолды қамтуы керек.

Windows үшін нәтиже келесідей жол болуы керек:

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

Kopycat іске қосылуда

Эмулятор консольдық JVM қолданбасы болып табылады. Іске қосу операциялық жүйенің пәрмен жолы сценарийі (sh/cmd) арқылы жүзеге асырылады.

Windows жүйесінде іске қосу пәрмені:

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

socat утилитасын пайдаланып Linux астында іске қосу пәрмені:

./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28

  • -g 23646 — GDB серверіне кіру үшін ашық болатын TCP порты;
  • -n rhino — негізгі жүйелік модульдің атауы (құрастырылған құрылғы);
  • -l user — негізгі модульді іздеуге арналған кітапхананың атауы;
  • -y library — құрылғыға енгізілген модульдерді іздеу жолы;
  • firmwarerhino_pass.bin — микробағдарлама файлына жол;
  • COM26 және COM28 виртуалды COM порттары болып табылады.

Нәтижесінде сұрау көрсетіледі Python > (немесе Argparse >):

18:07:59 INFO [eFactoryBuilder.create ]: Module top successfully created as top
18:07:59 INFO [ Module.initializeAndRes]: Setup core to top.u1_stm32.cortexm0.arm for top
18:07:59 INFO [ Module.initializeAndRes]: Setup debugger to top.u1_stm32.dbg for top
18:07:59 WARN [ Module.initializeAndRes]: Tracer wasn't found in top...
18:07:59 INFO [ Module.initializeAndRes]: Initializing ports and buses...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Some ports has warning use printModulesPortsWarnings to see it...
18:07:59 FINE [ ARMv6CPU.reset ]: Set entry point address to 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Module top is successfully initialized and reset as a top cell!
18:07:59 INFO [ Kopycat.open ]: Starting virtualization of board top[rhino] with arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: Set new debugger module top.u1_stm32.dbg for GDB_SERVER(port=23946,alive=true)
Python >

IDA Pro-мен өзара әрекеттесу

Тестілеуді жеңілдету үшін біз Rhino микробағдарламасын пішінде IDA-да талдау үшін бастапқы файл ретінде пайдаланамыз ELF файлы (мета ақпарат сонда сақталады).

Сондай-ақ негізгі микробағдарламаны мета ақпаратсыз пайдалануға болады.

IDA Pro жүйесінде Kopycat іске қосылғаннан кейін Debugger мәзірінде « тармағына өтіңіз.Түзеткішті ауыстыру…«және» таңдаңызҚашықтағы GDB жөндеу құралы«. Содан кейін қосылымды орнатыңыз: мәзір Түзеткіш - Процесс опциялары…

Мәндерді орнатыңыз:

  • Қолданба - кез келген мән
  • Хост атауы: 127.0.0.1 (немесе Kopycat жұмыс істейтін қашықтағы құрылғының IP мекенжайы)
  • Порт: 23946

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Енді жөндеу түймесі қолжетімді болады (F9 пернесі):

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Эмулятордағы отладчик модуліне қосылу үшін оны басыңыз. IDA отладка режиміне өтеді, қосымша терезелер қолжетімді болады: регистрлер, стек туралы ақпарат.

Енді біз отладчиктің барлық стандартты мүмкіндіктерін пайдалана аламыз:

  • нұсқауларды кезең-кезеңімен орындау (Кіріңіз и Басыңыз — сәйкесінше F7 және F8 пернелері);
  • орындауды бастау және кідірту;
  • код пен деректер үшін тоқтау нүктелерін жасау (F2 пернесі).

Түзеткішке қосылу микробағдарлама кодын іске қосу дегенді білдірмейді. Ағымдағы орындалу орны мекенжай болуы керек 0x08006A74 — функцияның басталуы Reset_Handler. Тізімді төмен айналдырсаңыз, функция шақыруын көре аласыз басты. Курсорды осы жолға қоюға болады (мекен-жай 0x08006ABE) және операцияны орындаңыз Курсорға дейін орындаңыз (F4 пернесі).

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Содан кейін функцияны енгізу үшін F7 пернесін басуға болады басты.

Егер сіз пәрменді орындасаңыз Процесті жалғастыру (F9 пернесі), содан кейін бір түймемен «Күтіңіз» терезесі пайда болады Тоқтату:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Сіз басқанда Тоқтату микробағдарлама кодын орындау тоқтатылады және ол үзілген кодтағы сол мекенжайдан жалғастырылуы мүмкін.

Кодты орындауды жалғастырсаңыз, виртуалды COM порттарына қосылған терминалдарда келесі жолдарды көресіз:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

«Күйді айналып өту» жолының болуы виртуалды Bluetooth модулінің пайдаланушының COM портынан деректерді қабылдау режиміне ауысқанын көрсетеді.

Енді Bluetooth терминалында (суреттегі COM29) Rhino протоколына сәйкес командаларды енгізуге болады. Мысалы, «MEOW» пәрмені Bluetooth терминалына «mur-mur» жолын қайтарады:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Маған толық еліктемеңіз

Эмуляторды құру кезінде сіз белгілі бір құрылғының егжей-тегжейлі/эмуляция деңгейін таңдай аласыз. Мысалы, Bluetooth модулін әртүрлі жолдармен эмуляциялауға болады:

  • құрылғы командалардың толық жиынтығымен толығымен эмуляцияланған;
  • AT командалары эмуляцияланады, ал деректер ағыны негізгі жүйенің COM портынан алынады;
  • виртуалды құрылғы деректерді нақты құрылғыға толық қайта бағыттауды қамтамасыз етеді;
  • әрқашан «OK» қайтаратын қарапайым түтік ретінде.

Эмулятордың ағымдағы нұсқасы екінші тәсілді қолданады - виртуалды Bluetooth модулі конфигурацияны орындайды, содан кейін ол негізгі жүйенің COM портынан эмулятордың UART портына деректерді «проксиге жіберу» режиміне ауысады.

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Периферияның қандай да бір бөлігі орындалмаған жағдайда кодты қарапайым аспаптастыру мүмкіндігін қарастырайық. Мысалы, егер DMA-ға деректерді беруді басқаруға жауапты таймер жасалмаса (тексеру функцияда орындалады ws2812b_waitмекен-жайында орналасқан 0x08006840), содан кейін микробағдарлама әрқашан жалаушаның қалпына келтірілуін күтеді бос емесмекен-жайында орналасқан 0x200004C4ол DMA деректер желісінің толтырылуын көрсетеді:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Біз жалаушаны қолмен қалпына келтіру арқылы бұл жағдайдан шыға аламыз бос емес оны орнатқаннан кейін бірден. IDA Pro бағдарламасында сіз Python функциясын жасай аласыз және оны тоқтау нүктесінде шақыра аласыз және жалаушаға 1 мәнін жазғаннан кейін тоқтау нүктесінің өзін кодқа қоюға болады. бос емес.

Үзіліс нүктесі өңдегіші

Біріншіден, IDA-да Python функциясын жасайық. Мәзір Файл - Сценарий пәрмені...

Сол жақтағы тізімге жаңа үзінді қосыңыз, оған ат беріңіз (мысалы, BPT),
Оң жақтағы мәтіндік өріске функция кодын енгізіңіз:

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

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Осыдан кейін біз басамыз жүгіру және сценарий терезесін жабыңыз.

Енді кодқа көшейік 0x0800688A, тоқтау нүктесін орнатыңыз (F2 пернесі), оны өңдеңіз (контекстік мәзір Тоқтау нүктесін өңдеу...), сценарий түрін Python етіп орнатуды ұмытпаңыз:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз
Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Ағымдағы жалаудың мәні болса бос емес 1-ге тең болса, функцияны орындау керек skip_dma сценарий жолында:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Микробағдарламаны орындау үшін іске қоссаңыз, тоқтау нүктесі өңдегішінің кодын іске қосуды IDA терезесінде көруге болады. шығыс сызық бойынша Skipping wait ws2812.... Енді микробағдарлама жалаушаның қалпына келтірілуін күтпейді бос емес.

Эмулятормен өзара әрекеттесу

Еліктеу үшін эмуляция рахат пен қуаныш тудыруы екіталай. Эмулятор зерттеушіге жадтағы деректерді көруге немесе ағындардың өзара әрекеттесуін орнатуға көмектессе, әлдеқайда қызықты.

Біз RTOS тапсырмалары арасындағы өзара әрекеттесуді динамикалық түрде орнату жолын көрсетеміз. Егер код іске қосылған болса, алдымен оның орындалуын кідірту керек. Функцияға барсаңыз bluetooth_тапсырмасы_енгізу «LED» командасының өңдеу тармағына (мекен-жайы 0x080057B8), содан кейін алдымен ненің жасалғанын, содан кейін жүйе кезегіне жіберілгенін көре аласыз ledControlQueueHandle кейбір хабарлама.

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Айнымалыға қол жеткізу үшін тоқтау нүктесін орнату керек 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 серверімен және жад орналасуымен жұмыс істеу кезінде проблемалар бар; осыған байланысты тоқтау нүктелері мен қадамдар жұмыс істемейді (пәрмен ds). Бұл жақын арада түзетіледі деп үміттенеміз.

Eclipse көмегімен іске қосу

Эмуляторды пайдалану нұсқаларының бірі әзірленіп жатқан құрылғының микробағдарламасын жөндеу болып табылады. Түсінікті болу үшін біз Rhino микробағдарламасын да қолданамыз. Микробағдарлама көздерін жүктеп алуға болады мұнда.

Біз Eclipse жиынтығын IDE ретінде қолданамыз STM32 жүйесіне арналған жұмыс үстелі.

Эмулятордың тікелей Eclipse-де құрастырылған микробағдарламаны жүктеуі үшін параметрді қосу керек. firmware=null эмуляторды іске қосу пәрменіне:

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

Түзету конфигурациясын орнату

Eclipse бағдарламасында мәзірді таңдаңыз Іске қосу - конфигурацияларды түзету... Ашылған терезеде бөлімде GDB жабдықты жөндеу жаңа конфигурацияны қосу керек, содан кейін «Негізгі» қойындысында ағымдағы жобаны және жөндеуге арналған қолданбаны көрсетіңіз:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

«Отлағыш» қойындысында GDB пәрменін көрсету керек:
${openstm32_compiler_path}arm-none-eabi-gdb

Сондай-ақ GDB серверіне (хост және порт) қосылу параметрлерін енгізіңіз:

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

«Іске қосу» қойындысында келесі параметрлерді көрсету керек:

  • құсбелгісін қосыңыз Кескінді жүктеңіз (жинақталған микробағдарлама кескіні эмуляторға жүктелуі үшін);
  • құсбелгісін қосыңыз Таңбаларды жүктеңіз;
  • іске қосу пәрменін қосыңыз: set $pc = *0x08000004 (ДК регистрін мекенжайдағы жадтағы мәнге орнатыңыз 0x08000004 - мекенжай сонда сақталады ResetHandler).

назар аударыңыз, микробағдарлама файлын Eclipse бағдарламасынан жүктеп алғыңыз келмесе, онда опциялар Кескінді жүктеңіз и Пәрмендерді орындау көрсетудің қажеті жоқ.

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Түзету түймесін басқаннан кейін сіз отладчик режимінде жұмыс істей аласыз:

  • қадамдық кодты орындау
    Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз
  • тоқтау нүктелерімен әрекеттесу
    Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

ескерту. Eclipse, хмм... кейбір ерекшеліктер бар ... және сіз олармен өмір сүруіңіз керек. Мысалы, отладчикті іске қосқан кезде «0x0″ үшін дереккөз жоқ» хабары пайда болса, Қадам пәрменін орындаңыз (F5)

Мысықтың ішіндегі мүйізтұмсық - Kopycat эмуляторында микробағдарламаны іске қосыңыз

Орнына жасасу

Жергілікті кодты эмуляциялау өте қызықты нәрсе. Құрылғы әзірлеушісі микробағдарламаны нақты құрылғысыз түзете алады. Зерттеуші үшін бұл динамикалық код талдауын жүргізу мүмкіндігі, ол тіпті құрылғымен де мүмкін емес.

Біз мамандарға ыңғайлы, орташа қарапайым және орнату мен іске қосу көп күш пен уақытты қажет етпейтін құралды ұсынғымыз келеді.

Аппараттық эмуляторларды пайдалану тәжірибеңіз туралы түсініктемелерде жазыңыз. Біз сізді талқылауға шақырамыз және сұрақтарға жауап беруге қуанышты боламыз.

Сауалнамаға тек тіркелген пайдаланушылар қатыса алады. Кіру, өтінемін.

Эмуляторды не үшін пайдаланасыз?

  • Мен микробағдарламаны әзірлеймін (отлад).

  • Мен микробағдарламаны зерттеп жатырмын

  • Мен ойындарды іске қосамын (Dendi, Sega, PSP)

  • тағы бір нәрсе (түсініктемелерде жазыңыз)

7 пайдаланушы дауыс берді. 2 пайдаланушы қалыс қалды.

Жергілікті кодты эмуляциялау үшін қандай бағдарламалық құралды пайдаланасыз?

  • QEMU

  • Unicorn қозғалтқышы

  • Proteus

  • тағы бір нәрсе (түсініктемелерде жазыңыз)

6 пайдаланушы дауыс берді. 2 пайдаланушы қалыс қалды.

Сіз пайдаланып жатқан эмуляторда нені жақсартқыңыз келеді?

  • Мен жылдамдықты қалаймын

  • Орнату/іске қосу жеңілдігін қалаймын

  • Мен эмулятормен (API, ілгектер) әрекеттесу үшін көбірек опцияларды қалаймын

  • Мен бәріне ризамын

  • тағы бір нәрсе (түсініктемелерде жазыңыз)

8 қолданушы дауыс берді. 1 пайдаланушы қалыс қалды.

Ақпарат көзі: www.habr.com

пікір қалдыру