Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Жолугушуунун алкагында 0x0A DC7831 DEF CON Нижний Новгород 16-февралда биз бинардык кодду эмуляциялоонун негизги принциптери жана өзүбүздүн өнүгүүбүз - аппараттык платформа эмулятору жөнүндө отчетту тартууладык. Copycat.

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

prehistory

Бир топ убакыт мурун, алыскы галактикада

Бир-эки жыл мурун биздин лабораторияда аппараттын микропрограммасын изилдөө зарылдыгы келип чыккан. Микропрограмма жүктөөчү менен кысылып, таңгактан чыгарылды. Ал муну өтө татаал жол менен жасаган, эстутумдагы маалыматтарды бир нече жолу алмаштырган. Ал эми микропрограмманын өзү перифериялык түзүлүштөр менен активдүү иштешкен. Мунун баары MIPS өзөгүндө.

Объективдүү себептерден улам, жеткиликтүү эмуляторлор бизге туура келген жок, бирок биз дагы эле кодду иштеткибиз келди. Андан кийин биз өзүбүздүн эмуляторубузду жасоону чечтик, ал минималдуу нерсени жасайт жана негизги микропрограмманы ачууга мүмкүндүк берет. Биз аракет кылып көрдүк жана ал иштеди. Негизги микропрограмманы аткаруу үчүн перифериялык түзүлүштөрдү кошсок эмне деп ойлодук. Бул анча деле ооруган жок - жана ал да иштеди. Биз дагы бир жолу ойлонуп, толук кандуу эмулятор жасоону чечтик.

Натыйжада компьютер системаларынын эмулятору пайда болду Copycat.

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз
Эмне үчүн Kopycat?

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

  1. Copycat (англисче, зат атооч [ˈkɒpɪkæt]) - тууроочу, тууроочу
  2. мышык (англисче, зат атооч [ˈkæt]) - мышык, мышык - долбоордун жаратуучуларынын биринин сүйүктүү жаныбары
  3. "K" тамгасы Котлин программалоо тилинен алынган

Copycat

Эмуляторду түзүүдө абдан конкреттүү максаттар коюлган:

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

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

Өнүгүү эки жылдан бир аз ашык убакыттан бери жүрүп жатат жана жигердүү уланууда. Бул убакыттын ичинде MIPS, x86, V850ES, ARM жана PowerPC процессорунун өзөктөрү ишке ашырылган.

Долбоор өсүп жатат жана аны кеңири коомчулукка тартуулоо мезгили келди. Биз кийинчерээк долбоордун деталдуу сүрөттөлүшүн жасайбыз, бирок азыр биз Kopycat колдонууга басым жасайбыз.

Эң чыдамы жоктор үчүн эмулятордун промо версиясын жүктөп алса болот байланыш.

Эмулятордогу керик

Эскерте кетсек, буга чейин SMARTRHINO-2018 конференциясына тескери инженерия көндүмдөрүн үйрөтүү үчүн «Риносерос» тесттик аппараты түзүлгөн. Статикалык микропрограмманы талдоо процесси сүрөттөлгөн бул макалада.

Эми "динамерлерди" кошуп, микропрограмманы эмулятордо иштетүүгө аракет кылалы.

Биз керек:
1) Java 1.8
2) Python жана модулу jep эмулятордун ичинде Python колдонуу үчүн. Сиз Windows үчүн WHL модулун Jep кура аласыз бул жерден жүктөп алыңыз.

Windows үчүн:
1) com0com
2) шпаклевка

Linux үчүн:
1) сокат

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

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

Виртуалдык түзүлүш жана анын негизги операциялык система менен өз ара аракеттенүүсү төмөнкү диаграмма менен көрсөтүлүшү мүмкүн:

Мышыктын ичиндеги керик - микропрограмманы 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

Jepти Windows'ко орнотуу үчүн, алгач 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 иштетилгенден кийин, мүчүлүштүктөрдү оңдоочу менюдан " пунктка өтүңүз.Мүчүлүштүктөрдү оңдоочу…"жана тандоо"Алыскы GDB мүчүлүштүктөрдү оңдоочу". Андан кийин, байланышты орнотуңуз: меню Мүчүлүштүктөрдү оңдоочу - Процесс параметрлери…

Маанилерди коюу:

  • Колдонмо - ар кандай маани
  • Хост аты: 127.0.0.1 (же Kopycat иштеп жаткан алыскы машинанын IP дареги)
  • Порт: 23946

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Эми мүчүлүштүктөрдү оңдоо баскычы жеткиликтүү болот (F9 баскычы):

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

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

Эми биз мүчүлүштүктөрдү оңдоочунун бардык стандарттык функцияларын колдоно алабыз:

  • нускамаларды этап-этабы менен аткаруу (Кирүү и Басыңыз — тиешелүүлүгүнө жараша F7 жана F8 баскычтары);
  • аткарууну баштоо жана токтотуу;
  • код жана маалыматтар үчүн үзгүлтүккө учуроо чекиттерин түзүү (F2 баскычы).

Мүчүлүштүктөрдү оңдоочуга туташуу микропрограмманын кодун иштетүү дегенди билдирбейт. Учурдагы аткаруу орду дарек болушу керек 0x08006A74 — функциянын башталышы Reset_Handler. Эгер сиз листингди ылдый жылдырсаңыз, функциянын чакырылышын көрө аласыз негизги. Курсорду ушул сапка жайгаштырсаңыз болот (дареги 0x08006ABE) жана операцияны аткарыңыз Курсорго чейин иштетүү (F4 баскычы).

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Андан кийин, функцияны киргизүү үчүн F7 баскычын бассаңыз болот негизги.

Esli vypolnit буйругу Процессти улантуу (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, raspolojennoy по адресу 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 эмуляторунда иштетиңиз

Андан кийин, чыкылдатыңыз Run жана скрипт терезесин жабыңыз.

Эми кодго баралы 0x0800688A, үзгүлтүккө учуроо чекин коюу (F2 баскычы), аны түзөтүү (контексттик меню Токтоо чекитин түзөтүү...), скрипт түрүн Python кылып коюуну унутпаңыз:

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз
Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Эгерде учурдагы желектин мааниси алек 1ге барабар болсо, анда сиз функцияны аткарышыңыз керек skip_dma скрипт сапта:

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Эгерде сиз микропрограмманы аткаруу үчүн иштетсеңиз, IDA терезесинде үзгүлтүккө учуроочу коддун иштетилишин көрө аласыз. продукция линия боюнча Skipping wait ws2812.... Эми микропрограмма желектин баштапкы абалга келтирилишин күтпөйт алек.

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

Эмуляция үчүн эмуляция ырахат жана кубаныч алып келиши күмөн. Эмулятор изилдөөчүгө эстутумдагы маалыматтарды көрүүгө же жиптердин өз ара аракеттенүүсүн түзүүгө жардам берсе, алда канча кызыктуу.

Биз сизге RTOS тапшырмаларынын ортосундагы өз ара аракеттенүүнү кантип динамикалык түрдө орнотууну көрсөтөбүз. Эгер код иштеп жатса, алгач анын аткарылышын тындыруу керек. Эгер сиз функцияга барсаңыз bluetooth_task_entry "LED" командасынын иштетүү тармагына (дареги 0x080057B8), анда сиз алгач түзүлүп, андан кийин системанын кезегине жөнөтүлгөн нерсени көрө аласыз ledControlQueueHandle кээ бир билдирүү.

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Өзгөрүлмөлөргө жетүү үчүн сиз үзгүлтүккө учурашыңыз керек ledControlQueueHandle, raspolojennoy по адресу 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 сервери жана эстутум жайгашуусу менен иштөөдө көйгөйлөр бар, ошондуктан үзгүлтүккө учуратуу пункттары жана кадамдар иштебейт (command ds). Бул жакын арада оңдолот деп үмүттөнөбүз.

Eclipse менен иштөө

Эмуляторду колдонуунун варианттарынын бири - иштелип жаткан аппараттын микропрограммасын оңдоо. Тактык үчүн, биз Rhino микропрограммасын да колдонобуз. Сиз микропрограмма булактарын жүктөп алсаңыз болот бул жерде.

Биз топтомдон Eclipseди IDE катары колдонобуз STM32 үчүн System Workbench.

Эмулятор Eclipseде түз түзүлгөн микропрограмманы жүктөө үчүн, сиз параметрди кошушуңуз керек. firmware=null эмуляторду ишке киргизүү буйругуна:

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

Мүчүлүштүктөрдү оңдоо конфигурациясын орнотуу

Eclipseде менюну тандаңыз Иштетүү - Мүчүлүштүктөрдү оңдоо конфигурациялары... Ачылган терезеде, бөлүмдө GDB аппараттык мүчүлүштүктөрдү оңдоо жаңы конфигурацияны кошушуңуз керек, андан кийин "Негизги" өтмөктө мүчүлүштүктөрдү оңдоо үчүн учурдагы долбоорду жана колдонмону көрсөтүңүз:

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

"Debugger" өтмөгүндө сиз GDB буйругун көрсөтүшүңүз керек:
${openstm32_compiler_path}arm-none-eabi-gdb

Ошондой эле GDB серверине (хост жана порт) туташуу үчүн параметрлерди киргизиңиз:

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

"Startup" өтмөгүндө сиз төмөнкү параметрлерди көрсөтүшүңүз керек:

  • белгилөө кутучасын иштетүү Сүрөттү жүктөө (чогулган микропрограмманын сүрөтү эмуляторго жүктөлүшү үчүн);
  • белгилөө кутучасын иштетүү Символдорду жүктөө;
  • ишке киргизүү буйругун кошуу: set $pc = *0x08000004 (ЖК реестрин дарек боюнча эстутумдагы мааниге коюңуз 0x08000004 - дарек ошол жерде сакталат ResetHandler).

көңүл буруңуздар, эгер сиз Eclipseден микропрограмма файлын жүктөөнү каалабасаңыз, анда параметрлер Сүрөттү жүктөө и Буйруктарды иштетүү көрсөтүүнүн кереги жок.

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Мүчүлүштүктөрдү оңдоону чыкылдаткандан кийин, мүчүлүштүктөрдү оңдоочу режимде иштей аласыз:

  • кадам-кадам кодду аткаруу
    Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз
  • үзүү чекиттери менен өз ара аракеттенүү
    Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

пикир. Eclipse, hmm... кээ бир кызыкчылыктар бар... жана алар менен жашашыңыз керек. Мисалы, мүчүлүштүктөрдү оңдоону баштаганда “0x0″ үчүн булак жок” деген билдирүү пайда болсо, анда Кадам буйругун аткарыңыз (F5)

Мышыктын ичиндеги керик - микропрограмманы Kopycat эмуляторунда иштетиңиз

Ордуна корутундусу

Жергиликтүү кодду эмуляциялоо абдан кызыктуу нерсе. Түзмөктү иштеп чыгуучу үчүн микропрограмманы чыныгы түзмөксүз оңдоо мүмкүн болот. Изилдөөчү үчүн бул динамикалык код анализин жүргүзүү мүмкүнчүлүгү, ал дайыма эле аппарат менен да мүмкүн боло бербейт.

Биз адистерди ыңгайлуу, орточо жөнөкөй жана орнотуу жана иштетүү көп күчтү жана убакытты талап кылбаган курал менен камсыз кылгыбыз келет.

Аппараттык эмуляторлорду колдонуу тажрыйбаңыз жөнүндө комментарийлерге жазыңыз. Сизди талкуулоого чакырабыз жана суроолорго жооп берүүгө кубанычтабыз.

Сурамжылоого катталган колдонуучулар гана катыша алышат. Кирүү, өтүнөмүн.

Эмуляторду эмне үчүн колдонуп жатасыз?

  • Мен микропрограмманы иштеп чыгам (дебаг).

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

  • Мен оюндарды ишке киргизем (Dendi, Sega, PSP)

  • дагы бир нерсе (комментарийге жаз)

7 колдонуучу добуш берди. 2 колдонуучу добуш берүүдөн баш тартты.

Жергиликтүү кодду эмуляциялоо үчүн кандай программаны колдоносуз?

  • QEMU

  • Unicorn мотору

  • Суэнби

  • дагы бир нерсе (комментарийге жаз)

6 колдонуучу добуш берди. 2 колдонуучу добуш берүүдөн баш тартты.

Сиз колдонуп жаткан эмулятордо эмнени жакшырткыңыз келет?

  • Мен ылдамдыкты каалайм

  • Мен орнотуунун/ишке киргизүүнүн жеңилдигин каалайм

  • Мен эмулятор менен иштешүүнүн көбүрөөк варианттарын каалайм (API, илгичтер)

  • Мен баарына ыраазымын

  • дагы бир нерсе (комментарийге жаз)

8 колдонуучу добуш берди. 1 колдонуучу добуш берүүдөн баш тартты.

Source: www.habr.com

Комментарий кошуу