بعد
تجربة حافلة CAN في السيارة ، كانت هناك رغبة برية في الحفر أعمق قليلاً في أقدس القداسات. أعتقد أن الجميع يعرف مصطلحًا مثل "ضبط رقاقة" ، وهو باللغة الروسية عبارة عن برنامج ثابت بسيط لوحدات التحكم (المحرك وعلبة التروس وغيرها). تضع الشركة المُصنّعة للمعدات في البداية وظائف في أجهزتها لتحديث برنامج microcontroller أو تغييره ، لكن آليتها لا يتم الكشف عنها لأي شخص لأسباب واضحة ، ولتعقيد هذه العملية ، لا يتم تخزين البرنامج نفسه ، الذي يعمل به مع ذاكرة غير متطايرة ، في البرامج الثابتة ، ولكن يتم تحميله في تحكم فقط في وقت الخدمة. تتناول هذه المقالة كيفية جعل متحكم لوحة المعلومات ينفذ رمز شخص آخر أثناء الوصول إلى موصل التشخيص التلقائي.
بشكل عام ، يتم وصف آلية تحميل البيانات في وحدة التحكم الإلكترونية (ECU) في بروتوكول تشخيص
UDS ، وهي الوظائف:
34 - طلب تحميل
36 - نقل البياناتولكن فيما يتعلق بتنفيذ UDS ، فإن شركات صناعة السيارات ليست شديدة الحساسية لإجراء تغييرات / إضافات على البروتوكول ، مما يؤدي إلى إنشاء وظيفة إضافية خاصة. في حالتي ، تبدو عملية التحديث على النحو التالي:
- تسجيل الدخول إلى جلسة تشخيص موسعة
- إعادة تشغيل في بووتلوأدر
- الحصول على وصول الأمان للسماح لعملية تحميل البيانات
- نقل العنوان في الذاكرة حيث سيتم الاحتفاظ بسجل وحجم البيانات
- تحميل البيانات
- فعل ما تم تحميله
- التالي هو برمجة EEPROM مع البرنامج الذي قمت بتنزيله من قبل.
النقاط 1-3 لم تكن صعبة ، ولكن ماذا تفعل بعد ذلك؟ أين يمكن الحصول على العنوان والحد الأقصى لمقدار البيانات؟ كيف بعد التمهيد للقيام بما تم تنزيله؟ في الواقع ، من أجل هذا ، يتم كتابة مقال.
تم اختيار مجموعة من الأجهزة كموضوع اختبار ، لأنه ، أولاً ، لدي واحد آخر في حالة نهاية العالم ، وثانياً ، يمكن قراءة جهاز التحكم الخاص به باستخدام محول USB-RS232 بسيط. بعد دراسة الدواخل ، لدينا وحدة تحكم Fujitsu MB91F223. هذا هو ميكرون 32 بت مع جوهر FR60Lite ، 512 كيلو بايت من الذاكرة و 16 كيلو بايت من ذاكرة الوصول العشوائي. يمكن بسهولة البحث على ورقة البيانات ، RM ، دليل Assembler ، مبرمج لذلك ، لن أتوقف هنا. هنا هو وسيم:

خطة العمل:
- البحث عن معالجات طلب التشخيص
- ابحث عن عناوين في الذاكرة حيث يمكنك كتابة شيء ما
- ابحث عن طريقة لتنفيذ التعليمات البرمجية المسجلة
لتنفيذ الخطوة 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 ، وهو برنامج على جهاز كمبيوتر خاص به.