Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Дар доираи вохӯрӣ 0x0A DC7831 DEF CON Нижний Новгород 16 феврал мо гузоришро дар бораи принсипҳои асосии эмуляцияи кодҳои дуӣ ва рушди худи мо - эмулятори платформаи сахтафзор пешниҳод кардем. Нусхабардорӣ.

Дар ин мақола мо тасвир хоҳем кард, ки чӣ тавр ба кор андохтани нармафзори дастгоҳ дар эмулятор, нишон додани ҳамкории мутақобила бо ислоҳкунанда ва таҳлили хурди динамикии нармафзори нармафзор анҷом дода мешавад.

prehistory

Чанде пеш дар галактикаи дур

Якчанд сол пеш аз ин дар лабораторияи мо зарурати тафтиш кардани прошив-раи дастгох ба миён омад. Нармафзор бо боркунак фишурда ва кушода шуд. Вай ин корро ба таври хеле мураккаб анҷом дода, маълумотро дар хотира якчанд маротиба иваз кард. Ва худи микропрограммӣ баъдан бо таҷҳизоти периферӣ фаъолона ҳамкорӣ мекард. Ва ҳамаи ин дар ядрои MIPS.

Бо сабабҳои объективӣ, эмуляторҳои мавҷуда ба мо мувофиқ набуданд, аммо мо ба ҳар ҳол мехостем, ки кодро иҷро кунем. Сипас мо тасмим гирифтем, ки эмулятори худамонро созем, ки он ҳадди ақалро иҷро мекунад ва ба мо имкон медиҳад, ки нармафзори асосиро кушоем. Мо онро кӯшиш кардем ва он кор кард. Мо фикр мекардем, ки агар мо перифериҳоро барои иҷрои нармафзори асосӣ илова кунем, чӣ мешавад? Он чандон дард накард - ва он ҳам кор кард. Мо бори дигар фикр кардем ва тасмим гирифтем, ки эмулятори мукаммал созем.

Натиҷа эмулятори системаҳои компютерӣ буд Нусхабардорӣ.

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед
Чаро Kopycat?

Бозии калимаҳо вуҷуд дорад.

  1. љињат (англисӣ, исм [ˈkɒpɪkæt]) - тақлидкунанда, тақлидкунанда
  2. гурба (англисӣ, исм [ˈkæt]) - гурба, гурба - ҳайвони дӯстдоштаи яке аз созандагони лоиҳа
  3. Ҳарфи "K" аз забони барномасозии Котлин аст

Нусхабардорӣ

Ҳангоми сохтани эмулятор ҳадафҳои хеле мушаххас гузошта шуданд:

  • қобилияти зуд сохтани таҷҳизоти нав, модулҳо, ядроҳои протсессор;
  • қобилияти ҷамъ кардани дастгоҳи виртуалӣ аз модулҳои гуногун;
  • қобилияти бор кардани ҳама гуна маълумоти дуӣ (прошивка) ба хотираи дастгоҳи виртуалӣ;
  • қобилияти кор бо аксҳо (намудҳои ҳолати система);
  • қобилияти муошират бо эмулятор тавассути debugger дарунсохт;
  • забони зебои муосир барои рушд.

Дар натиҷа, Котлин барои татбиқ, меъмории автобус (ин вақтест, ки модулҳо бо ҳам тавассути автобусҳои виртуалии додаҳо муошират мекунанд), JSON ҳамчун формати тавсифи дастгоҳ ва GDB RSP ҳамчун протокол барои ҳамкорӣ бо debugger интихоб карда шуданд.

Инкишофи он андаке бештар аз ду сол давом дорад ва фаъолона давом дорад. Дар ин муддат ядроҳои протсессори MIPS, x86, V850ES, ARM ва PowerPC амалӣ карда шуданд.

Лоиҳа афзоиш меёбад ва вақти он расидааст, ки онро ба оммаи васеъ пешкаш кунед. Мо тавсифи муфассали лоиҳаро баъдтар иҷро хоҳем кард, аммо ҳоло мо ба истифодаи Kopycat диққат медиҳем.

Барои бесабртаринҳо, версияи промои эмуляторро аз он зеркашӣ кардан мумкин аст пайванд.

Рино дар эмулятор

Ёдовар мешавем, ки қаблан барои конфронси SMARTRHINO-2018 дастгоҳи санҷишии "Риносерос" барои омӯзиши малакаҳои муҳандисии баръакс сохта шуда буд. Раванди таҳлили нармафзори статикӣ дар ин мақола.

Акнун биёед кӯшиш кунем, ки "гӯякҳо" илова кунем ва нармафзорро дар эмулятор иҷро кунем.

Мо бояд ба:
1) Java 1.8
2) Python ва модул Ҷеп барои истифодаи Python дар дохили эмулятор. Шумо метавонед модули WHL Jep-ро барои Windows созед дар инҷо нависед.

Барои Windows:
1) com0com
2) ПУТТИ

Барои Linux:
1) сот

Шумо метавонед Eclipse, IDA Pro ё radare2-ро ҳамчун муштарии GDB истифода баред.

Чӣ тавр он кор мекунад?

Барои иҷрои нармафзор дар эмулятор, дастгоҳи виртуалиро, ки аналоги дастгоҳи воқеӣ аст, "ҷамъ кардан" лозим аст.

Таҷҳизоти воқеии ("rhino") метавонад дар диаграммаи блок нишон дода шавад:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори 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"]
  ]
}

Ба параметр диққат диҳед насбкардашуда фасли парамҳо номи файлест, ки метавонад ба дастгоҳи виртуалӣ ҳамчун нармафзор бор карда шавад.

Дастгоҳи маҷозӣ ва ҳамкории он бо системаи асосии оператсионӣ бо диаграммаи зерин тасвир карда мешавад:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Намунаи санҷишии ҷории эмулятор ҳамкориро бо портҳои COM-и ОС-и асосӣ дар бар мегирад (debug UART ва UART барои модули Bluetooth). Инҳо метавонанд портҳои воқеие бошанд, ки ба онҳо дастгоҳҳо пайвастанд ё портҳои виртуалии COM (барои ин ба шумо танҳо лозим аст com0com/socat).

Дар айни замон ду роҳи асосии ҳамкорӣ бо эмулятор аз берун вуҷуд дорад:

  • Протоколи GDB RSP (мувофиқин, асбобҳое, ки ин протоколро дастгирӣ мекунанд, Eclipse / IDA / radare2 мебошанд);
  • сатри фармони эмулятори дохилӣ (Argparse ё Python).

Портҳои виртуалии COM

Барои муошират кардан бо UART дастгоҳи виртуалӣ дар мошини маҳаллӣ тавассути терминал, шумо бояд як ҷуфт портҳои COM виртуалии алоқамандро эҷод кунед. Дар ҳолати мо, як порт аз ҷониби эмулятор истифода мешавад ва дуюмаш аз ҷониби барномаи терминал (PuTTY ё экран) истифода мешавад:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Истифодаи com0com

Портҳои виртуалии COM бо истифода аз утилитаи насбкунӣ аз маҷмӯаи com0com танзим карда мешаванд (версияи консол - C: Файлҳои Барнома (x86)com0comsetupс.exe, ё версияи GUI - C: Файлҳои барнома (x86) com0comsetupg.exe):

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Қуттиҳоро тафтиш кунед аз ҳад зиёди буферро фаъол созед барои ҳамаи портҳои виртуалии офаридашуда, дар акси ҳол эмулятор посухи порти COM-ро интизор мешавад.

Истифодаи socat

Дар системаҳои UNIX портҳои маҷозии COM аз ҷониби эмулятор бо истифода аз утилитаи socat ба таври худкор эҷод карда мешаванд; барои ин танҳо ҳангоми оғози эмулятор префиксро дар номи порт муайян кунед. socat:.

Интерфейси сатри фармони дохилӣ (Argparse ё Python)

Азбаски Kopycat як барномаи консолист, эмулятор ду варианти интерфейси сатри фармонро барои ҳамкорӣ бо объектҳо ва тағирёбандаҳои он пешниҳод мекунад: Argparse ва Python.

Argparse як CLI аст, ки дар Kopycat сохта шудааст ва ҳамеша барои ҳама дастрас аст.

CLI алтернативӣ тарҷумони Python мебошад. Барои истифодаи он, шумо бояд модули Jep Python -ро насб кунед ва эмуляторро барои кор бо 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.

Дар файли партияи эмулятор барои системаи шумо (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

Фармони иҷро кардани 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

Барои содда кардани санҷиш, мо нармафзори Rhino-ро ҳамчун файли манбаъ барои таҳлил дар IDA дар шакл истифода мебарем Файли ELF (маълумоти мета дар он ҷо нигоҳ дошта мешавад).

Шумо инчунин метавонед нармафзори асосиро бе маълумоти мета истифода баред.

Пас аз оғози Kopycat дар IDA Pro, дар менюи Debugger ба банди "Ивазкунандаи ислоҳкунанда…"Ва интихоб кунед"Debuger GDB дурдаст". Баъд, пайвастшавиро насб кунед: меню Debugger - Имконоти раванд…

Арзишҳоро таъин кунед:

  • Ариза - ҳама гуна арзиш
  • Номи асосӣ: 127.0.0.1 (ё суроғаи IP-и мошини дурдаст, ки дар он Kopycat кор мекунад)
  • Порт: 23946

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Акнун тугмаи ислоҳкунӣ дастрас мешавад (калиди F9):

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Барои пайваст шудан ба модули хатогиҳо дар эмулятор, онро клик кунед. IDA ба реҷаи ислоҳкунӣ мегузарад, тирезаҳои иловагӣ дастрас мешаванд: маълумот дар бораи регистрҳо, дар бораи стек.

Акнун мо метавонем ҳамаи хусусиятҳои стандартии ислоҳкунандаро истифода барем:

  • зина ба зина иҷро кардани дастурҳо (Қадам ба қадам и Қадам — калидҳои F7 ва F8 мутаносибан);
  • оғоз ва таваққуф кардани иҷро;
  • эҷод кардани нуқтаҳои танаффус ҳам барои код ва ҳам маълумот (калиди F2).

Пайвастшавӣ ба ислоҳкунанда маънои иҷро кардани коди нармафзорро надорад. Мавқеи иҷроиши ҷорӣ бояд суроға бошад 0x08006A74 — оғози кор Reset_Handler. Агар шумо рӯйхатро ба поён ҳаракат кунед, шумо метавонед занги функсияро бинед асосӣ. Шумо метавонед курсорро дар ин сатр ҷойгир кунед (суроға 0x08006ABE) ва амалиётро иҷро кунед То курсор иҷро кунед (калиди F4).

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Баъдан, шумо метавонед F7-ро пахш кунед, то функсияро ворид кунед асосӣ.

Агар шумо фармонро иҷро кунед Равандро идома диҳед (Тугмаи F9), пас равзанаи "Лутфан интизор шавед" бо як тугма пайдо мешавад Бешубҳа:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Вақте ки шумо пахш мекунед Бешубҳа иҷрои коди нармафзор боздошта мешавад ва онро метавон аз ҳамон суроғае, ки дар коди он қатъ шуда буд, идома дод.

Агар шумо иҷро кардани кодро идома диҳед, шумо дар терминалҳои ба портҳои виртуалии COM пайвастшуда сатрҳои зеринро хоҳед дид:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Мавҷудияти хати "пайванди давлатӣ" аз он шаҳодат медиҳад, ки модули виртуалии Bluetooth ба режими қабули маълумот аз порти COM корбар гузаштааст.

Акнун дар терминали Bluetooth (COM29 дар расм) шумо метавонед фармонҳоро мувофиқи протоколи Rhino ворид кунед. Масалан, фармони "MEOW" сатри "mur-mur" -ро ба терминали Bluetooth бармегардонад:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Ба ман тақлид накунед

Ҳангоми сохтани эмулятор, шумо метавонед сатҳи тафсилот/эмулятсияи дастгоҳи мушаххасро интихоб кунед. Масалан, модули Bluetooth-ро бо роҳҳои гуногун тақлид кардан мумкин аст:

  • дастгоҳ пурра бо маҷмӯи пурраи фармонҳо тақлид карда мешавад;
  • Фармонҳои AT тақлид карда мешаванд ва ҷараёни маълумот аз порти COM-и системаи асосӣ қабул карда мешавад;
  • дастгоҳи виртуалӣ интиқоли пурраи маълумотро ба дастгоҳи воқеӣ таъмин мекунад;
  • ҳамчун нотаҳои оддӣ, ки ҳамеша "OK" -ро бармегардонад.

Варианти кунунии эмулятор равиши дуюмро истифода мебарад - модули виртуалии Bluetooth конфигуратсияро иҷро мекунад, ки пас аз он ба ҳолати "прокси" маълумот аз порти COM-и системаи асосӣ ба порти UART-и эмулятор мегузарад.

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Имконияти асбобсозии оддии кодро дар сурате дида мебароем, ки ягон қисми периферия иҷро нашавад. Масалан, агар таймер барои назорати интиқоли маълумот ба DMA сохта нашуда бошад (тафтиш дар функсия анҷом дода мешавад ws2812b_waitвоқеъ дар 0x08006840), он гоҳ нармафзор ҳамеша интизор мешавад, ки парчам барқарор карда шавад бандвоқеъ дар 0x200004C4ки ишғоли хати маълумоти DMA-ро нишон медиҳад:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Мо метавонем ин вазъиятро тавассути аз нав танзим кардани парчам дастӣ ҳал кунем банд фавран пас аз насб кардани он. Дар IDA Pro, шумо метавонед функсияи Python эҷод кунед ва онро дар нуқтаи танаффус даъват кунед ва пас аз навиштани арзиши 1 ба парчам худи нуқтаи шикастро дар код гузоред. банд.

Коркарди нуқта

Аввалан, биёед дар IDA функсияи Python эҷод кунем. Меню Файл - Фармони скрипт...

Дар рӯйхат дар тарафи чап порчаи нав илова кунед, ба он ном диҳед (масалан, БПТ),
Дар майдони матн дар тарафи рост, рамзи функсияро ворид кунед:

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

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Пас аз он мо пахш мекунем давидан ва равзанаи скриптро пӯшед.

Акнун биёед ба рамзи дар 0x0800688A, нуқтаи танаффусро таъин кунед (калиди F2), таҳрир кунед (менюи контекстӣ Таҳрири нуқтаи қатъ...), фаромӯш накунед, ки навъи скриптро ба Python таъин кунед:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед
Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Агар арзиши парчами ҷорӣ банд ба 1 баробар аст, пас шумо бояд функсияро иҷро кунед skip_dma дар хати скрипт:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Агар шумо нармафзори нармафзорро барои иҷро иҷро кунед, триггери коди коркарди нуқтаро дар равзанаи IDA дидан мумкин аст. Натиҷаи аз рӯи сатр Skipping wait ws2812.... Акнун нармафзори нармафзор барои барқарор кардани парчам интизор нахоҳад шуд банд.

Мулоқот бо эмулятор

Тақлид ба хотири тақлид гумон аст, ки боиси лаззат ва шодӣ шавад. Ин хеле ҷолибтар аст, агар эмулятор ба тадқиқотчӣ дар дидани маълумот дар хотира ё муқаррар кардани таъсири мутақобилаи риштаҳо кӯмак кунад.

Мо ба шумо нишон медиҳем, ки чӣ гуна ба таври динамикӣ ҳамкорӣ байни вазифаҳои RTOS барқарор кардан мумкин аст. Шумо бояд аввал иҷрои рамзро таваққуф кунед, агар он иҷро шавад. Агар шумо ба функсия равед Bluetooth_task_entry ба филиали коркарди фармони "LED" (суроға 0x080057B8), пас шумо метавонед бубинед, ки чӣ аввал офарида шудааст ва сипас ба навбати система фиристода мешавад ledControlQueueHandle баъзе паём.

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Шумо бояд нуқтаи танаффусро барои дастрасӣ ба тағирёбанда таъин кунед ledControlQueueHandleвоқеъ дар 0x20000624 ва иҷрои кодро идома диҳед:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Дар натиҷа, истгоҳ аввал дар суроға сурат мегирад 0x080057CA пеш аз даъват кардани функсия osMailAlloc, баъд ба адреси 0x08005806 пеш аз даъват кардани функсия osMailPut, баъд аз муддате — ба адреси 0x08005BD4 (пеш аз даъват кардани функсия osMailGet), ки ба функсия тааллуқ дорад leds_task_entry (LED-вазифа), яъне вазифаҳо иваз карда шуданд ва ҳоло LED-вазифа идораро гирифт.

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори 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 истифода хоҳем кард Системаи Workbench барои STM32.

Барои он ки эмулятор нармафзори мустақим дар Eclipse тартибшударо бор кунад, шумо бояд параметрро илова кунед firmware=null ба фармони оғози эмулятор:

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

Танзими конфигуратсияи дебаг

Дар Eclipse, менюро интихоб кунед Иҷро кардан - Конфигуратсияҳои хатогиҳо... Дар равзанаи кушодашуда, дар бахш Debugging hardware GDB ба шумо лозим аст, ки конфигуратсияи нав илова кунед, пас дар ҷадвали "Асосӣ" лоиҳаи ҷорӣ ва барномаро барои ислоҳи ислоҳ нишон диҳед:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Дар ҷадвали "Debugger" шумо бояд фармони GDB-ро муайян кунед:
${openstm32_compiler_path}arm-none-eabi-gdb

Ва инчунин параметрҳоро барои пайвастшавӣ ба сервери GDB (хост ва порт) ворид кунед:

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Дар ҷадвали "Оғоз" шумо бояд параметрҳои зеринро муайян кунед:

  • қуттии қайдро фаъол созед Тасвирро бор кунед (то ки тасвири насбшудаи нармафзор ба эмулятор бор карда шавад);
  • қуттии қайдро фаъол созед Рамзҳои боркунӣ;
  • фармони оғозро илова кунед: set $pc = *0x08000004 (регистри компютерро ба арзиши хотираи суроға муқаррар кунед 0x08000004 - суроға дар он ҷо нигоҳ дошта мешавад ResetHandler).

Диққат диҳед, агар шумо нахоҳед, ки файли нармафзорро аз Eclipse зеркашӣ кунед, пас имконоти Тасвирро бор кунед и Фармонҳоро иҷро кунед нишон додан лозим нест.

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Пас аз клик кардани Debug, шумо метавонед дар реҷаи ислоҳкунанда кор кунед:

  • қадам ба қадам иҷро кардани код
    Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед
  • мутақобила бо нуқтаҳои қатъ
    Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

эрод гирифтан. Eclipse, hmm... баъзе нозукиҳо дорад... ва шумо бояд бо онҳо зиндагӣ кунед. Масалан, агар ҳангоми оғоз кардани ислоҳкунанда паёми "Не манбае дастрас барои "0x0″" пайдо шавад, пас фармони Қадамро иҷро кунед (F5)

Rhinoceros дар дохили гурба - нармафзорро дар эмулятори Kopycat иҷро кунед

Ба ҷои хулоса

Тақлид кардани рамзи модарӣ як чизи хеле ҷолиб аст. Барои таҳиягари дастгоҳ имкон медиҳад, ки нармафзори нармафзорро бе дастгоҳи воқеӣ ислоҳ кунад. Барои тадқиқотчӣ, ин як имконияти гузаронидани таҳлили коди динамикӣ аст, ки ҳатто бо дастгоҳ на ҳамеша имконпазир аст.

Мо мехоҳем ба мутахассисон асбобе пешниҳод кунем, ки қулай, мӯътадил содда ва барои насб кардан ва кор кардан кӯшишу вақти зиёдро талаб намекунад.

Дар шарҳҳо дар бораи таҷрибаи худ бо истифодаи эмуляторҳои сахтафзор нависед. Мо шуморо ба муҳокима даъват менамоем ва бо омодагӣ ба саволҳо ҷавоб хоҳем дод.

Танҳо корбарони сабтиномшуда метавонанд дар пурсиш иштирок кунанд. даромад, Лутфан.

Шумо эмуляторро барои чӣ истифода мебаред?

  • Ман нармафзори нармафзорро таҳия мекунам (debug).

  • Ман нармафзори нармафзорро меомӯзам

  • Ман бозиҳоро оғоз мекунам (Dendi, Sega, PSP)

  • чизи дигар (дар шарҳҳо нависед)

7 корбар овоз доданд. 2 корбар худдорӣ карданд.

Шумо кадом нармафзорро барои тақлид кардани рамзи модарӣ истифода мебаред?

  • QEMU

  • Муҳаррики Unicorn

  • Протез

  • чизи дигар (дар шарҳҳо нависед)

6 корбар овоз доданд. 2 корбар худдорӣ карданд.

Шумо чиро дар эмуляторе, ки истифода мекунед, беҳтар кардан мехоҳед?

  • Ман суръат мехоҳам

  • Ман осонии насб кардан / оғоз кардан мехоҳам

  • Ман мехоҳам имконоти бештар барои ҳамкорӣ бо эмулятор (API, қалмоқҳо)

  • Ман аз ҳама чиз қаноатмандам

  • чизи дигар (дар шарҳҳо нависед)

8 корбар овоз доданд. 1 корбар худдорӣ кард.

Манбаъ: will.com

Илова Эзоҳ