Муурны доторхи хирс - програмыг Kopycat эмулятор дээр ажиллуул

Муурны доторхи хирс - програмыг Kopycat эмулятор дээр ажиллуул

Уулзалтын хүрээнд 0x0A DC7831 DEF CON Нижний Новгород 16-р сарын XNUMX-нд бид хоёртын кодын эмуляцийн үндсэн зарчмууд болон өөрсдийн хөгжүүлэлт болох hardware platform emulator-ийн талаарх илтгэлийг танилцууллаа. Хувилагч.

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

Эрьт урьдын түүх

Эрт дээр үед алс холын галактикт

Хэдэн жилийн өмнө манай лабораторид төхөөрөмжийн програм хангамжийг судлах шаардлагатай байсан. Програм хангамжийг шахаж, ачаалагчаар задалсан. Тэр үүнийг маш төвөгтэй аргаар хийж, санах ой дахь өгөгдлийг хэд хэдэн удаа шилжүүлсэн. Дараа нь програм хангамж өөрөө дагалдах төхөөрөмжтэй идэвхтэй харилцаж байв. Мөн энэ бүхэн MIPS цөм дээр.

Объектив шалтгааны улмаас байгаа эмуляторууд бидэнд тохирохгүй байсан ч бид кодыг ажиллуулахыг хүссэн хэвээр байна. Дараа нь бид өөрсдийн эмулятор хийхээр шийдсэн бөгөөд энэ нь хамгийн бага зүйлийг хийж, үндсэн програмыг задлах боломжийг бидэнд олгоно. Бид үүнийг туршиж үзсэн бөгөөд энэ нь амжилттай болсон. Үндсэн програм хангамжийг гүйцэтгэхийн тулд нэмэлт төхөөрөмжүүдийг нэмбэл яах вэ гэж бид бодсон. Энэ нь тийм ч их өвдсөнгүй - бас үр дүнд хүрсэн. Бид дахин бодож, бүрэн хэмжээний эмулятор хийхээр шийдсэн.

Үүний үр дүнд компьютерийн системийн эмулятор гарч ирэв Хувилагч.

Муурны доторхи хирс - програмыг Kopycat эмулятор дээр ажиллуул
Яагаад Kopycat гэж?

Үгийн тоглоом байдаг.

  1. copycat (Англи хэл, нэр үг [ˈ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 болон модуль jep эмулятор дотор Python ашиглах. Та Windows-д зориулсан WHL модулийг Jep үүсгэж болно эндээс татаж авна уу.

Windows-ийн хувьд:
1) com0com
2) БУРХАН

Линуксийн хувьд:
1) сокат

Та Eclipse, IDA Pro эсвэл radare2-г GDB клиент болгон ашиглаж болно.

энэ нь хэрхэн ажилладаг вэ?

Эмулятор дээр програм хангамжийг ажиллуулахын тулд бодит төхөөрөмжийн аналог болох виртуал төхөөрөмжийг "угсрах" шаардлагатай.

Жинхэнэ төхөөрөмжийг ("хирс") блок диаграммд харуулж болно.

Муурны доторхи хирс - програмыг 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: Програмын файлууд (x86)com0comsetupс.exe, эсвэл GUI хувилбар - C: Програмын файлууд (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-ээр суулгаж болно:

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-д зориулсан, хуулбарлагч - Линуксийн хувьд) параметрүүдийн жагсаалтад оруулна 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 хэрэгслийг ашиглан Линукс дээр ажиллах тушаал:

./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" команд нь "mur-mur" мөрийг Bluetooth терминал руу буцаана.

Муурны доторхи хирс - програмыг Kopycat эмулятор дээр ажиллуул

Намайг бүрэн дуурайж болохгүй

Эмулятор бүтээхдээ та тодорхой төхөөрөмжийн нарийвчлал/эмуляцийн түвшинг сонгож болно. Жишээлбэл, Bluetooth модулийг янз бүрийн аргаар дууриаж болно.

  • төхөөрөмж нь бүрэн хэмжээний командуудаар бүрэн дууриагдсан;
  • AT командуудыг дууриаж, мэдээллийн урсгалыг үндсэн системийн COM портоос хүлээн авдаг;
  • виртуал төхөөрөмж нь өгөгдлийг бодит төхөөрөмж рүү бүрэн шилжүүлэх боломжийг олгодог;
  • үргэлж "OK" гэж буцаадаг энгийн бүдүүвч шиг.

Эмуляторын одоогийн хувилбар нь хоёр дахь аргыг ашигладаг - виртуал Bluetooth модуль нь тохиргоог хийж, дараа нь үндсэн системийн COM портоос эмуляторын UART порт руу өгөгдөл дамжуулах горимд шилждэг.

Муурны доторхи хирс - програмыг Kopycat эмулятор дээр ажиллуул

Захын зарим хэсэг хэрэгжээгүй тохиолдолд кодын энгийн хэрэглүүр хийх боломжийг авч үзье. Жишээлбэл, хэрэв DMA руу өгөгдөл дамжуулахыг хариуцдаг таймер үүсгэгдээгүй бол (шалгалтыг функцэд гүйцэтгэдэг. ws2812b_хүлээгээрэйдээр байрладаг 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_даалгаврын_оруулга "LED" командын боловсруулах салбар руу (хаяг 0x080057B8), дараа нь та эхлээд юу үүсгэж, дараа нь системийн дараалал руу илгээгдсэнийг харж болно ledControlQueueHandle зарим мессеж.

Муурны доторхи хирс - програмыг Kopycat эмулятор дээр ажиллуул

Та хувьсагчид хандахын тулд таслах цэгийг тохируулах хэрэгтэй ledControlQueueHandleдээр байрладаг 0x20000624 мөн кодыг үргэлжлүүлэн ажиллуулна уу:

Муурны доторхи хирс - програмыг Kopycat эмулятор дээр ажиллуул

Үүний үр дүнд зогсолт нь эхлээд хаягаар явагдана 0x080057CA функцийг дуудахын өмнө osMailAlloc, дараа нь хаягаар 0x08005806 функцийг дуудахын өмнө osMailPut, дараа нь хэсэг хугацааны дараа - хаяг руу 0x08005BD4 (функцийг дуудахын өмнө osMailGet), функцэд хамаарах LED_даалгаврын_оруулга (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 эмулятор дээр ажиллуул

"Debugger" таб дээр та GDB командыг зааж өгөх хэрэгтэй:
${openstm32_compiler_path}arm-none-eabi-gdb

Мөн GDB серверт (хост ба порт) холбогдох параметрүүдийг оруулна уу:

Муурны доторхи хирс - програмыг Kopycat эмулятор дээр ажиллуул

"Эхлүүлэх" таб дээр та дараах параметрүүдийг зааж өгөх ёстой.

  • шалгах нүдийг идэвхжүүлнэ үү Зураг ачаалах (ингэснээр угсарсан програмын дүрсийг эмулятор руу ачаалах болно);
  • шалгах нүдийг идэвхжүүлнэ үү Тэмдэгтүүдийг ачаалах;
  • эхлүүлэх тушаал нэмэх: set $pc = *0x08000004 (PC регистрийг хаяг дээрх санах ойн утгыг тохируулна уу 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

сэтгэгдэл нэмэх