Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում

Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում

Հանդիպման շրջանակներում 0x0A DC7831 DEF CON Նիժնի Նովգորոդ Փետրվարի 16-ին մենք ներկայացրեցինք զեկույց երկուական կոդի էմուլյացիայի հիմնական սկզբունքների և մեր սեփական մշակման վերաբերյալ՝ ապարատային հարթակի էմուլյատոր։ Copycat.

Այս հոդվածում մենք նկարագրելու ենք, թե ինչպես գործարկել սարքի որոնվածը էմուլյատորում, ցուցադրել փոխազդեցությունը կարգաբերիչի հետ և կատարել որոնվածի կարճ դինամիկ վերլուծություն:

նախապատմությանը

Շատ վաղուց հեռու մի գալակտիկայում

Մի քանի տարի առաջ մեր լաբորատորիայում անհրաժեշտություն առաջացավ ուսումնասիրել սարքի որոնվածը։ Որոնվածը սեղմվել և ապափաթեթավորվել է bootloader-ով: Նա դա արեց շատ բարդ ձևով՝ մի քանի անգամ տեղափոխելով տվյալները հիշողության մեջ։ Եվ որոնվածն ինքնին այնուհետև ակտիվորեն համագործակցում էր ծայրամասային սարքերի հետ: Եվ այս ամենը MIPS միջուկի վրա:

Օբյեկտիվ պատճառներով, հասանելի էմուլյատորները մեզ չէին համապատասխանում, բայց մենք դեռ ցանկանում էինք գործարկել կոդը: Այնուհետև մենք որոշեցինք ստեղծել մեր էմուլյատորը, որը թույլ կտա մեզ բացել հիմնական որոնվածը: Մենք փորձեցինք այն և ստացվեց: Մենք մտածեցինք, իսկ եթե ավելացնենք ծայրամասային սարքեր՝ հիմնական որոնվածը նույնպես կատարելու համար: Դա շատ չտուժեց, և դա նույնպես ստացվեց: Մենք նորից մտածեցինք և որոշեցինք ստեղծել լիարժեք էմուլյատոր:

Արդյունքը եղավ համակարգչային համակարգերի էմուլյատորը Copycat.

Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում
Ինչու՞ Kopycat:

Բառախաղ կա.

  1. copycat (անգլերեն, noun [ˈkɒpɪkæt]) - ընդօրինակող, ընդօրինակող
  2. կատու (անգլերեն, noun [ˈkæt]) - կատու, կատու - նախագծի ստեղծողներից մեկի սիրելի կենդանին
  3. «K» տառը Կոտլին ծրագրավորման լեզվից է

Copycat

Էմուլյատորը ստեղծելիս շատ կոնկրետ նպատակներ են դրվել.

  • նոր ծայրամասային սարքեր, մոդուլներ, պրոցեսորային միջուկներ արագ ստեղծելու ունակություն.
  • տարբեր մոդուլներից վիրտուալ սարք հավաքելու ունակություն.
  • ցանկացած երկուական տվյալներ (որոնվածը) վիրտուալ սարքի հիշողության մեջ բեռնելու ունակություն.
  • snapshot-ների հետ աշխատելու ունակություն (համակարգի վիճակի նկարներ);
  • էմուլյատորի հետ ներկառուցված վրիպազերծիչի միջոցով փոխազդելու ունակություն.
  • գեղեցիկ ժամանակակից լեզու զարգացման համար:

Արդյունքում, ներդրման համար ընտրվեց Կոտլինը, ավտոբուսի ճարտարապետությունը (սա այն դեպքում, երբ մոդուլները միմյանց հետ շփվում են վիրտուալ տվյալների ավտոբուսների միջոցով), JSON՝ որպես սարքի նկարագրության ձևաչափ, և GDB RSP՝ որպես վրիպազերծիչի հետ փոխգործակցության արձանագրություն։

Զարգացումը շարունակվում է երկու տարուց մի փոքր ավելի և ակտիվորեն շարունակվում է: Այս ընթացքում ներդրվել են MIPS, x86, V850ES, ARM և PowerPC պրոցեսորային միջուկները։

Նախագիծը գնալով մեծանում է, և ժամանակն է այն ներկայացնել լայն հանրությանը։ Մենք ավելի ուշ կանենք նախագծի մանրամասն նկարագրությունը, բայց առայժմ կկենտրոնանանք Kopycat-ի օգտագործման վրա:

Ամենաանհամբերների համար կարելի է ներբեռնել էմուլյատորի պրոմո տարբերակը ՈՒղեցույց.

Rhino էմուլյատորում

Հիշեցնենք, որ ավելի վաղ SMARTRHINO-2018 կոնֆերանսի համար ստեղծվել էր «Rhinoceros» թեստային սարք՝ հակադարձ ինժեներական հմտություններ սովորեցնելու համար։ Ստատիկ որոնվածի վերլուծության գործընթացը նկարագրված է այս հոդվածը.

Հիմա եկեք փորձենք ավելացնել «բարձրախոսներ» և գործարկել որոնվածը էմուլատորում:

Մենք պետք է.
1) Java 1.8
2) Python և մոդուլ Ջեփ օգտագործել Python-ը էմուլյատորի ներսում: Դուք կարող եք ստեղծել WHL մոդուլ Jep Windows-ի համար բեռնել այստեղ.

Windows- ի համար.
1) com0com
2) PuTTY- ը

Linux-ի համար.
1) սոցատ

Որպես GDB հաճախորդ կարող եք օգտագործել Eclipse, IDA Pro կամ radare2:

Ինչպես է դա աշխատում.

Էմուլյատորում որոնվածը կատարելու համար անհրաժեշտ է «հավաքել» վիրտուալ սարք, որն իրական սարքի անալոգն է։

Իրական սարքը («ռնգեղջյուր») կարելի է ցույց տալ բլոկային դիագրամում.

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 պորտերի հետ (վրիպազերծել 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

Windows-ում Jep-ը տեղադրելու համար նախ պետք է տեղադրել Windows SDK-ն և համապատասխան Microsoft Visual Studio-ն։ Մենք ձեզ համար մի փոքր ավելի հեշտացրել ենք և WHL-ը կառուցում է JEP Windows-ի համար Python-ի ընթացիկ տարբերակների համար, այնպես որ մոդուլը կարող է տեղադրվել ֆայլից.

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 ֆայլ (այնտեղ պահվում է մետա տեղեկատվությունը):

Դուք կարող եք նաև օգտագործել հիմնական որոնվածը առանց մետա տեղեկատվության:

IDA Pro-ում Kopycat-ը գործարկելուց հետո Debugger-ի մենյուում անցեք կետին «Փոխարկել վրիպազերծիչը…«և ընտրիր»Հեռավոր GDB կարգաբերիչ«. Հաջորդը, կարգավորեք կապը. մենյու Վրիպազերծիչ – Գործընթացի ընտրանքներ…

Սահմանեք արժեքները.

  • Դիմում - ցանկացած արժեք
  • Հոսթի անունը՝ 127.0.0.1 (կամ հեռավոր մեքենայի IP հասցեն, որտեղ աշխատում է Kopycat-ը)
  • Port: 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 արժեքը դրոշի վրա գրելուց հետո ինքնին դնել ընդմիջման կետը կոդի մեջ: զբաղված.

Ընդմիջման կետի կարգավորիչ

Նախ, եկեք ստեղծենք Python գործառույթը IDA-ում: Մենյու Ֆայլ - Սցենար հրաման...

Ձախ կողմում գտնվող ցանկում ավելացրեք նոր հատված, անուն տվեք (օրինակ՝ BPT),
Աջ կողմում գտնվող տեքստային դաշտում մուտքագրեք գործառույթի կոդը.

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-task), այսինքն՝ առաջադրանքները փոխվեցին, և այժմ 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 Համակարգի աշխատանքային սեղան STM32-ի համար.

Որպեսզի էմուլյատորը բեռնի Eclipse-ում ուղղակիորեն կազմված որոնվածը, դուք պետք է ավելացնեք պարամետրը firmware=null էմուլյատորի գործարկման հրամանին.

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

Վրիպազերծման կարգավորումների կարգավորում

Eclipse-ում ընտրեք ցանկը Գործարկել - Վրիպազերծել կարգավորումները... Բացվող պատուհանում՝ բաժնում GDB ապարատային վրիպազերծում դուք պետք է ավելացնեք նոր կոնֆիգուրացիա, այնուհետև «Հիմնական» ներդիրում նշեք ընթացիկ նախագիծը և վրիպազերծման հավելվածը.

Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում

«Վրիպազերծիչ» ներդիրում դուք պետք է նշեք GDB հրամանը.
${openstm32_compiler_path}arm-none-eabi-gdb

Եվ նաև մուտքագրեք GDB սերվերին միանալու պարամետրերը (հյուրընկալող և նավահանգիստ).

Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում

«Գործարկման» ներդիրում դուք պետք է նշեք հետևյալ պարամետրերը.

  • միացնել վանդակը Բեռնել պատկերը (այնպես, որ հավաքված որոնվածի պատկերը բեռնված է էմուլատորի մեջ);
  • միացնել վանդակը Բեռնման նշաններ;
  • ավելացնել գործարկման հրամանը. set $pc = *0x08000004 (ՀՀ ռեգիստրը սահմանեք հասցեի հիշողության արժեքին 0x08000004 - հասցեն պահվում է այնտեղ ResetHandler).

Խնդրում ենք նկատի ունենալ,, եթե դուք չեք ցանկանում ներբեռնել որոնվածի ֆայլը Eclipse-ից, ապա ընտրանքները Բեռնել պատկերը и Գործարկել հրամանները կարիք չկա նշելու.

Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում

«Վրիպազերծում» սեղմելուց հետո կարող եք աշխատել վրիպազերծման ռեժիմում՝

  • կոդի քայլ առ քայլ կատարում
    Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում
  • փոխազդեցություն ընդմիջման կետերի հետ
    Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում

Նշում. Eclipse-ն ունի, հմմ... որոշ տարօրինակություններ... և դու պետք է ապրես դրանցով: Օրինակ, եթե վրիպազերծիչը գործարկելիս հայտնվում է «0x0»-ի համար հասանելի աղբյուր չկա» հաղորդագրությունը, ապա կատարեք «Քայլ» հրամանը (F5)

Rhinoceros-ը կատվի մեջ - գործարկեք որոնվածը Kopycat էմուլյատորում

Փոխարենը մի եզրակացության

Մայրենի կոդի նմանակումը շատ հետաքրքիր բան է: Սարքի մշակողի համար հնարավոր է դառնում կարգավորել որոնվածը առանց իրական սարքի: Հետազոտողի համար դա հնարավորություն է դինամիկ կոդի վերլուծություն իրականացնելու, ինչը միշտ չէ, որ հնարավոր է նույնիսկ սարքի դեպքում։

Մենք ցանկանում ենք մասնագետներին տրամադրել այնպիսի գործիք, որը հարմար է, չափավոր պարզ է և մեծ ջանք ու ժամանակ չի պահանջում տեղադրման և գործարկման համար:

Մեկնաբանություններում գրեք ապարատային էմուլյատորների օգտագործման ձեր փորձի մասին: Հրավիրում ենք ձեզ քննարկելու և սիրով կպատասխանենք հարցերին:

Հարցմանը կարող են մասնակցել միայն գրանցված օգտվողները։ Մուտք գործել, խնդրում եմ:

Ինչի՞ համար եք օգտագործում էմուլյատորը:

  • Ես մշակում եմ (վրիպազերծում) որոնվածը

  • Ես ուսումնասիրում եմ որոնվածը

  • Ես գործարկում եմ խաղեր (Dendi, Sega, PSP)

  • ուրիշ բան (գրեք մեկնաբանություններում)

Քվեարկել է 7 օգտատեր։ 2 օգտատեր ձեռնպահ է մնացել։

Ի՞նչ ծրագրաշար եք օգտագործում հայրենի կոդը ընդօրինակելու համար:

  • QEMU

  • Միաեղջյուր շարժիչ

  • Proteus

  • ուրիշ բան (գրեք մեկնաբանություններում)

Քվեարկել է 6 օգտատեր։ 2 օգտատեր ձեռնպահ է մնացել։

Ի՞նչ կցանկանայիք բարելավել ձեր օգտագործած էմուլյատորում:

  • Ես արագություն եմ ուզում

  • Ես ուզում եմ տեղադրման/գործարկման հեշտություն

  • Ես ուզում եմ ավելի շատ տարբերակներ էմուլյատորի հետ շփվելու համար (API, կեռիկներ)

  • Ես գոհ եմ ամեն ինչից

  • ուրիշ բան (գրեք մեկնաբանություններում)

Քվեարկել է 8 օգտատեր։ 1 օգտատեր ձեռնպահ է մնացել։

Source: www.habr.com

Добавить комментарий