Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
Hardware Hacking Cheatsheet — ورقة غش اختراق العتاد | Kitploit
أدوات/GitLabGitLab/myasnik/hardware-hacking-cheatsheet
أمان الأنظمة المدمجةأمان إنترنت الأشياءأمن الأجهزةالتعلم والتعليمموارد منسقةتحليل البرامج الثابتة
GitLabmyasnik/hardware-hacking-cheatsheet

Hardware Hacking Cheatsheet

ورقة غش اختراق العتاد

عرض المستودع
23منذ 5 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

ورقة غش اختراق العتاد

[[TOC]]

إخلاء المسؤولية

  • أنا مبتدئ أحاول تعلم هذا النوع من الأشياء لذا ربما بعض الأمور ليست صحيحة 100%
  • آسف على ضعف لغتي الإنجليزية

ملاحظات

  • اتبع منهجية المسار الأسهل أولاً
  • أحياناً ستحتاج إلى اللحام؛ هنا دليل سريع وبسيط لكيفية القيام بذلك
    • قد تضطر إلى لحام الأسلاك مباشرة على فتحات PCB (فيديو)
      1. اكشط سطح PCB باستخدام قاطع حتى ترى البريق تحت قناع اللحام
      2. اكشط السطح مرة أخرى باستخدام قلم ألياف زجاجية
      3. نظف السطح ببعض الكحول الأيزوبروبيلي وقطعة قطن
      4. ضع قليلاً من معجون اللحام
      5. قصدير السلك ولحامه
    • ملاحظات
      • قم دائماً بقصدير طرف مكواة اللحام
      • Temperature: 250-350 C
      • لا تلمس PCB باليدين

جمع المعلومات والتفاعل الأول

  1. انظر إلى الملصق على ظهر الجهاز وابحث عن
    • اسم الطراز
    • الرقم التسلسلي
    • الشركة التي تحمل العلامة التجارية للجهاز (قد لا تكون من صنعته)
  2. ابحث على الإنترنت باستخدام المعلومات التي جمعتها للتو
    • أفضل المواقع التي تحتوي على معلومات
      • TechInfoDepot
      • OpenWRT
    • ابحث عن ...، هذا يؤدي عادةً إلى الكثير من المعلومات
      • FCC ID (reference website)
      • اسم شريحة النظام
      • اسم شريحة الفلاش وسعتها
      • اسم شريحة الرام وسعتها
      • مصادر معلومات محتملة أخرى
  3. افتح الجهاز
    • ابحث عن دروس تعليمية حول كيفية فتح الجهاز
    • بعض الأجهزة قد تكون ملصقة لمنع الفتح، كن لطيفاً
    • أحياناً توجد مشتتات حرارية تغطي جزءاً من الدائرة، إذا أمكن قم بإزالتها
  4. حدد المكونات
    • لجعل أسماء الدوائر أكثر وضوحاً
      • استخدم قطن + كحول، عندما يجف الكحول غطِّ الدائرة بالطباشير، ثم نظفها؛ الآن يجب أن يكون اسم الدائرة مقروءاً
      • استخدم عدسة مكبرة
    • ابحث عن المعلومات وأوراق البيانات على الإنترنت حول هذه المكونات؛ إذا لم يتم العثور على شيء جرب محركات البحث الصينية
      • Baidu
      • Sogou
      • Haosou
    • هام: العثور على مكون يحتوي على VCC و GND بشكل جيد مفيد جداً
  5. حدد واجهة UART: تقريباً TTY
    • ابحث على الإنترنت
    • ابحث على PCB عن GND، IN أو RX، OUT أو TX و VCC
    • ابحث عن 3/4 دبابيس على PCB
      1. ابحث عن مرجع لـ GND
        • باستخدام المكونات التي تم العثور عليها سابقاً
        • عادةً تكون الصفائح المعدنية عند GND
      2. ابحث عن مرجع لـ VCC
        • باستخدام المكونات التي تم العثور عليها سابقاً
        • ابحث عن المكثفات، عادةً تحتوي على نقطة عند VCC
      3. اختبر دبابيس UART المرشحة بملء الجدول أدناه (النقاط هي كل عمود من الجدول على التوالي)
        1. اختبر مقاومة دبابيس UART مقابل GND (مقياس متعدد لقياس المقاومة، عادة 200k)
  6. الاتصال عبر UART: استخدم محول تسلسلي (UART -> USB) للاتصال باللوحة عبر الكمبيوتر
    • المحول التسلسلي المختار: FT232H + Focaccia Board
    1. اختر الجهد المناسب (3.3V أو 5V)، وإلا ستتلف اللوحة أو المحول التسلسلي
    2. قم بتوصيل RX من اللوحة بـ TX من المحول و TX من اللوحة بـ RX من المحول
      • ملاحظة: عادة لا نحتاج لتوصيل دبوس VCC
    3. قم بتوصيل المحول بالكمبيوتر
      1. sudo lsusb لتحديد موقع المحول
      2. ls -lart /dev لتحديد جميع ملفات الجهاز؛ يجب أن يكون جهازنا من آخرها، عادة ttyUSB0
      3. للوصول إلى هذا الجهاز يجب أن نكون جزءاً من مجموعة dialout (أو أن نكون root)، للتحقق من مجموعاتنا
  7. حدد واجهة JTAG
    • ما هو JTAG: واجهة JTAG تعطي المصنعين طريقة لاختبار التوصيلات الفيزيائية بين الدبابيس على الشريحة. عندما يتحدث مهندسو الكهرباء عن استخدام JTAG لـ "تصحيح أخطاء" شريحة، فإنهم يتحدثون عن شيء مختلف تماماً عن تصحيح الأخطاء البرمجي التقليدي. إنهم يتحدثون عن التأكد من أن الدبوس A على الشريحة A متصل فعلياً بالدبوس B على الشريحة B، وأن جميع هذه الدبابيس تعمل بشكل صحيح. بما أن JTAG يعطيك وصولاً مباشراً للعتاد إلى الجهاز، فهو أيضاً أداة رائعة لأبحاث الأمان.
    • خصائص JTAG
      • قابلية التحكم: ضبط البتات الداخلية إلى 0 أو 1
      • قابلية الملاحظة: التحقق من قيمة البتات الداخلية
      • ...لذا قراءة/كتابة EEPROM
      • تصحيح الأخطاء داخل الدائرة: تصحيح أخطاء الكود على الدائرة (باستخدام مثلاً OpenOCD و GDB)
    • ابحث على الإنترنت
    • ابحث على PCB عن TCK، TDI، TDO، TMS و TRST (اختياري)
      • TCK (ساعة الاختبار): الطبّال، أو بندول الإيقاع الذي يحدد سرعة المتحكم. الجهد على هذا الدبوس ينبض ببساطة لأعلى ولأسفل في إيقاع ثابت وثابت. في كل "نبضة" من الساعة، يتخذ المتحكم إجراءً واحداً.
      • TMS (اختيار وضع الاختبار): الجهد على دبوس اختيار الوضع يتحكم في الإجراء الذي يتخذه JTAG. من خلال التلاعب بالجهد على هذا الدبوس، تخبر JTAG بما تريد أن يفعله.
      • TDI (إدخال بيانات الاختبار): الدبوس الذي يغذي البيانات إلى الشريحة. معيار JTAG لا يحدد بروتوكولات للاتصال عبر هذا الدبوس. ذلك متروك للشركة المصنعة. بقدر ما يهم JTAG، هذا الدبوس هو ببساطة طريقة دخول لـ و إلى الشريحة. ما تفعله الشريحة بها لا يهم JTAG.
  8. الاتصال عبر JTAG: استخدام "محول تسلسلي" (JTAG -> USB) للاتصال باللوحة عبر كمبيوتر
    • "المحول التسلسلي" المختار: FT232H + Focaccia Board
    1. اختيار الجهد المناسب (3.3V أو 5V)، وإلا ستتلف اللوحة أو المحول التسلسلي
    2. باستخدام توزيع أطراف JTAG الذي تم العثور عليه سابقًا، قم بتوصيل كل شيء معًا
    3. أبقِ اتصال UART مفتوحًا (كما شرح سابقًا) للتفاعل مع الجهاز ومراقبة سلوكه
    4. تشغيل OpenOCD
      • النافذة الأولى (خادم OpenOCD): openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
        • $FT232HCONFIGFILE: مرجع لوحة Focaccia
        • $BOARDCONFIGFILE: ملف تكوين اللوحة التي تخترقها (مفيد لكن ربما لن يكون لديك، اختياري)
          • ملاحظات
            • ملفات التكوين موجودة داخل /usr/local، ربما هنا تجد بعض $BOARDCONFIGFILE المفيدة
            • وإلا يمكنك البحث على الإنترنت
            • وإلا يمكنك كتابتها بنفسك
            • TODO (اكتبها بنفسك)
      • النافذة الثانية (عميل OpenOCD): telnet localhost 4444
  9. الحصول على البرنامج الثابت ونظام الملفات
    • الاحتمالات (قد يكون البرنامج الثابت ونظام الملفات مشفرين)
      • تنزيله من موقع الشركة المصنعة
      • إذا كان الجهاز فقط يمكنه تنزيل البرنامج الثابت (عبر تحديث) قم باعتراض الشبكة باستخدام wireshark لجمع المعلومات
      • قراءة EEPROM مباشرة باستخدام مبرمج شريحة ذاكرة ومشبك اختبار
      • أمر تفريغ من محمل الإقلاع
        1. تحليل سجل الإقلاع المطبوع على واجهة UART
          • المعلومات التي قد تُطبع ونحن مهتمون بها (القيم أمثلة ولكنها توضيحية لما نبحث عنه)
            • معلومات عامة عن محمل الإقلاع
              • ابحث عن اسم محمل الإقلاع وإصداره (مثال: U-Boot 1.1.3)
            • معلومات SOC
              • معلومات إضافية عن اللوحات (واي فاي، إيثرنت...)، قد تحمل محمل إقلاع خاص بها
              • طراز SOC (مثال: ASIC MT7621A...)
              • تردد CPU
            • معلومات RAM
              • mtd->writesize=2048: حجم الصفحة (بايت)
              • mtd->oobsize=64: بيانات تستخدم لتصحيح الأخطاء (بايت)
              • devinfo.iowidth=8: بيانات مكتوبة/مقروءة لكل عملية (بايت)
              • كمية RAM
            • معلومات EEPROM
              • mtd->erasesize=131072: عدد مرات الكتابة المتبقية في EEPROM؟ (تقريباً)
            • معلومات نواة نظام التشغيل
              • ابحث عن معلومات تحميل محمل الإقلاع، هنا قد تجد معلومات عن نظام الملفات
              • ابحث عن إصدار buildroot، سيساعدنا في محاكاة الدائرة وإجراء اختبارات مختلفة
            • معلومات نظام الملفات
              • ابحث عن معلومات تحميل محمل الإقلاع وعملية بدء نظام التشغيل، هنا قد تجد معلومات عن نظام الملفات

TODO تفريغ SPI

TODO إرفاق GDB????

الهندسة العكسية

  1. نوع عملية التهيئة وملفات التكوين
    • الأنواع
      • نمط BSD
        • بدء تنفيذ البرامج النصية في
          • /etc/rc
          • /etc/rc.local
        • الأحدث
          • انظر في /etc/rc.conf للحصول على معلومات
          • تنفيذ /etc/rc.d/
      • System V (الأكثر شيوعاً)
        • يتم بدء BusyBox
        • ملفات التكوين موجودة في /etc/inittab
          • runlevel
            • 1: وضع المستخدم الفردي، شيل جذر، بدون كلمة مرور، بدون تشغيل أي خلفية
            • 3: وضع متعدد المستخدمين نصي، موجه تسجيل الدخول
            • 5: تسجيل الدخول الرسومي
          • ثم هناك قائمة بالإجراءات التي تتم عند التهيئة
        • تنفيذ /etc/init.d/
      • Systemd (غير مستخدم في الأنظمة المضمنة)
    • كيفية التعرف
      • مطبوع عند الإقلاع
      • تحليل /sbin/init بحثاً عن المعلومات (أعلاه) التي تحدد الأنواع

بيئة المحاكاة

  • المتطلبات
    • معرفة معمارية وحدة المعالجة المركزية للملف الثنائي
      • بسيط باستخدام الأمر file
    • يجب أن يدعم QEMU هذه المعمارية
  • محاكاة QEMU (الأنماط)
    • نمط النظام: محاكاة النظام بأكمله
      • كيفية
        1. تحديد تنسيق الملف القابل للتنفيذ لـ QEMU: qemu-system-$PROCESSOR$ARCHITECTURE

          • مثال: qemu-system-mipsel
        2. إذا كنت تعرف عائلة المعالج يمكنك تحديدها لمساعدة QEMU على محاكاة البيئة بشكل أفضل

          • للحصول على قائمة بالعائلات المدعومة: $QEMUBIN -cpu help
          • من الأفضل البدء بعائلة CPU عامة، ثم إذا لم يعمل شيء حاول التعمق واستخدام عائلات CPU محددة
        3. نحتاج إلى نواة ونظام ملفات جذر

          • ملاحظات
            • نواة الجهاز ليست جيدة بسبب السائقين المفقودين
            • لا يوجد توحيد قياسي في عالم إنترنت الأشياء
              • استخدام شجرة أجهزة النواة: ملف نصي يحدد سائقين اللوحة
                • النواة عند الإقلاع ستحمل هذا الملف وتكيف السائقين العامين مع اللوحة المستخدمة
                • غير مستخدم كثيراً
            • لذا.. إعادة بناء النواة ونظام الملفات
          1. إيجاد إصدار النواة، إصدار libc وقائمة المكتبات المستخدمة من قبل الملف القابل للتنفيذ الذي نهتم به (readelf -d $EXECUTABLE)

            • تنسيق إصدار المكتبة: libfoo.X.Y.Z ( هو الإصدار)
  1. تحديد البايتات لوحدة النواة
    • أثناء الإقلاع، عادةً ما تُطبع معلومات عن NAND، ابحث عنها (الخطوات أعلاه) وابحث عن NAND ID، البايتات المطبوعة تكون بالترتيب: البايت الأول والثاني والرابع
    • يمكننا أيضًا العثور على هذه المعلومات من خلال البحث في ورقة بيانات EEPROM
    • يمكننا أيضًا استخدام writesize, oobsize, erasesize, iowidth للعثور هنا على الأمر الصحيح
    • وإلا، جرب وخطئ
  2. تحليل أقسام EEPROM المطبوعة عند الإقلاع لمعرفة أحجامها وأسمائها، الرقم الأخير في أمر flash_erase هو حجمها المرتبط بـ erasesize (نفس parts=x,y,z,...)
  3. تحميل الأقسام المستخرجة من الجهاز إلى الأقسام التي تم إنشاؤها للتو
  4. إنشاء نقطة تحميل لنظام الملفات وإرفاقها
    • -O: تحديد إزاحة رأس معرف الحجم، إذا كان خاطئًا يجب أن يخبرك النظام بالقيمة الصحيحة على أي حال، يمكنك تجربة قيم مختلفة مثل 512, 1024, 2048 (جرب وخطئ)
    • -m: رقم جهاز mtd (انظر النقطة 3)
    • -d: رقم جهاز UBI (انظر النقطة 5)
  • وضع المستخدم: مثل wine، تنفيذ ملف ثنائي فقط و"ترجمته" إلى بنيتنا
    • ملاحظات
      • ليس مستقرًا جدًا
      • يمكن أن يعطي نتائج غريبة
    • كيفية ذلك
      1. تحديد تنسيق QEMU القابل للتنفيذ: qemu-$PROCESSOR$ARCHITECTURE
        • مثال: qemu-mips64
      2. إذا اشتكى QEMU من عدم وجود المفسر، قم بتمرير مسار المجلد الذي يحتوي على هذا المفسر باستخدام -L (أو راجع man)
        • لمعرفة المفسر الذي يستخدمه ملف قابل للتنفيذ، استخدم readelf -l $EXECUTABLE
  • وضع المحاكاة الافتراضية: غير مهم بالنسبة لنا
  • بناء النواة ونظام الملفات الجذر باستخدام buildroot و docker
    • يجب أن تحتوي النواة التي نبنيها (بالنسبة للنواة الأصلية) على
      • نفس إصدار النواة
      • نفس إصدار مكتبة libc (uClibc, uClibc-ng, musl, dietlibc...)
      • نفس إصدارات المكتبات (للملف القابل للتنفيذ الذي نهتم به)
    1. ابحث عن إصدار buildroot الأقرب إلى إصدارات جهازنا
      • أحيانًا أثناء الإقلاع/استكشاف الذاكرة المفرغة، يمكننا العثور على إصدار buildroot المستخدم (إذا كان الجهاز مبنيًا باستخدام buildroot)
    2. ابحث عن إصدار Linux متوافق مع إصدار buildroot الذي تم العثور عليه وأنشئ حاوية docker، هنا نموذج dockerfile (الحزم مهمة لتشغيل buildroot)
    3. قم بتنزيل إصدار buildroot المحدد من هنا وضعه داخل المجلد المشترك لحاوية docker
    4. قم بتشغيل الحاوية والتبديل إليها

المصادر والائتمانات والشكر

  • شكرًا لـ Valerio Di Giampietro (@valerio) على قناته الرائعة على يوتيوب حول اختراق الأجهزة، كل ما هو مكتوب هنا مأخوذ على الأكثر من هذه الفيديوهات.
  • شكرًا لـ Luca Bongiorni (@LucaBongiorni) على نصائحه الثمينة وأدوات الأجهزة.
  • شكرًا لـ mightyohm.com على قصص اللحام المصورة
  • شكرًا لمجتمع Reddit hardwarehacking لمساعدتي
    • [Noob] Direct PCB soldering (maybe?)
  • شكرًا لـ Andrew Paul على تعليم لحام الفتحات
  • دليل Buildroot
  • شرح JTAG
  • OpenOCD - أوامر الفلاش
  • معلومات OpenOCD + JTAG
  • ورقة غش اختراق الأجهزة - PDF صغير
  • OpenOCD
تنزيل الأداة
  • اختبر مقاومة دبابيس UART مقابل VCC (مقياس متعدد لقياس المقاومة، عادة 200kOhm)
  • شغل الجهاز واختبر جهد دبابيس UART مقابل GND (مقياس متعدد لقياس الجهد، عادة 20V)
  • شغل الجهاز وأثناء الإقلاع اختبر الجهد المشتبه به لدبوس TX UART مقابل GND (مقياس متعدد لقياس الجهد، عادة 20V)؛ إذا كان الجهد متذبذباً فمن المحتمل أن هذا الدبوس هو TX (لأنه يرسل بيانات)
  • شغل الجهاز وأثناء الإقلاع اختبر الجهد المشتبه به لدبوس RX UART مقابل GND (مقياس متعدد لقياس الجهد، عادة 20V)؛ إذا كان الجهد ثابتاً عند 0 فمن المحتمل أن هذا الدبوس هو RX (لأنه ينتظر استقبال بيانات)
    • جدول

      PINGND resistanceVCC resistanceVNotes
      1
      2
      3
      4
      • مثال

  • استخدم Jtagulator
    1. قم بتوصيله بالكمبيوتر (معدل الباود: 115200)
    2. هام: H هي وظيفة طباعة المساعدة، استخدمها في كل مكان
    3. قم بتوصيل GND للوحة بـ GND لـ Jtagulator، ودبابيس اللوحة 1,2,3 بقنوات Jtagulator 1,2,3
    4. V: ضبط جهد العمل
    5. U: الدخول إلى قائمة تعريف UART
    6. U: بدء التعريف
    7. Text string to output: default
    8. Starting channel: القناة التي نضع فيها الدبوس 1 من اللوحة
    9. Ending channel: القناة التي نضع فيها الدبوس 3 من اللوحة
    10. Ignore non-printable characters: نعم
    11. انتهى!
  • TODO: - استخدم BurtleinaBoard + Busside
  • groups $USER
  • screen /dev/ttyUSB0 $BAUDRATE للاتصال بـ TTY
    • $BAUDRATE يمكن أن يكون واحداً من الموجودين هنا
    • أشهر $BAUDRATE
      • 115200
      • 9600
      • 57600
      • 38400
      • 19200
    • هام: إذا أخطأنا في $BAUDRATE قد نرى هراء أو حتى لا شيء
    • ctrl + a -> k -> y: إغلاق الشاشة (screen)
    • إذا بدا أن دبوس RX لا يعمل (تكتب وتضغط Enter ولكن لا يحدث شيء) فقد يكون أن قيمة "Enter" خاطئة: \r\n أم \n؟
      • لحل هذه المشكلة استخدم pyserial، مكتبة بايثون للاتصال التسلسلي، مثال:
        root@kitploit:~
        #!/usr/bin/env python3
        
        import serial
        
        ser = serial.Serial('/dev/ttyUSB0', 115200, tmieout = 0.1)
        ser.write(b"HELLO\r\n")
        ser.write(b"HELLO\n")
        
      • إذا استمرت المشكلة استخدم محلل منطقي (هنا واحد رخيص)
    1
    0
  • TDO (إخراج بيانات الاختبار): الدبوس للبيانات الخارجة من الشريحة. مثل دبوس إدخال البيانات، لم تحدد JTAG بروتوكولات الاتصال.
  • TRST (إعادة تعيين الاختبار، اختياري): تُستخدم هذه الإشارة لإعادة تعيين JTAG إلى حالة جيدة معروفة.
  • ابحث عن صف من 5/6 دبابيس أو صف مزدوج من 10، 12، 14، 20 دبوساً على PCB
    1. ابحث عن مرجع لـ GND
      • باستخدام المكونات التي تم العثور عليها سابقاً
      • عادةً تكون الصفائح المعدنية عند GND
    2. ابحث عن مرجع لـ VCC
      • باستخدام المكونات التي تم العثور عليها سابقاً
      • ابحث عن المكثفات، عادةً تحتوي على نقطة عند VCC
    3. اختبر دبابيس JTAG المرشحة بملء الجدول أدناه (النقاط هي كل عمود من الجدول على التوالي)
      1. اختبر مقاومة دبابيس JTAG مقابل GND (مقياس متعدد لقياس المقاومة، عادة 200k)
      2. اختبر مقاومة دبابيس JTAG مقابل VCC (مقياس متعدد لقياس المقاومة، عادة 200kOhm)
      3. شغل الجهاز واختبر جهد دبابيس JTAG مقابل GND (مقياس متعدد لقياس الجهد، عادة 20V)
      • جدول

    4. مقارنة القيم التي تم العثور عليها مع توزيعات أطراف JTAG الأكثر استخدامًا، المتاحة في jtagtest
  • استخدام Jtagulator
    1. توصيله بالكمبيوتر (معدل الباود: 115200)
    2. هام: H هي وظيفة طباعة المساعدة، استخدمها في كل مكان
    3. توصيل GND للوحة بـ GND في Jtagulator، أطراف اللوحة 1,2,3... بقنوات Jtagulator 1,2,3...
    4. V: ضبط جهد التشغيل
    5. J: الدخول إلى قائمة تعريف JTAG
    6. هناك خياران
      • I: التعريف باستخدام مسح IDCODE، لن يجد TDI (سريع)، أفضل إذا كان لدي العديد من الأطراف للتعرف عليها
      • B: التعريف باستخدام مسح BYPASS، سيجد TDI (بطيء)، أفضل إذا كان لدي أطراف أقل للتعرف عليها
    7. Starting channel: القناة التي نضع فيها الطرف 1 للوحة
    8. Ending channel: القناة التي نضع فيها الطرف n للوحة
    9. Already known pins: لا، لكنه قد يسرع العملية إذا كنا نعرف بعض الأطراف مسبقًا
    10. البدء والانتظار.. تم!
  • TODO: - استخدام BurtleinaBoard + Busside
  • هام
    • قد يكون JTAG معطلاً (عبر العتاد، بإزالة مقاومة)، لذا من الممكن أن يكون ما تجده باستخدام المقياس المتعدد وJtagulator غير متسق؛ يمكننا حل هذا بوضع مقاومة حوالي 300Ohm أو 1kOhm بين هذا الطرف و VCC
    • قد يكون JTAG معطلاً (عتادياً، بإزالة مقاومة)؛ يمكن حل هذه المشكلة بإعادة المقاومة أو عمل اتصال مباشر بقصر طرفي المقاومة
    • قد يكون JTAG معطلاً (برمجياً، بتعيين بعض القيم)
    • قد يكون JTAG معطلاً (عتادياً، بحرق فيوز... في هذه الحالة لا أمل)
    • أوامر مفيدة
      • halt: إيقاف CPU (مثل التجميد)
        • يجب القيام به قبل كل عملية تصحيح
      • reset: إعادة تعيين CPU
      • reg: قراءة سجلات CPU
      • flash info bank $BANKID أو flash info $BANKID: طباعة معلومات عن بنك ذاكرة الفلاش $BANKID (أعتقد أن البنوك = أجزاء من الذاكرة)
      • flash list: استرجاع قائمة من المصفوفات الترابطية لكل جهاز تم تعريفه باستخدام flash bank (في $BOARDCONFIGFILE)، مرقمة من الصفر
      • flash banks: طباعة ملخص من سطر واحد لكل جهاز تم تعريفه باستخدام flash bank (في $BOARDCONFIGFILE)، مرقمة من الصفر
      • flash write_image erase "$BINTOWRITE" $ADDRTOSTART: وميض الذاكرة
        • $BINTOWRITE: يمكن أن يكون bin (ثنائي)، ihex (Intel hex)، elf (ملف ELF)، s19 (Motorola s19)، mem...
        • $ADDRTOSTART: العنوان الذي سيبدأ منه الكتابة (أعتقد أن الافتراضي هو 0)
      • flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP: تفريغ الذاكرة
        • $OUTFILE: ملف ثنائي لحفظ التفريغ
        • $ADDRTOSTART: العنوان الذي سيبدأ منه القراءة (أعتقد أن الافتراضي هو 0)
        • $SIZETODUMP: عدد البايتات المراد تفريغها
    • المزيد هنا:
      • PDF OpenOCD
      • HTML OpenOCD
    • TODO
  • أقسام EEPROM
    • ابحث عن عملية بدء نظام التشغيل، هنا قد تجد معلومات عن أقسام EEPROM، أسمائها، نقاط التثبيت وطولها في RAM
    • إذا رأيت أقساماً مكررة فمن المحتمل لتحديثات البرنامج الثابت، يمكنك تخمين السبب
  • معلومات عملية التهيئة
    • ابحث عن init started أو شيء مشابه، ربما سيكون بالقرب من سلسلة BusyBox أو ما يشابهها
  • هل محمل الإقلاع يحتوي على واجهة أوامر؟
    • ابحث عن قائمة محمل الإقلاع، هنا ربما نجد إجابة هذا السؤال
  • حاول الحصول على شيل محمل الإقلاع (تلقائياً أو عبر قائمة طباعة عبر UART)
  • استكشاف شيل محمل الإقلاع
    • أمر help هو صديقك
    • حاول إيجاد طريقة لتفريغ محتوى الذاكرة، بايثون هو صديقك
    • بيانات OOB (تصحيح الأخطاء) ليست مفيدة جداً للتفريغ
  • تحليل البيانات المفرغة
    • استخدم binwalk و file و hexdump -C للتحقق مما إذا كان الملف المفرغ سليماً أم لا وما إذا كان مضغوطاً أو مشفراً
      • باستخدام binwalk -E نحلل الإنتروبيا للملف
        • الإنتروبيا قريبة من 1: ملف عشوائي أو مضغوط أو مشفر
        • الإنتروبيا أقل من 1: ملف تنفيذي أو ملف عادي
    • استخدم binwalk -e لاستخراج الأجزاء القابلة للتعريف من الملف
  • إذا كان binwalk لا يفهم الصورة المفرغة بالكامل يمكننا استخدام جدول أقسام EEPROM (إذا تم العثور عليه سابقاً) لتقسيم الصورة المفرغة يدوياً إلى صور مفيدة متعددة
    • dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITE
    • sha1sum أو md5sum أو binwalk -W -i لمقارنة الصور (إذا كنا نعتقد مثلاً أنها قد تكون نفس الصورة)
  • قد يتم تنفيذ العملية الأخيرة عدة مرات اعتماداً على ما تحتويه الصورة المفرغة؛ إذا كان لدينا مثلاً صورة النواة يمكننا استخراج مكوناتها مرة أخرى باستخدام binwalk (أو dd إذا تمكنا من العثور على كيفية تنظيم صورة النواة الخاصة بنا عبر الإنترنت) لقراءة نظام الملفات الجذر
  • استخراج نظام الملفات
    • أمر مثال (بناءً على نوع نظام الملفات): fakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
      • fakeroot: إنشاء بيئة جذر وهمية، مفيدة لمحاكاة أذونات الملفات، ملفات الأجهزة...
        • -s fakeroot.dat: حفظ بيئة الجذر الوهمية لاستعادتها لاحقاً باستخدام الأمر fakeroot -i fakeroot.dat bash
      • usquashfs: استخراج نظام الملفات squashfs (قد يكون مختلفاً في حالتك)
        • -d squashfs-root: المجلد الوجهة
        • u04-sqfs.dat: صورة نظام الملفات المراد استخراجها
  • الملفات الثنائية والبرامج النصية المثيرة للاهتمام
    • ابحث عن ملفات مثيرة للاهتمام يتم تشغيلها بواسطة عملية التهيئة وبشكل عام لا تتوقف عند الأسماء، ابحث في العمق عن الملف الثنائي الذي يتم تنفيذه وقم بتحليله؛ الأكثر إثارة للاهتمام هي غير القياسية
    • ابحث عن سلسلة factory mode؛ إذا نجحنا في وضع الجهاز في وضع المصنع (إذا كان موجوداً) فإن اختراقه يصبح أسهل بكثير
    • أوامر مفيدة
      • محرر نصوص
      • grep
      • find
      • xargs
      • strings
  • X.Y.Z
    • X واجهة ثنائية غير متوافقة
    • Y واجهة ثنائية متوافقة مع الإصدارات السابقة
    • Z لا تغييرات في الواجهة الثنائية
  • لذا نحتاج إلى X.Y مساوٍ للمكتبة الأصلية
    • مقبول: نفس X، Y أعلى
  • البناء باستخدام نظام بناء (اختيار الميزات وتتبع التبعيات تلقائياً)

    • أفضل خيارات أنظمة البناء
      • مشروع Yocto
      • Buildroot (الأفضل)
      • نظام بناء OpenWRT
  • بدء المحاكاة

    • سكربت محاكاة QEMU
      root@kitploit:~
      #!/bin/bash
      # This script will build an environment without password for the user root
      export QEMU_AUDIO_DRV="none" # ignore audio drivers
      
      qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # See point 2
                                              -m $RAMSIZE \
                                              -kernel $KERNELPATH \
                                              -nographic \ # No GUI
                                              -hda $FILESYSTEM \
                                              -net nic,model=$NETCARDMODEL \ # Model of net card, driver must be included in kernel
                                              -net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222 as ssh and 9000 for GDB server
                                              -no-reboot \ # Terminate the machine when is halted
                                              -append "root=/dev/hda console=uart0" # Set root filesystem and console
      
      • إذا تم طباعة خطأ عند تنفيذ ملف ثنائي حول مكتبات مفقودة فقم بتعيين LD_LIBRARY_PATH كالتالي (داخل الجهاز): export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER
    • يمكننا أيضاً محاكاة NAND EEPROM
      root@kitploit:~
      #!/bin/bash
      
      # Part 1: Identify bytes for kernel module
      modprobe nandsim first_id_byte=$FIRSTBYTE \
                          second_id_byte=$SECONDBYTE \
                          third_id_byte=$THIRDBYTE \
                          fourth_id_byte=$FOURTHBYTE \
                          cache_file=/root/nandsim.bin \
                          parts=x,y,z,... # Define partitons size in number of erase blocks; the number of partitions depends on your device, partitions are usually print on boot
      
      # Part 2: Erase partitions created (analyze EEPROM partitions)
      flash_erase /dev/mtd0 0 8 
      flash_erase /dev/mtd1 0 20
      # ...
      
      # Part 3: Load partitions dumped from device in the ones just created
      nandwrite /dev/mtd0 part0.bin
      nandwrite /dev/mtd1 part1.bin
      # ...
      
      # Part 4: Create mountpoint for filesystem and attach (if UBIFS)
      mkdir /mnt/filesystem
      ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM
      ```# الجزء 5: التحميل
      mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
      
  • التحميل
  • استخرج buildroot و make manual لإنشاء دليل buildroot
  • باستخدام make help، يطبع buildroot جميع الأجهزة المدعومة (اللوحات)؛ استخدم make $YOURBOARDNAME لإنشاء ملف تكوين buildroot للوحة الخاصة بك
  • make menuconfig (نصي) أو make xconfig (واجهة رسومية) لاختيار وحدات النواة المراد إضافتها إلى بنائنا، سنستخدم make xconfig
    • يوجد هنا مثال/دليل إرشادي ولكن ستحتاج إلى اكتشاف بنفسك الوحدات المحددة التي ستحتاجها لتشغيل تطبيقاتك
    • اختراق: Edit->Find للبحث عن الوحدات
    • الخيارات
      • Target options
        • حدد Show options and packages that are deprecated or obsolete
        • حدد Build packages with debugging symbols بأعلى debug level
        • حدد Strip command for binaries on target إلى None
        • حدد GCC optimization level إلى 0
      • Toolchain
        • حدد Toolchain type إلى Buildroot toolchain
        • حدد Kernel headers إلى Manually specified linux version
        • حدد Custom kernel headers series إلى $DEVICEKERNELVERSION
        • عيّن Linux version إلى $DEVICEKERNELVERSION
        • حدد C library إلى $DEVICECLIBRARY
        • حدد $DEVICECLIBRARY version إلى $DEVICECLIBRARY $DEVICELIBRARYVERSION
        • حدد Enable large files
      • System configuration
        • حدد Passwords encoding إلى MD5
        • حدد Init system إلى $DEVICEINITSYSTEM (أو BusyBox)
        • حدد /dev management إلى Dynamic using devtmpfs only
        • حدد /bin/sh إلى Busybox default shell
        • حدد Install timezone info
      • Kernel
        • عيّن Kernel version إلى $DEVICEKERNELVERSION
        • حدد Kernel binary format إلى vmlinux
      • Target packages
        • Compressors and decompressors
          • bzip2 و xz-utils
        • Debugging profiling and benchmark
          • حدد gdb و full debugger
        • Development tools
          • ما ستحتاجه
        • Filesystem and flash utilities
          • mtd, jffs2 and ubi/ubifs tools (أو ما ستحتاجه)
        • Libraries
          • بشكل عام ما تحتاجه (اقتراحات أدناه)
          • Crypto
            • libsha1
      • Networking applications
        • rsync وما تحتاجه
      • Shell and utilities
        • file
      • Filesystem images
        • ext2
      • Host utilities (ليس عن الجهاز الهدف، نحن نتحدث عن جهاز المضيف هنا)
        • host mtd, jffs2 and ubi/ubifs tools
        • host util-linux
    • تذكر أن تحفظ
  • لحفظ التكوين المحدد بشكل دائم، استخدم make savedconfig
  • قم بتكوين النواة باستخدام make linux-menuconfig (نصي) أو make linux-xconfig (واجهة رسومية)، هنا سنستخدم إصدار سطر الأوامر
    • يوجد هنا مثال/دليل إرشادي ولكن ستحتاج إلى اكتشاف بنفسك الوحدات المحددة التي ستحتاجها لتشغيل تطبيقاتك
    • الخيارات
      • Kernel type -> Preemption model (Preemptible Kernel (Low-Latency Desktop)) -> Preemptible Kernel (Low-Latency Desktop)
      • Kernel type -> Device drivers -> Memory technology device (MTD) support -> NAND device support -> Support for NAND flash simulator
      • Kernel type -> Device drivers -> Memory technology device (MTD) support -> UBI - Unsorted block images -> Enable UBI
      • File systems -> Miscellaneous filesystem -> JFFS2 support
      • File systems -> Miscellaneous filesystem -> UBIFS filesystem support
    • Save
  • قم بتكوين uClibc (أو مكتبة c الخاصة بك) باستخدام uclibc-menuconfig (كالمعتاد)
    • تمكين التصحيح: Development/Debugging options -> Enable debugging symbols، إذا لم يعمل هذا (أخطاء التجميع) فاستخدم Development/Debugging options -> (Wall) compiler warnings -> أضف -Wall -ggdb -g3
      • -ggdb: يوفر معلومات التصحيح لاستخدامها مع GDB
      • -g3: يوفر معلومات تصحيح إضافية
    • Save
    • تمكين الميزات كما في جهازنا (جرب وخطئ، إذا حصلت على أخطاء، تحقق ثم أعد البناء مع الميزات المطلوبة)
  • make، إذا ظهرت مشاكل، عد إلى الخلف
    • أخطاء التجميع المحتملة
      • Need to use -fPIC
        • أضف --enable-shared في وحدات النواة (النقطة 7) تحت Toolchain -> Additional gcc options أو قم بتصحيح buildroot
    • حفظ ملفات التكوين لـ buildroot مع git
      • هيكل الشجرة الخارجية (عرض الشجرة للملفات التي يفهمها buildroot) (br2)
        root@kitploit:~
        +-- board/
        |   +-- <company>/ (ليس دائمًا مستخدمًا)
        |       +-- <boardname>/
        |           +-- linux.config
        |           +-- busybox.config
        |           +-- kernel-defconfig (ملف تكوين النواة)
        |           +-- <ملفات تكوين أخرى>
        |           +-- post_build.sh (يُنفذ قبل بناء الصورة مباشرة، مفيد لنسخ نظام الملفات الجذر إلى الصورة)
        |           +-- post_image.sh
        |           +-- rootfs_overlay/ (سيتم نسخ كل شيء هنا في الصورة النهائية)
        |           |   +-- etc/
        |           |   +-- <some file>
        |           +-- patches/
        |               +-- foo/
        |               |   +-- <some patch>
        |               +-- libbar/
        |                   +-- <some other patches>
        |
        +-- configs/
        |   +-- <boardname>_defconfig (تكوين buildroot للوحة الخاصة بنا)
        |   +-- uClibc.config (اختياري)
        +-- patches/
        |   +-- (هنا التصحيحات التي سيتم تطبيقها)
        |
        +-- Config.in (إذا كنت تستخدم شجرة br2-external)
        +-- external.mk (إذا كنت تستخدم شجرة br2-external)
        +-- external.desc (إذا كنت تستخدم شجرة br2-external)
        
      • لاستخدام شجرة خارجية، استدعِ buildroot هكذا: make BR2_EXTERNAL=$PATHTOEXTTREE $COMMAND
      • لحفظ تكوين buildroot في شجرتنا الخارجية: make BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig
      • لحفظ تكوين النواة في شجرتنا الخارجية: make BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig
      • لحفظ تكوين uClibc في شجرتنا الخارجية: make BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig
    PINGND resistanceVCC resistanceVNotes
    130kOhm0Ohm3.3VVCC
    24.7kOhm34kOhm3.3V1.6-3.3V on boot - TX
    3INFOhm (multimeter 1)INFOhm (multimeter 1)3.3V0V on boot - RX
    40Ohm30kOhm0VGND
    PINGND resistanceVCC resistanceVNotes
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    • مثال

      PINGND resistanceVCC resistanceVNotes
      11kOhm1kOhm0V
      20Ohm90Ohm0VGND
      3INFOhm (multimeter 1)INFOhm (multimeter 1)2.1Vمقاومة عالية, TDO?
      490Ohm0Ohm3.3VVCC
      54.7kOhm4.7kOhm3.3V
      6INFOhm (multimeter 1)INFOhm (multimeter 1)0Vغير متصل؟
      75.7kOhm5.7kOhm3.3V
      8INFOhm (multimeter 1)INFOhm (multimeter 1)0Vغير متصل؟
      94.7kOhm4.7kOhm3.3V
      100Ohm90Ohm0VGND
      • تم العثور على توزيع أطراف اختبار JTAG متوافق: Altera Byteblaster
  • حدد Enable IPv6
  • حدد Enable RPC
  • حدد Enable WCHAR
  • حدد Thread library implementation إلى linuxthreads
  • حدد Thread library debugging
  • حدد Build cross gdb for the host
  • حدد TUI support
  • حدد Python support
  • حدد GDB debugger version إلى $LATESTGDBVERSION
  • libssh2
  • openssl
  • JSON/XML
    • expat
    • json-c