بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

میٹنگ 0x0A DC7831 کے حصے کے طور پر DEF CON نزنی نووگوروڈ 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) ازگر اور ماڈیول جیپ ایمولیٹر کے اندر ازگر کا استعمال کرنا۔ آپ ونڈوز کے لیے WHL ماڈیول Jep بنا سکتے ہیں۔ یہاں ڈاؤن لوڈ کریں.

ونڈوز کے لئے:
1) com0com
2) پٹی

لینکس کے لیے:
1) ساکت

آپ 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 کٹ سے سیٹ اپ یوٹیلیٹی کا استعمال کرتے ہوئے ترتیب دیا گیا ہے (کنسول ورژن - C: پروگرام فائلز (x86)com0comsetupс.exe، یا GUI ورژن - C: پروگرام فائلز (x86)com0comsetupg.exe):

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

خانوں کو چیک کریں۔ بفر اووررن کو فعال کریں۔ تمام تخلیق شدہ ورچوئل پورٹس کے لیے، بصورت دیگر ایمولیٹر COM پورٹ سے جواب کا انتظار کرے گا۔

socat کا استعمال کرتے ہوئے

UNIX سسٹمز پر، ورچوئل COM پورٹس خود بخود ایمولیٹر کے ذریعے socat یوٹیلیٹی کا استعمال کرتے ہوئے بنائے جاتے ہیں؛ ایسا کرنے کے لیے، ایمولیٹر کو شروع کرتے وقت صرف پورٹ کے نام میں سابقہ ​​کی وضاحت کریں۔ socat:.

اندرونی کمانڈ لائن انٹرفیس (Argparse یا Python)

چونکہ Kopycat ایک کنسول ایپلی کیشن ہے، اس لیے ایمولیٹر اپنی اشیاء اور متغیرات کے ساتھ تعامل کے لیے دو کمانڈ لائن انٹرفیس کے اختیارات فراہم کرتا ہے: Argparse اور Python۔

Argparse ایک CLI ہے جو Kopycat میں بنایا گیا ہے اور ہمیشہ ہر کسی کے لیے دستیاب ہے۔

ایک متبادل CLI Python انٹرپریٹر ہے۔ اسے استعمال کرنے کے لیے، آپ کو Jep Python ماڈیول انسٹال کرنا ہوگا اور Python کے ساتھ کام کرنے کے لیے ایمولیٹر کو کنفیگر کرنا ہوگا (صارف کے مین سسٹم پر نصب Python انٹرپریٹر استعمال کیا جائے گا)۔

Python ماڈیول Jep انسٹال کرنا

لینکس جیپ کے تحت پائپ کے ذریعے انسٹال کیا جا سکتا ہے:

pip install jep

Windows پر Jep انسٹال کرنے کے لیے، آپ کو پہلے Windows SDK اور متعلقہ Microsoft Visual Studio کو انسٹال کرنا ہوگا۔ ہم نے اسے آپ کے لیے تھوڑا آسان بنا دیا ہے اور WHL بناتا ہے۔ ونڈوز کے لیے 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 - ونڈوز کے لیے، کاپی کیٹ - لینکس کے لیے) پیرامیٹرز کی فہرست میں DEFAULT_JVM_OPTS ایک اضافی پیرامیٹر شامل کریں۔ Djava.library.path - اس میں نصب Jep ماڈیول کا راستہ ہونا چاہیے۔

ونڈوز کا نتیجہ اس طرح ایک لائن ہونا چاہئے:

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

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 پرو کے ساتھ تعامل

جانچ کو آسان بنانے کے لیے، ہم فارم میں IDA میں تجزیہ کے لیے Rhino فرم ویئر کو سورس فائل کے طور پر استعمال کرتے ہیں۔ ELF فائل (میٹا معلومات وہاں محفوظ ہے)۔

آپ میٹا معلومات کے بغیر مین فرم ویئر بھی استعمال کر سکتے ہیں۔

IDA Pro میں Kopycat لانچ کرنے کے بعد، ڈیبگر مینو میں آئٹم پر جائیں "ڈیبگر سوئچ کریں…"اور منتخب کریں"ریموٹ GDB ڈیبگر" اگلا، کنکشن ترتیب دیں: مینو ڈیبگر - عمل کے اختیارات…

اقدار مقرر کریں:

  • درخواست - کوئی بھی قیمت
  • میزبان نام: 127.0.0.1 (یا ریموٹ مشین کا IP ایڈریس جہاں Kopycat چل رہا ہے)
  • پورٹ: 23946

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

اب ڈیبگنگ بٹن دستیاب ہو جاتا ہے (F9 کلید):

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

ایمولیٹر میں ڈیبگر ماڈیول سے جڑنے کے لیے اس پر کلک کریں۔ IDA ڈیبگنگ موڈ میں چلا جاتا ہے، اضافی ونڈوز دستیاب ہو جاتی ہیں: رجسٹر کے بارے میں معلومات، اسٹیک کے بارے میں۔

اب ہم ڈیبگر کی تمام معیاری خصوصیات استعمال کر سکتے ہیں:

  • ہدایات پر مرحلہ وار عمل درآمد (میں قدم и قدم بڑھائیں۔ - بالترتیب F7 اور F8 کیز؛
  • عملدرآمد شروع کرنا اور روکنا؛
  • کوڈ اور ڈیٹا (F2 کلید) دونوں کے لیے بریک پوائنٹ بنانا۔

ڈیبگر سے جڑنے کا مطلب یہ نہیں ہے کہ فرم ویئر کوڈ چلانا۔ عمل درآمد کی موجودہ پوزیشن کا پتہ ہونا چاہیے۔ 0x08006A74 - فنکشن کا آغاز ری سیٹ_ہینڈلر. اگر آپ فہرست کو نیچے سکرول کرتے ہیں، تو آپ فنکشن کال دیکھ سکتے ہیں۔ اہم. آپ اس لائن پر کرسر رکھ سکتے ہیں (پتہ 0x08006ABE) اور آپریشن انجام دیں۔ کرسر تک چلائیں۔ (کلید F4)۔

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

اگلا، آپ فنکشن میں داخل ہونے کے لیے F7 دبا سکتے ہیں۔ اہم.

اگر آپ کمانڈ چلاتے ہیں۔ عمل جاری رکھیں (F9 کلید)، پھر "براہ کرم انتظار کریں" ونڈو ایک بٹن کے ساتھ ظاہر ہوگی۔ معطل کریں:

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

جب آپ دبائیں گے۔ معطل کریں فرم ویئر کوڈ کا نفاذ معطل ہے اور کوڈ میں اسی ایڈریس سے جاری رکھا جا سکتا ہے جہاں اس میں خلل پڑا تھا۔

اگر آپ کوڈ پر عمل درآمد جاری رکھتے ہیں، تو آپ کو ورچوئل COM پورٹس سے منسلک ٹرمینلز میں درج ذیل لائنیں نظر آئیں گی۔

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

"اسٹیٹ بائی پاس" لائن کی موجودگی اس بات کی نشاندہی کرتی ہے کہ ورچوئل بلوٹوتھ ماڈیول صارف کے COM پورٹ سے ڈیٹا وصول کرنے کے موڈ میں تبدیل ہو گیا ہے۔

اب بلوٹوتھ ٹرمینل میں (تصویر میں COM29) آپ Rhino پروٹوکول کے مطابق کمانڈز درج کر سکتے ہیں۔ مثال کے طور پر، "MEOW" کمانڈ سٹرنگ "mur-mur" کو بلوٹوتھ ٹرمینل پر واپس کر دے گی:

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

مکمل طور پر نہیں میری تقلید

ایمولیٹر بناتے وقت، آپ کسی خاص ڈیوائس کی تفصیل/ایمولیشن کی سطح کا انتخاب کر سکتے ہیں۔ مثال کے طور پر، بلوٹوتھ ماڈیول کو مختلف طریقوں سے ایمولیٹ کیا جا سکتا ہے:

  • ڈیوائس کو کمانڈز کے مکمل سیٹ کے ساتھ مکمل طور پر نقل کیا گیا ہے۔
  • اے ٹی کمانڈز کی تقلید کی جاتی ہے، اور ڈیٹا سٹریم مین سسٹم کے COM پورٹ سے موصول ہوتا ہے۔
  • ورچوئل ڈیوائس حقیقی ڈیوائس پر مکمل ڈیٹا ری ڈائریکشن فراہم کرتی ہے۔
  • ایک سادہ اسٹب کے طور پر جو ہمیشہ "OK" لوٹاتا ہے۔

ایمولیٹر کا موجودہ ورژن دوسرا نقطہ نظر استعمال کرتا ہے - ورچوئل بلوٹوتھ ماڈیول کنفیگریشن کرتا ہے، جس کے بعد یہ مرکزی سسٹم کے COM پورٹ سے ایمولیٹر کے UART پورٹ پر ڈیٹا "پراکسینگ" کے موڈ میں بدل جاتا ہے۔

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

آئیے کوڈ کے سادہ انسٹرومینٹیشن کے امکان پر غور کرتے ہیں اگر دائرہ کا کچھ حصہ لاگو نہیں ہوتا ہے۔ مثال کے طور پر، اگر ڈی ایم اے میں ڈیٹا کی منتقلی کو کنٹرول کرنے کا ذمہ دار ٹائمر نہیں بنایا گیا ہے (چیک فنکشن میں کیا جاتا ہے ws2812b_انتظار کریں۔پر واقع ہے 0x08006840)، پھر فرم ویئر ہمیشہ پرچم کے ری سیٹ ہونے کا انتظار کرے گا۔ مصروفپر واقع ہے 0x200004C4جو DMA ڈیٹا لائن کے قبضے کو ظاہر کرتا ہے:

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

ہم پرچم کو دستی طور پر دوبارہ ترتیب دے کر اس صورتحال کو حاصل کر سکتے ہیں۔ مصروف اسے انسٹال کرنے کے فورا بعد. 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

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

اس کے بعد ہم دبائیں گے۔ رن اور اسکرپٹ ونڈو کو بند کریں۔

اب آئیے کوڈ پر جاتے ہیں۔ 0x0800688A، ایک بریک پوائنٹ (F2 کلید) سیٹ کریں، اس میں ترمیم کریں (سیاق و سباق کا مینو بریک پوائنٹ میں ترمیم کریں...)، اسکرپٹ کی قسم کو ازگر پر سیٹ کرنا نہ بھولیں:

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔
بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

اگر موجودہ پرچم کی قدر مصروف 1 کے برابر ہے، پھر آپ کو فنکشن کو عمل میں لانا چاہیے۔ skip_dma اسکرپٹ لائن میں:

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

اگر آپ عمل درآمد کے لیے فرم ویئر چلاتے ہیں، تو بریک پوائنٹ ہینڈلر کوڈ کا محرک IDA ونڈو میں دیکھا جا سکتا ہے۔ آؤٹ پٹ لائن سے Skipping wait ws2812.... اب فرم ویئر پرچم کو دوبارہ ترتیب دینے کا انتظار نہیں کرے گا۔ مصروف.

ایمولیٹر کے ساتھ تعامل

تقلید کی خاطر تقلید سے خوشی اور مسرت کا امکان نہیں ہے۔ یہ بہت زیادہ دلچسپ ہے اگر ایمولیٹر محقق کو میموری میں ڈیٹا دیکھنے یا تھریڈز کا تعامل قائم کرنے میں مدد کرتا ہے۔

ہم آپ کو دکھائیں گے کہ RTOS کاموں کے درمیان متحرک طور پر تعامل کیسے قائم کیا جائے۔ اگر کوڈ چل رہا ہے تو آپ کو پہلے اس پر عمل درآمد روکنا چاہیے۔ اگر آپ فنکشن میں جاتے ہیں۔ بلوٹوتھ_ٹاسک_انٹری "ایل ای ڈی" کمانڈ کی پروسیسنگ برانچ میں (پتہ 0x080057B8)، پھر آپ دیکھ سکتے ہیں کہ پہلے کیا بنایا گیا ہے اور پھر سسٹم کی قطار میں بھیجا گیا ہے۔ ledControlQueueHandle کچھ پیغام.

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

متغیر تک رسائی کے لیے آپ کو بریک پوائنٹ سیٹ کرنا چاہیے۔ ledControlQueueHandleپر واقع ہے 0x20000624 اور کوڈ پر عمل درآمد جاری رکھیں:

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

نتیجتاً، سٹاپ پہلے پتے پر ہو گا۔ 0x080057CA فنکشن کو کال کرنے سے پہلے osMailAlloc، پھر پتے پر 0x08005806 فنکشن کو کال کرنے سے پہلے osMailPut، پھر تھوڑی دیر کے بعد - ایڈریس پر 0x08005BD4 (فنکشن کو کال کرنے سے پہلے osMailGet)، جس کا تعلق فنکشن سے ہے۔ leds_task_entry (ایل ای ڈی ٹاسک)، یعنی کام بدل گئے، اور اب ایل ای ڈی ٹاسک کو کنٹرول مل گیا ہے۔

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

اس آسان طریقے سے آپ یہ قائم کر سکتے ہیں کہ کس طرح RTOS کام ایک دوسرے کے ساتھ تعامل کرتے ہیں۔

بلاشبہ، حقیقت میں، کاموں کا تعامل زیادہ پیچیدہ ہو سکتا ہے، لیکن ایمولیٹر کا استعمال کرتے ہوئے، اس تعامل کو ٹریک کرنا کم محنتی ہو جاتا ہے۔

یہاں آپ IDA Pro کے ساتھ ایمولیٹر کے لانچ اور بات چیت کی ایک مختصر ویڈیو دیکھ سکتے ہیں۔

Radare2 کے ساتھ لانچ کریں۔

آپ Radare2 جیسے عالمگیر ٹول کو نظر انداز نہیں کر سکتے۔

r2 کا استعمال کرتے ہوئے ایمولیٹر سے جڑنے کے لیے، کمانڈ اس طرح نظر آئے گی:

radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf

لانچ ابھی دستیاب ہے (dc) اور پھانسی کو روک دیں (Ctrl+C)۔

بدقسمتی سے، اس وقت، ہارڈویئر جی ڈی بی سرور اور میموری لے آؤٹ کے ساتھ کام کرتے وقت r2 کو مسائل کا سامنا ہے؛ اس کی وجہ سے، بریک پوائنٹس اور اسٹیپس کام نہیں کرتے ہیں (کمانڈ ds)۔ ہمیں امید ہے کہ یہ جلد ہی ٹھیک ہو جائے گا۔

چاند گرہن کے ساتھ چل رہا ہے۔

ایمولیٹر استعمال کرنے کے اختیارات میں سے ایک ڈیوائس کے فرم ویئر کو ڈیبگ کرنا ہے۔ وضاحت کے لیے، ہم Rhino فرم ویئر بھی استعمال کریں گے۔ آپ فرم ویئر کے ذرائع کو ڈاؤن لوڈ کرسکتے ہیں۔ اس وجہ سے.

ہم سیٹ سے ایکلیپس کو بطور IDE استعمال کریں گے۔ STM32 کے لیے سسٹم ورک بینچ.

ایمولیٹر کے لیے ایکلیپس میں براہ راست مرتب کردہ فرم ویئر لوڈ کرنے کے لیے، آپ کو پیرامیٹر شامل کرنے کی ضرورت ہے۔ firmware=null ایمولیٹر لانچ کمانڈ پر:

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

ڈیبگ کنفیگریشن ترتیب دے رہا ہے۔

چاند گرہن میں، مینو کو منتخب کریں۔ چلائیں - ڈیبگ کنفیگریشنز... کھلنے والی ونڈو میں، سیکشن میں GDB ہارڈ ویئر ڈیبگنگ آپ کو ایک نئی ترتیب شامل کرنے کی ضرورت ہے، پھر "مین" ٹیب پر موجودہ پروجیکٹ اور ڈیبگنگ کے لیے درخواست کی وضاحت کریں:

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

"ڈیبگر" ٹیب پر آپ کو GDB کمانڈ کی وضاحت کرنے کی ضرورت ہے:
${openstm32_compiler_path}arm-none-eabi-gdb

اور GDB سرور (میزبان اور پورٹ) سے جڑنے کے لیے پیرامیٹرز بھی درج کریں:

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

"اسٹارٹ اپ" ٹیب پر، آپ کو درج ذیل پیرامیٹرز کی وضاحت کرنی ہوگی:

  • چیک باکس کو فعال کریں۔ تصویر لوڈ کریں۔ (تاکہ جمع شدہ فرم ویئر امیج ایمولیٹر میں لوڈ ہو جائے)؛
  • چیک باکس کو فعال کریں۔ علامتیں لوڈ کریں۔;
  • لانچ کمانڈ شامل کریں: set $pc = *0x08000004 (پی سی رجسٹر کو ایڈریس پر میموری سے ویلیو پر سیٹ کریں۔ 0x08000004 - پتہ وہاں محفوظ ہے۔ ری سیٹ ہینڈلر).

توجہ دینا، اگر آپ Eclipse سے فرم ویئر فائل ڈاؤن لوڈ نہیں کرنا چاہتے ہیں، تو اختیارات تصویر لوڈ کریں۔ и کمانڈز چلائیں۔ اشارہ کرنے کی ضرورت نہیں ہے.

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

ڈیبگ پر کلک کرنے کے بعد، آپ ڈیبگر موڈ میں کام کر سکتے ہیں:

  • مرحلہ وار کوڈ پر عمل درآمد
    بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔
  • بریک پوائنٹس کے ساتھ تعامل
    بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

نوٹ. چاند گرہن میں، ہمم... کچھ نرالا ہیں... اور آپ کو ان کے ساتھ رہنا ہوگا۔ مثال کے طور پر، اگر ڈیبگر شروع کرتے وقت پیغام ""0x0" کے لیے کوئی ذریعہ دستیاب نہیں ہے، تو اسٹیپ کمانڈ (F5) پر عمل کریں۔

بلی کے اندر گینڈا - کوپی کیٹ ایمولیٹر میں فرم ویئر چلائیں۔

اس کے بجائے کسی نتیجے کے

مقامی کوڈ کی تقلید ایک بہت دلچسپ چیز ہے۔ ڈیوائس کے ڈویلپر کے لیے حقیقی ڈیوائس کے بغیر فرم ویئر کو ڈیبگ کرنا ممکن ہو جاتا ہے۔ ایک محقق کے لیے یہ متحرک کوڈ تجزیہ کرنے کا ایک موقع ہوتا ہے، جو کسی آلے کے ساتھ بھی ہمیشہ ممکن نہیں ہوتا ہے۔

ہم ماہرین کو ایک ایسا ٹول فراہم کرنا چاہتے ہیں جو آسان، معمولی حد تک آسان ہو اور اسے ترتیب دینے اور چلانے میں زیادہ محنت اور وقت نہ لگے۔

ہارڈ ویئر ایمولیٹر استعمال کرنے کے اپنے تجربے کے بارے میں تبصروں میں لکھیں۔ ہم آپ کو بحث کے لیے مدعو کرتے ہیں اور سوالات کے جوابات دینے میں خوشی محسوس کریں گے۔

سروے میں صرف رجسٹرڈ صارفین ہی حصہ لے سکتے ہیں۔ سائن ان، برائے مہربانی.

آپ ایمولیٹر کس کے لیے استعمال کر رہے ہیں؟

  • میں (ڈیبگ) فرم ویئر تیار کرتا ہوں۔

  • میں فرم ویئر کی تحقیق کر رہا ہوں۔

  • میں گیمز لانچ کرتا ہوں (ڈینڈی، سیگا، پی ایس پی)

  • کچھ اور (کمنٹس میں لکھیں)

7 صارفین نے ووٹ دیا۔ 2 صارفین غیر حاضر رہے۔

مقامی کوڈ کی تقلید کے لیے آپ کون سا سافٹ ویئر استعمال کرتے ہیں؟

  • QEMU

  • ایک تنگاوالا انجن

  • طور بدلنےوالا پرانی

  • کچھ اور (کمنٹس میں لکھیں)

6 صارفین نے ووٹ دیا۔ 2 صارفین غیر حاضر رہے۔

آپ جو ایمولیٹر استعمال کر رہے ہیں اس میں آپ کیا بہتری لانا چاہیں گے؟

  • مجھے رفتار چاہیے

  • میں سیٹ اپ/لانچ میں آسانی چاہتا ہوں۔

  • میں ایمولیٹر (API، ہکس) کے ساتھ بات چیت کے لیے مزید اختیارات چاہتا ہوں

  • میں ہر چیز سے خوش ہوں۔

  • کچھ اور (کمنٹس میں لکھیں)

8 صارفین نے ووٹ دیا۔ 1 صارف نے پرہیز کیا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں