د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د غونډې د یوې برخې په توګه 0x0A DC7831 DEF CON Nizhny Novgorod د فبروري په 16، موږ د بائنری کوډ ایمولیشن اساسی اصولو او زموږ د خپل پرمختګ په اړه یو راپور وړاندې کړ - د هارډویر پلیټ فارم ایمولیټر کاپیکیټ.

پدې مقاله کې به موږ تشریح کړو چې څنګه په ایمولیټر کې د وسیلې فرم ویئر چلولو ، د ډیبګر سره تعامل څرګند کړئ ، او د فرم ویئر کوچنۍ متحرک تحلیل ترسره کړئ.

له تاریخ څخه دمخه

ډیر وخت دمخه په یوه کهکشان کې ډیر لرې

څو کاله دمخه زموږ په لابراتوار کې د وسیلې فرم ویئر تحقیق کولو ته اړتیا وه. فرم ویئر د بوټلوډر سره کمپریس شوی او پیک شوی و. هغه دا کار په خورا پیچلي ډول ترسره کړ، څو ځله یې په حافظه کې ډاټا بدله کړه. او پخپله فرم ویئر بیا په فعاله توګه د پردیو سره متقابل عمل وکړ. او دا ټول په MIPS کور کې.

د هدفي دلایلو لپاره ، موجود ایمولیټرونه زموږ سره مناسب ندي ، مګر موږ لاهم غوښتل کوډ چل کړو. بیا موږ پریکړه وکړه چې خپل ایمولیټر جوړ کړو، کوم چې لږترلږه کار کوي او موږ ته اجازه راکوي چې اصلي فرم ویئر خلاص کړو. موږ دا هڅه وکړه او دا کار وکړ. موږ فکر کاوه، که چیرې موږ د اصلي فرم ویئر ترسره کولو لپاره پرفیریلز اضافه کړو. دا ډیر زیان نه رسوي - او دا هم کار وکړ. موږ بیا فکر وکړ او پریکړه یې وکړه چې یو بشپړ ایمولیټر جوړ کړو.

پایله د کمپیوټر سیسټم ایمولیټر وه کاپیکیټ.

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ
ولې کاپیکاټ؟

د کلمو لوبه ده.

  1. copycat (انګلیسي، نوم [ˈkɒpɪkæt]) - تقلید کوونکی، تقلید کوونکی
  2. پيشو (انګلیسي، نوم [ˈkæt]) - پیشو، پیشو - د پروژې د جوړونکو څخه د یو غوره حیوان
  3. د "K" لیک د کوټلین پروګرام کولو ژبې څخه دی

کاپیکیټ

کله چې ایمولیټر رامینځته کول ، خورا ځانګړي اهداف ټاکل شوي:

  • په چټکۍ سره د نوي پردیو، ماډلونو، پروسیسر کورونو جوړولو وړتیا؛
  • د مختلف ماډلونو څخه د مجازی وسیله راټولولو وړتیا؛
  • د مجازی وسیلې په حافظه کې د هر ډول بائنری ډیټا (فرم ویئر) بارولو وړتیا؛
  • د سنیپ شاټونو سره د کار کولو وړتیا (د سیسټم حالت سنیپ شاټونه)؛
  • د جوړ شوي ډیبګر له لارې د ایمولیټر سره د متقابل عمل کولو وړتیا؛
  • د پرمختګ لپاره ښه عصري ژبه.

د پایلې په توګه، کوټلین د پلي کولو لپاره غوره شوی، د بس جوړښت (دا هغه وخت دی چې ماډلونه د مجازی ډیټا بسونو له لارې یو له بل سره اړیکه ونیسي)، JSON د وسیلې توضیحي بڼه، او GDB RSP د ډیبګر سره د متقابل عمل پروتوکول په توګه.

پراختیا له دوو کلونو راهیسې روانه ده او په فعاله توګه روانه ده. د دې وخت په جریان کې، MIPS، x86، V850ES، ARM، او PowerPC پروسیسر کورونه پلي شوي.

پروژه وده کوي او دا وخت دی چې پراخه خلکو ته یې وړاندې کړي. موږ به وروسته د پروژې تفصیلي توضیحات وکړو، مګر د اوس لپاره موږ به د کاپیکټ کارولو تمرکز وکړو.

د خورا بې صبرۍ لپاره ، د ایمولیټر پرومو نسخه ډاونلوډ کیدی شي مخونه.

په ایمولیټر کې رینو

باید یادونه وکړو چې مخکې د SMARTRHINO-2018 کنفرانس لپاره د ریورس انجینري مهارتونو د تدریس لپاره د ازموینې وسیله "Rhinoceros" جوړه شوې وه. د جامد فرم ویئر تحلیل پروسه په کې تشریح شوې دا مقاله.

اوس راځئ هڅه وکړو چې "سپیکرونه" اضافه کړئ او په ایمولیټر کې فرم ویئر چل کړئ.

موږ ته اړتیا لرو:
1) جاوا 1.8
2) پایتون او ماډل جیپ د ایمولیټر دننه د Python کارولو لپاره. تاسو کولی شئ د وینډوز لپاره د WHL ماډل Jep جوړ کړئ دلته ډاونلوډ کړئ.

د وینډوز لپاره:
1) com0com
2) پیوستون

د لینکس لپاره:
1) socat

تاسو کولی شئ Eclipse، IDA Pro یا radare2 د GDB پیرودونکي په توګه وکاروئ.

دا څنګه کار کوي؟

په ایمولیټر کې د فرم ویئر ترسره کولو لپاره ، دا اړینه ده چې یو مجازی وسیله "راټول" کړئ ، کوم چې د ریښتیني وسیلې انلاګ دی.

اصلي وسیله ("رینو") د بلاک ډیاګرام کې ښودل کیدی شي:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

ایمولیټر ماډلر جوړښت لري او وروستی مجازی وسیله په 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"]
  ]
}

پیرامیټر ته پام وکړئ ورژن کړی پارام د یو فایل نوم دی چې د فرم ویئر په توګه په مجازی وسیله کې بار کیدی شي.

مجازی وسیله او د اصلي عملیاتي سیسټم سره د هغې تعامل د لاندې ډیاګرام لخوا نمایش کیدی شي:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د ایمولیټر اوسنۍ ازموینې مثال د اصلي OS COM بندرونو سره تعامل پکې شامل دی (د بلوتوټ ماډل لپاره UART او UART ډیبګ). دا ریښتیني بندرونه کیدی شي کوم چې وسیلې ورسره وصل دي یا مجازی COM بندرونه (د دې لپاره تاسو یوازې اړتیا لرئ com0com/socat).

اوس مهال له بهر څخه د ایمولیټر سره د تعامل لپاره دوه اصلي لارې شتون لري:

  • د GDB RSP پروتوکول (په وینا، هغه وسیلې چې د دې پروتوکول ملاتړ کوي Eclipse / IDA / radare2 دي)؛
  • د داخلي ایمولیټر کمانډ لاین (Argparse یا Python).

مجازی COM بندرونه

د ټرمینل له لارې په محلي ماشین کې د مجازی وسیلې UART سره متقابل عمل کولو لپاره ، تاسو اړتیا لرئ د اړونده مجازی COM بندرونو جوړه جوړه کړئ. زموږ په قضیه کې، یو بندر د ایمولیټر لخوا کارول کیږي، او دویم د ټرمینل پروګرام (PuTTY یا سکرین) لخوا کارول کیږي:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د com0com کارول

مجازی COM بندرونه د com0com کټ څخه د سیټ اپ افادیت په کارولو سره تنظیم شوي (د کنسول نسخه - ج: د پروګرام فایلونه (x86)com0comsetupс.exe، یا د GUI نسخه - ج: د پروګرام فایلونه (x86)com0comsetupg.exe):

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

بکسونه چک کړئ بفر اوورون فعال کړئ د ټولو رامینځته شوي مجازی بندرونو لپاره ، که نه نو ایمولیټر به د COM بندر څخه ځواب ته انتظار باسي.

د ساکټ کارول

په UNIX سیسټمونو کې، مجازی COM بندرونه په اوتومات ډول د ایمولیټر لخوا د سوکټ یوټیلیټ په کارولو سره رامینځته کیږي؛ د دې کولو لپاره ، یوازې د پورټ نوم کې مخکینۍ مشخص کړئ کله چې ایمولیټر پیل کړئ socat:.

د داخلي کمانډ لاین انٹرفیس (Argparse یا Python)

څرنګه چې کوپیکاټ د کنسول غوښتنلیک دی ، نو ایمولیټر د خپلو شیانو او متغیرونو سره متقابل عمل کولو لپاره دوه کمانډ لاین انٹرفیس اختیارونه چمتو کوي: ارګ پارس او پیتون.

ارګ پارس یو CLI دی چې په کاپيکاټ کې جوړ شوی او تل د هرچا لپاره شتون لري.

یو بدیل CLI د Python ژباړونکی دی. د دې کارولو لپاره ، تاسو اړتیا لرئ د جیپ پایتون ماډل نصب کړئ او ایمولیټر د Python سره کار کولو لپاره تنظیم کړئ (د کارونکي اصلي سیسټم کې د Python ژباړونکی به کارول کیږي).

د Python ماډل Jep نصب کول

د لینکس جیپ لاندې د پائپ له لارې نصب کیدی شي:

pip install jep

په وینډوز کې د جیپ نصبولو لپاره، تاسو باید لومړی د وینډوز SDK او ورته مایکروسافټ ویژول سټوډیو نصب کړئ. موږ دا ستاسو لپاره یو څه اسانه کړي او WHL جوړوي د وینډوز لپاره د Python اوسني نسخو لپاره JEP، نو ماډل د فایل څخه نصب کیدی شي:

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

د جیپ نصبولو چیک کولو لپاره ، تاسو اړتیا لرئ د کمانډ لاین ته لاړشئ:

python -c "import jep"

لاندې پیغام باید په ځواب کې ترلاسه شي:

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

ستاسو د سیسټم لپاره د ایمولیټر بیچ فایل کې (copycat.bat - د وینډوز لپاره، نقل - د لینکس لپاره) د پیرامیټونو لیست ته DEFAULT_JVM_OPTS یو اضافي پیرامیټر اضافه کړئ Djava.library.path - دا باید نصب شوي جیپ ماډل ته لاره ولري.

د وینډوز لپاره پایله باید داسې وي:

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

د کاپيکاټ په لاره اچول

ایمولیټر د کنسول JVM غوښتنلیک دی. لانچ د عملیاتي سیسټم کمانډ لاین سکریپټ (sh/cmd) له لارې ترسره کیږي.

د وینډوز لاندې د چلولو امر:

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

د سوکاټ یوټیلیټ په کارولو سره د لینکس لاندې چلولو قومانده:

./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 پرو سره تعامل

د ازموینې ساده کولو لپاره، موږ په IDA کې د تحلیل لپاره د سرچینې فایل په توګه د Rhino فرم ویئر کاروو د ELF فایل (د میټا معلومات هلته ساتل کیږي).

تاسو کولی شئ د میټا معلوماتو پرته اصلي فرم ویئر هم وکاروئ.

په IDA پرو کې د کوپیکاټ پیل کولو وروسته ، په ډیبګر مینو کې توکي ته لاړ شئ "ډیبګر بدل کړئ…"او وټاکئ"ریموټ GDB ډیبګر". بیا، پیوستون تنظیم کړئ: مینو Debugger - د پروسې اختیارونه…

ارزښتونه تنظیم کړئ:

  • غوښتنلیک - هر ارزښت
  • کوربه نوم: 127.0.0.1 (یا د ریموټ ماشین IP پته چیرې چې کاپيکیټ چلیږي)
  • پور: 23946

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

اوس د ډیبګ کولو تڼۍ شتون لري (F9 کیلي):

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

په ایمولیټر کې د ډیبګر ماډل سره وصل کولو لپاره دا کلیک وکړئ. IDA د ډیبګ کولو حالت ته ځي، اضافي کړکۍ شتون لري: د راجسترونو په اړه معلومات، د سټیک په اړه.

اوس موږ کولی شو د ډیبګر ټول معیاري ځانګړتیاوې وکاروو:

  • د لارښوونو ګام په ګام اجرا کول (مرحله и ګام په ګام - کیلي F7 او F8 په ترتیب سره؛
  • د اعدام پیل او ځنډول؛
  • د دواړو کوډ او ډیټا (F2 کلید) لپاره د وقفې نقطې رامینځته کول.

د ډیبګر سره نښلول پدې معنی ندي چې د فرم ویئر کوډ چلول. د اجرا کولو اوسنی موقعیت باید پته وي 0x08006A74 - د فعالیت پیل Reset_Handler. که تاسو لیست لاندې سکرول کړئ، تاسو کولی شئ د فنکشن کال وګورئ اصلي. تاسو کولی شئ په دې کرښه کې کرسر ځای په ځای کړئ (پته 0x08006ABE) او عملیات ترسره کړئ تر کرسر پورې وګرځئ (کیلي F4).

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

بیا، تاسو کولی شئ د فعالیت داخلولو لپاره F7 فشار ورکړئ اصلي.

که تاسو کمانډ چلوئ پروسې ته دوام ورکړئ (F9 کیلي)، بیا د "مهرباني وکړئ انتظار وکړئ" کړکۍ به د یوې تڼۍ سره ښکاره شي ځنډول:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

کله چې تاسو فشار ورکړئ ځنډول د فرم ویئر کوډ اجرا کول ځنډول شوي او په کوډ کې د ورته پتې څخه ادامه ورکول کیدی شي چیرې چې دا مداخله شوې وه.

که تاسو د کوډ اجرا کولو ته دوام ورکړئ، تاسو به د مجازی COM بندرونو سره وصل شوي ترمینلونو کې لاندې لینونه وګورئ:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د "دولت بای پاس" لاین شتون په ګوته کوي چې د مجازی بلوتوټ ماډل د کارونکي COM بندر څخه د معلوماتو ترلاسه کولو حالت ته اړول شوی.

اوس په بلوتوت ټرمینل کې (په انځور کې COM29) تاسو کولی شئ د Rhino پروتوکول سره سم کمانډ داخل کړئ. د مثال په توګه، د "MEOW" کمانډ به د بلوتوټ ترمینل ته د "mur-mur" تار بیرته راولي:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

زما تقلید په بشپړه توګه نه

کله چې ایمولیټر جوړ کړئ، تاسو کولی شئ د یوې ځانګړې وسیلې د توضیحاتو/ایمولیشن کچه غوره کړئ. د مثال په توګه، د بلوتوټ ماډل په مختلفو لارو جذب کیدی شي:

  • وسیله په بشپړ ډول د امرونو بشپړ سیټ سره تقلید شوې؛
  • د AT کمانډونه تقلید شوي ، او د ډیټا جریان د اصلي سیسټم COM بندر څخه ترلاسه کیږي؛
  • مجازی وسیله ریښتیني وسیلې ته د بشپړ ډیټا لارښود چمتو کوي؛
  • د یو ساده سټب په توګه چې تل "ښه" بیرته راګرځي.

د ایمولیټر اوسنۍ نسخه دوهمه طریقه کاروي - د مجازی بلوتوټ ماډل تنظیمات ترسره کوي، وروسته له هغه چې دا د اصلي سیسټم د COM بندر څخه د ایمولیټر UART بندر ته د "پراکسي کولو" ډیټا حالت ته واړوي.

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

راځئ چې د کوډ د ساده وسیلو احتمال په پام کې ونیسو که چیرې د پردې ځینې برخې پلي نشي. د مثال په توګه ، که چیرې DMA ته د ډیټا لیږد کنټرول لپاره مسؤل ټیمر نه وي رامینځته شوی (چیک په فعالیت کې ترسره کیږي ws2812b_ انتظارکې موقعیت لري 0x08006840)، بیا به فرم ویئر تل د بیرغ د بیا تنظیم کولو لپاره انتظار باسي بوختکې موقعیت لري 0x200004C4کوم چې د DMA ډیټا لاین اشغال ښیې:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

موږ کولی شو د بیرغ په لاسي ډول تنظیم کولو سره د دې وضعیت شاوخوا ترلاسه کړو بوخت د نصبولو وروسته سمدلاسه. په IDA پرو کې، تاسو کولی شئ د Python فنکشن جوړ کړئ او په بریک پواینټ کې یې زنګ ووهئ، او د بریک پواینټ په کوډ کې د ارزښت 1 لیکلو وروسته بیرغ ته واچوئ. بوخت.

د بریک پوائنټ سمبالونکی

لومړی، راځئ چې په IDA کې د Python فنکشن جوړ کړو. مینو فایل - سکریپټ کمانډ ...

په ښي خوا کې په لیست کې یو نوی ټوټه اضافه کړئ، نوم ورکړئ (د مثال په توګه، بي پي ټي),
په ښي خوا کې د متن ساحه کې، د فعالیت کوډ دننه کړئ:

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

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

له هغې وروسته موږ فشار راوړو د دويم او د سکریپټ کړکۍ بنده کړئ.

اوس راځئ چې کوډ ته لاړ شو 0x0800688A، د وقفې نقطې (F2 کیلي) تنظیم کړئ ، سم کړئ (د شرایطو مینو د وقفې ځای ترمیم کړئ...)، مه هیروئ چې د سکریپټ ډول پایتون ته تنظیم کړئ:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ
د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

که د اوسني پرچم ارزښت بوخت مساوي 1، نو تاسو باید فنکشن اجرا کړئ skip_dma د سکریپټ په کرښه کې:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

که تاسو د اجرا کولو لپاره فرم ویئر چلوئ، د بریک پواینټ هینډلر کوډ محرک د IDA کړکۍ کې لیدل کیدی شي Output په کرښه Skipping wait ws2812.... اوس فرم ویئر به د بیرغ بیا تنظیم کولو ته انتظار ونه کړي بوخت.

د ایمولیټر سره تعامل

د تقلید په خاطر تقلید د خوښۍ او خوښۍ لامل نه کیږي. دا خورا ډیر په زړه پوری دی که چیرې ایمولیټر له څیړونکي سره مرسته وکړي چې ډیټا په حافظه کې وګوري یا د تارونو تعامل رامینځته کړي.

موږ به تاسو ته وښیو چې څنګه په متحرک ډول د RTOS دندو ترمینځ متقابل عمل رامینځته کړو. تاسو باید لومړی د کوډ اجرا کول ودروئ که چیرې دا روان وي. که تاسو فنکشن ته لاړ شئ بلوتوث_تاسک_داخله د "LED" کمانډ د پروسس څانګې ته (پته 0x080057B8)، بیا تاسو کولی شئ وګورئ چې لومړی څه جوړ شوی او بیا د سیسټم کتار ته لیږل کیږي ledControlQueueHandle یو څه پیغام.

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

تاسو باید متغیر ته د لاسرسي لپاره د وقفې نقطه جوړه کړئ ledControlQueueHandleکې موقعیت لري 0x20000624 او د کوډ اجرا کولو ته دوام ورکړئ:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د پایلې په توګه، تمځای به لومړی په پته کې واقع شي 0x080057CA مخکې له دې چې فنکشن ته زنګ ووهي osMailAlloc، بیا په پته کې 0x08005806 مخکې له دې چې فنکشن ته زنګ ووهي osMailPut، بیا یو څه وروسته - پته ته 0x08005BD4 (مخکې له دې چې فنکشن ته زنګ ووهئ osMailGet)، کوم چې په فنکشن پورې اړه لري leds_task_entry (LED-task)، دا دی، دندې بدلې شوې، او اوس د LED - دنده کنټرول ترلاسه کړ.

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

پدې ساده طریقه تاسو کولی شئ تاسیس کړئ چې څنګه د RTOS دندې یو له بل سره اړیکه لري.

البته، په واقعیت کې، د دندو متقابل عمل خورا پیچلی کیدی شي، مګر د ایمولیټر په کارولو سره، د دې تعامل تعقیب لږ ستونزمن کیږي.

ټوټ تاسو کولی شئ د IDA پرو سره د ایمولیټر لانچ کولو او متقابل عمل لنډ ویډیو وګورئ.

د 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 هارډویر ډیبګ کول تاسو اړتیا لرئ یو نوی ترتیب اضافه کړئ، بیا په "اصلي" ټب کې اوسنی پروژه او د ډیبګ کولو لپاره غوښتنلیک مشخص کړئ:

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

په "Debugger" ټب کې تاسو اړتیا لرئ د GDB کمانډ مشخص کړئ:
${openstm32_compiler_path}arm-none-eabi-gdb

او د GDB سرور سره د نښلولو لپاره پیرامیټونه هم دننه کړئ (میزبان او بندر):

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د "Startup" ټب کې، تاسو باید لاندې پیرامیټونه مشخص کړئ:

  • چیک باکس فعال کړئ انځور پورته کړئ (د دې لپاره چې راټول شوي فرم ویئر عکس په ایمولیټر کې بار شوی وي)؛
  • چیک باکس فعال کړئ سمبولونه پورته کړئ;
  • د لانچ کمانډ اضافه کړئ: set $pc = *0x08000004 (د کمپیوټر راجستر په پته کې د حافظې څخه ارزښت ته تنظیم کړئ 0x08000004 - پته هلته ساتل کیږي ResetHandler).

پاملرنه وکړئ، که تاسو نه غواړئ د Eclipse څخه د فرم ویئر فایل ډاونلوډ کړئ ، نو اختیارونه انځور پورته کړئ и امرونه چلول اشاره کولو ته اړتیا نشته.

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

د ډیبګ کلیک کولو وروسته، تاسو کولی شئ په ډیبګر حالت کې کار وکړئ:

  • ګام په ګام کوډ اجرا کول
    د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ
  • د وقفې نقطو سره تعامل
    د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

تبصره. Eclipse لري، هوم... ځینې ځانګړنې... او تاسو باید ورسره ژوند وکړئ. د مثال په توګه، که چیرې د ډیبګر پیل کولو په وخت کې پیغام "د "0x0" لپاره هیڅ سرچینه شتون نلري، نو بیا د ګام کمانډ (F5) اجرا کړئ.

د پیشو دننه ګنډه - د کوپیکیټ ایمولیټر کې فرم ویئر چل کړئ

پر ځای د يو پایلې

د اصلي کوډ تقلید خورا په زړه پوری شی دی. دا د وسیلې پراختیا کونکي لپاره ممکنه کیږي چې د ریښتیني وسیلې پرته فرم ویئر ډیبګ کړي. د څیړونکي لپاره، دا یو فرصت دی چې د متحرک کوډ تحلیل ترسره کړي، کوم چې تل حتی د یوې وسیلې سره ممکن نه وي.

موږ غواړو متخصصینو ته داسې وسیلې چمتو کړو چې اسانه ، اعتدال ساده وي او د تنظیم کولو او چلولو لپاره ډیرې هڅې او وخت نه نیسي.

د هارډویر ایمولیټرونو په کارولو سره د خپلې تجربې په اړه نظرونو کې ولیکئ. موږ تاسو ته د بحث کولو بلنه درکوو او د پوښتنو ځوابونو ته به خوشحاله یو.

یوازې راجستر شوي کاروونکي کولی شي په سروې کې برخه واخلي. ننوزئمهرباني وکړئ

تاسو د څه لپاره ایمولیټر کاروئ؟

  • زه (ډیبګ) فرم ویئر رامینځته کوم

  • زه د فرم ویئر تحقیق کوم

  • زه لوبې پیلوم (ډینډي، سیګا، PSP)

  • بل څه (په نظرونو کې ولیکئ)

7 کاروونکو رایه ورکړه. 2 کاروونکي منع شوي.

تاسو د اصلي کوډ تقلید لپاره کوم سافټویر کاروئ؟

  • د انتخاباتو خپلواک کمیسیون

  • یونیکورن انجن

  • Proteus

  • بل څه (په نظرونو کې ولیکئ)

6 کاروونکو رایه ورکړه. 2 کاروونکي منع شوي.

په هغه ایمولیټر کې چې تاسو یې کاروئ څه ښه کول غواړئ؟

  • زه سرعت غواړم

  • زه د تنظیم / لانچ اسانه غواړم

  • زه د ایمولیټر سره د متقابل عمل لپاره نور اختیارونه غواړم (API، هکس)

  • زه د هر څه سره خوشحاله یم

  • بل څه (په نظرونو کې ولیکئ)

8 کاروونکو رایه ورکړه. 1 کارن پاتې شو.

سرچینه: www.habr.com

Add a comment