السلامة في إلكترونيات السيارات - عالم الترحيب على وحدة تحكم لوحة أجهزة القياس

بعد تجربة حافلة CAN في السيارة ، كانت هناك رغبة برية في الحفر أعمق قليلاً في أقدس القداسات. أعتقد أن الجميع يعرف مصطلحًا مثل "ضبط رقاقة" ، وهو باللغة الروسية عبارة عن برنامج ثابت بسيط لوحدات التحكم (المحرك وعلبة التروس وغيرها). تضع الشركة المُصنّعة للمعدات في البداية وظائف في أجهزتها لتحديث برنامج microcontroller أو تغييره ، لكن آليتها لا يتم الكشف عنها لأي شخص لأسباب واضحة ، ولتعقيد هذه العملية ، لا يتم تخزين البرنامج نفسه ، الذي يعمل به مع ذاكرة غير متطايرة ، في البرامج الثابتة ، ولكن يتم تحميله في تحكم فقط في وقت الخدمة. تتناول هذه المقالة كيفية جعل متحكم لوحة المعلومات ينفذ رمز شخص آخر أثناء الوصول إلى موصل التشخيص التلقائي.

بشكل عام ، يتم وصف آلية تحميل البيانات في وحدة التحكم الإلكترونية (ECU) في بروتوكول تشخيص UDS ، وهي الوظائف:

34 - طلب تحميل
36 - نقل البيانات

ولكن فيما يتعلق بتنفيذ UDS ، فإن شركات صناعة السيارات ليست شديدة الحساسية لإجراء تغييرات / إضافات على البروتوكول ، مما يؤدي إلى إنشاء وظيفة إضافية خاصة. في حالتي ، تبدو عملية التحديث على النحو التالي:

  1. تسجيل الدخول إلى جلسة تشخيص موسعة
  2. إعادة تشغيل في بووتلوأدر
  3. الحصول على وصول الأمان للسماح لعملية تحميل البيانات
  4. نقل العنوان في الذاكرة حيث سيتم الاحتفاظ بسجل وحجم البيانات
  5. تحميل البيانات
  6. فعل ما تم تحميله
  7. التالي هو برمجة EEPROM مع البرنامج الذي قمت بتنزيله من قبل.

النقاط 1-3 لم تكن صعبة ، ولكن ماذا تفعل بعد ذلك؟ أين يمكن الحصول على العنوان والحد الأقصى لمقدار البيانات؟ كيف بعد التمهيد للقيام بما تم تنزيله؟ في الواقع ، من أجل هذا ، يتم كتابة مقال.

تم اختيار مجموعة من الأجهزة كموضوع اختبار ، لأنه ، أولاً ، لدي واحد آخر في حالة نهاية العالم ، وثانياً ، يمكن قراءة جهاز التحكم الخاص به باستخدام محول USB-RS232 بسيط. بعد دراسة الدواخل ، لدينا وحدة تحكم Fujitsu MB91F223. هذا هو ميكرون 32 بت مع جوهر FR60Lite ، 512 كيلو بايت من الذاكرة و 16 كيلو بايت من ذاكرة الوصول العشوائي. يمكن بسهولة البحث على ورقة البيانات ، RM ، دليل Assembler ، مبرمج لذلك ، لن أتوقف هنا. هنا هو وسيم:



خطة العمل:

  1. البحث عن معالجات طلب التشخيص
  2. ابحث عن عناوين في الذاكرة حيث يمكنك كتابة شيء ما
  3. ابحث عن طريقة لتنفيذ التعليمات البرمجية المسجلة

لتنفيذ الخطوة 1 ، تحتاج إلى دراسة معالج المقاطعة من ناقل CAN وفهم مكان تخزين البيانات لمزيد من المعالجة. تحتوي العديد من وحدات التحكم على جدول متقاطع ما يسمى ، والذي يحتوي على عناوين الوظائف المسؤولة عن معالجتها. في عائلة Fujitsu FR ، يوجد هذا الجدول في صناعته ، ويتم تخزين المؤشر إليه في سجل TBR (سجل قاعدة الجدول). بحث نص بسيط في المؤسسة الدولية للتنمية يعطي نتيجة إيجابية وعنوان جدول المقاطعة معنا.



وفقًا للدليل ، يوجد عنوان المقاطعة CAN في الإزاحة 0x370 من بداية TBR. ها هو ذا.



هو ، ولكن بالفعل في النمو الكامل ، هو أيضا معالج الرسائل باستخدام بروتوكول ISO-TP

لم يكتمل معالج ISO-TP ، ولكن تتباعد إطارات الأنواع المختلفة


من قاعدة بيانات برنامج تشخيص الوكلاء ، كان لدي معرّفات SID و LID (31E1) لبروتوكول UDS الذي بدأ إجراء تنفيذ التعليمات البرمجية ، مما أدى إلى تبسيط المهمة وسمح لي بالتصرف من النهاية إلى البداية. في معالج الوظائف 31E1 ، تم العثور على جزء يتم فيه تحميل العنوان التابع لمنطقة RAM ، ثم يتم إجراء مكالمة على هذا العنوان. أليس هذا ما نبحث عنه؟



يؤدي البحث عن استخدام 0x3F100 الثابت إلى مكان آخر في البرنامج الثابت ، إلى معالج وظائف UDS 34 - طلب تنزيل! هذا هو بالضبط ما تحتاجه ، تم العثور على عنوان لكتابة البيانات والحد الأقصى للمبلغ (0x700 بايت) في ذاكرة الوصول العشوائي.



الآن ، بعد إرسال أمر لطلب إذن لتنزيل البيانات 34 03F100 00 00010C ( يشار إلى العنوان المائل بالخط المائل بالخط العريض) ، تستجيب لوحة المعلومات مع استجابة جيدة 740401. بعد ذلك ، يتم تحميل بيانات المستخدم باستخدام وظيفة نقل البيانات ويتم إصدار أمر للوفاء. لقد اكتشفنا التحميل والتنفيذ ، ولكن عليك الآن العثور على ما يمكن تنزيله. لم أجد بيئة تطوير مفتوحة المصدر لهذا المتحكم الدقيق ، ولكن بعد شهر كان هناك طرق غير متوقعة للدعم الفني من السرو (نعم ، وليس فوجيتسو ، إما أنهم استوعبوها ، بشكل عام ، لا أعرف) ، لقد أعطوا رابطًا إلى IDE يسمى Shaggy Softune Workbench 97 السنوات التي جاء فيها المترجم تحت نواة الاب.

هذا ما يبدو عليه ، وليس زوج vscode.

في لقطة الشاشة ، وهي جزء من البرنامج الخاص بمصابيح LED الوامضة (لا تستخدم أسلوب الكتابة في المجمع ، فهذه هي تجربتي الأولى).



نفس الرمز ، ولكن بالفعل في سي

void delay(int loops) { while(--loops) { #pragma asm NOP NOP #pragma endasm __asm(" nop"); } } #define DDR2 (*((char*)0x402)) #define PDR2 (*((char*)0x2)) #define WPR (*((char*)0x485)) #define LVRC (*((char*)0x57D)) void wdt_reset(void) { WPR = 0xA5; WPR = 0x5A; LVRC = 0x10; } void main(void) { int current_pin = 2; DDR2 |= 0x7E; while(1) { wdt_reset(); PDR2 |= current_pin; delay(0x7FFF); PDR2 &= ~current_pin; delay(0x7FFF); current_pin <<= 1; if(current_pin >= 0x80) { current_pin = 2; } } } 

حسنا ، النتيجة نفسها


مع العقد الأخرى ، يبدو كل شيء كما هو ، باستثناء بنية وحدة التحكم والترتيب الذي يتم به تنفيذ الأوامر. هل من الآمن ترك مثل هذه الثغرات في معدات السيارات؟ على ما يبدو نعم ، لأن الشركة المصنعة تفعل ذلك. لماذا أفعل هذا؟ لقد كان مثيرا للاهتمام ، حسنًا ، كان المجمع يهتم بي لفترة طويلة ، التقيت به ، إذا جاز التعبير.

Subject - لوحة العدادات Mitsubishi 8100B197 ، تم إجراء الاتصال على حافلة CAN بواسطة مهايئ Tactrix OpenPort 2.0 ، وهو برنامج على جهاز كمبيوتر خاص به.

Source: https://habr.com/ru/post/ar474718/


All Articles