إخلاء المسئولية: بدأت الدراسة في عام 2013 ، لذلك إذا كنت تعتقد أن بعض الطرق غبية وخطيرة - أنت على حق ، هذا ما حدث. ومع ذلك ، لقد تعلمت الكثير في هذه العملية.الدخولبدأ كل شيء قبل بضعة أشهر من ولادة طفلي الأول. كنت أنا وزوجتي نرغب دائمًا في شراء كاميرا لايكا الرائعة وأدركنا فجأة أننا إذا لم نشتريها الآن ، فلن نستطيع القيام بذلك لفترة طويلة. لذلك ، طلبنا الكاميرا M240 و ... طفرة ، كنا في خط لمدة ستة أشهر. سرعان ما سئمت الانتظار ، وبدأت في دراسة موقعهم. تم لفت انتباهي على الفور إلى قسم الملفات. حسنًا ، يمكنك تخمين السبب ... البرامج الثابتة!
رأيت ملفًا غير مشفر وغير مضغوط (
m8-2_005.upd
) يبدأ
بسحر PWAD . هل تعرف؟ نعم ، هذا صحيح ، هذا هو تنسيق Doom Patch WAD. يبدو أن الرجال يحبون الكلاسيكية. التنسيق
موثق جيدًا ، لذلك لم يكن من الصعب تحليله.
ملفات البرامج الثابتة لايكا
البرامج الثابتة لايكا M8
هذا أمر مضحك للغاية ، لأنه عندما درست لاحقًا ملف البرنامج الثابت المضغوط Leica T ، قررت أولاً اختبار طرق الضغط التي استخدمها البرنامج في الماضي.
تقول ويكيبيديا إنهم استخدموا
تنسيق LHA ، والذي هو أساسًا LZW. لكن برامج إلغاء ضغط LZW الشائعة لم تكن مناسبة ، لذلك بدأت في البحث عن تطبيق محدد لبرنامج معرف - وفويلا ، وجدت
Catacomb Armageddon في
المصدر . يجب أن أعترف ، محظوظ.
في أي حال ، والعودة إلى M8. هنا هو هيكل البرامج الثابتة:
القواعد: 0x0000008C (3036: 0x00000BDC) - وصف XML
LUTS: 0x00000C68 (183274: 0x0002CBEA)
GAMMA: 0x0000007C (31760: 0x00007C10)
ربح: 0x00007C8C (50344: 0x0000C4A8)
LEICA: 0x00014134 (7000: 0x00001B58)
blemish: 0x00015C8C (250: 0x000000FA)
WREF: 0x00015D88 (82480: 0x00014230)
OBJ: 0x00029FB8 (11268: 0x00002C04)
الإصدار: 0x0002CBBC (46: 0x0000002E)
PXA: 0x0002D854 (858384: 0x000D1910)
BF: 0x000FF164 (134522: 0x00020D7A) - عائلة معالجات Blackfin لأجهزة التناظرية
واجهة المستخدم الرسومية: 0x0011FEE0 (3574180: 0x003689A4)
TRANS: 0x0000005C (59988: 0x0000EA54) - الترجمة
الصور: 0x0000EAB0 (267433: 0x000414A9)
21_1PRT: 0x000000CC (18411: 0x000047EB) - صورة JFIF
21_2GRP: 0x000048B8 (23172: 0x00005A84) - صورة JFIF
21_3PAN: 0x0000A33C (23034: 0x000059FA) - صورة JFIF
24_1PRT: 0x0000FD38 (18489: 0x00004839) - صورة JFIF
24_2GRP: 0x00014574 (23230: 0x00005ABE) - صورة JFIF
24_3PAN: 0x0001A034 (22998: 0x000059D6) - صورة JFIF
28_1PRT: 0x0001FA0C (22605: 0x0000584D) - صورة JFIF
28_2GRP: 0x0002525C (23081: 0x00005A29) - صورة JFIF
28_3PAN: 0x0002AC88 (23282: 0x00005AF2) - صورة JFIF
35_1PRT: 0x0003077C (22496: 0x000057E0) - صورة JFIF
35_2GRP: 0x00035F5C (23532: 0x00005BEC) - صورة JFIF
35_3PAN: 0x0003BB48 (22881: 0x00005961) - صورة JFIF
FONT1: 0x0004FF5C (1522988: 0x00173D2C)
FONT2: 0x001C3C88 (1723676: 0x001A4D1C)
الإصدار: 0x003689A4 (0: 0x00000000)
M16C: 0x00488884 (130406: 0x0001FD66) - عائلة رينيساس M16C (سجل موتورولا S)
FPGA: 0x004A85EC (131604: 0x00020214) - Xilinx Spartan 3
FSL: 0x004C8800 (814: 0x0000032E) - محمل الإقلاع في المرحلة الأولى
لا تدعم IDA خارج الصندوق معالجات Blackfin ، ولكن يوجد
ملحق إضافي لجهة خارجية .
البرامج الثابتة لايكا M9
يبدو ملف البرنامج الثابت Leica M9 (
m9-1_196.upd
) مشفرًا: يعرض الرسم البياني توزيعًا بنسبة 0.45٪ تقريبًا.

نهاية القصة؟ ربما لا. الحقيقة هي أن Leica استخدم معالجات ضعيفة إلى حد ما في الكاميرات ، وفي ذلك الوقت كان يستخدم تشفير XOR غالبًا في الأجهزة الإلكترونية الاستهلاكية ، لذلك قررت أن أكتب أداة بسيطة لتشغيل XOR لمقارنة البرامج الثابتة بنفسي وحساب بعض الإحصاءات.
تم تحديد طول المفتاح من خلال البحث عن أطول نمط متكرر. هذا أمر منطقي ، حيث أن أي برنامج ثابت يتضمن عادة كتل كبيرة من البيانات المكررة ، مثل لوحة 0x00 / 0xFF أو رسومات ذات LUT بكسل. يتم حساب المفتاح نفسه بواسطة تردد البايتات داخل طول المفتاح ، حيث يذهب البايت الأكثر شيوعًا إلى المخزن المؤقت للمفتاح. أشارت نتيجة البرنامج إلى تشفير XOR بوضوح. ثم اضطررت إلى
تعديل الأداة قليلاً للحصول على المفتاح المحتمل وفك تشفير الرمز. تحول هذا مرة أخرى إلى أن يكون ملف PWAD.
كشف محتوى PWAD عن الهيكل التالي:
القواعد: 0x0000007C (2788: 0x00000AE4) - وصف XML
LUTS: 0x00000B60 (4060616: 0x003DF5C8)
العملية: 0x0000004C (3900572: 0x003B849C)
إنشاء: 0x0000004C (20: 0x00000014) - الطابع الزمني
LUTS: 0x00000060 (427744: 0x000686E0)
GAINMAP: 0x00068740 (20008: 0x00004E28)
العدسات: 0x0006D568 (3452724: 0x0034AF34)
CCD: 0x003B84E8 (148662: 0x000244B6)
إنشاء: 0x0000004C (20: 0x00000014) - الطابع الزمني
blemish: 0x00000060 (1092: 0x00000444)
WREF: 0x000004A4 (147452: 0x00023FFC)
LIN: 0x000244A0 (22: 0x00000016)
ICCPROF: 0x003DC9A0 (4304: 0x000010D0)
ECI-RGB: 0x0000003C (540: 0x0000021C)
sRGB: 0x00000258 (3144: 0x00000C48)
A-RGB: 0x00000EA0 (560: 0x00000230)
WBPARAM: 0x003DDA70 (7000: 0x00001B58)
BF561: 0x003E0128 (289128: 0x00046968) - عائلة الأجهزة Blackfin Processor التناظرية
bf0: 0x0000004C (117846: 0x0001CC56) - المعالج الرئيسي
bf1: 0x0001CCA4 (117826: 0x0001CC42) - البرنامج الثابت للمعالج الفرعي
bf0.map: 0x000398E8 (27072: 0x000069C0) - بطاقة البرنامج الثابت للمعالج الرئيسي مع الأحرف: D
bf1.map: 0x000402A8 (26304: 0x000066C0) - بطاقة البرنامج الثابت للمعالج الفرعي مع الأحرف: D
الجسم: 0x00426A90 (143280: 0x00022FB0) - عائلة رينيساس M16C (موتورولا S- سجل)
واجهة المستخدم الرسومية: 0x00449A40 (3647624: 0x0037A888)
TRANS: 0x0000005C (131656: 0x00020248) - الترجمة
الصور: 0x000202A4 (267433: 0x000414A9)
21_1PRT: 0x000000CC (18411: 0x000047EB) - صورة JFIF
21_2GRP: 0x000048B8 (23172: 0x00005A84) - صورة JFIF
21_3PAN: 0x0000A33C (23034: 0x000059FA) - صورة JFIF
24_1PRT: 0x0000FD38 (18489: 0x00004839) - صورة JFIF
24_2GRP: 0x00014574 (23230: 0x00005ABE) - صورة JFIF
24_3PAN: 0x0001A034 (22998: 0x000059D6) - صورة JFIF
28_1PRT: 0x0001FA0C (22605: 0x0000584D) - صورة JFIF
28_2GRP: 0x0002525C (23081: 0x00005A29) - صورة JFIF
28_3PAN: 0x0002AC88 (23282: 0x00005AF2) - صورة JFIF
35_1PRT: 0x0003077C (22496: 0x000057E0) - صورة JFIF
35_2GRP: 0x00035F5C (23532: 0x00005BEC) - صورة JFIF
35_3PAN: 0x0003BB48 (22881: 0x00005961) - صورة JFIF
FONT1: 0x00061750 (1522988: 0x00173D2C)
USBLOGO: 0x001D547C (1775: 0x000006EF) - صورة JFIF
FONT2: 0x001D5B6C (1723676: 0x001A4D1C)
FPGA: 0x007C42C8 (150176: 0x00024AA0) - Xilinx Spartan 3A
BF547: 0x007E8D68 (937576: 0x000E4E68) - عائلة الأجهزة Blackfin Processor (FSL؟)
البرامج الثابتة لايكا M240
اعتدت فحص صفحة التنزيل باستخدام برنامج Leica الثابت كل صباح. قريباً ظهر ملف جديد:
FW_M240_1_1_0_2.FW .
لم تبدو مشفرة ، لكن تم ضغطها ...
ضغط
الرسم البياني يظهر انفجار كبير في 0x9D.

ربما هذا هو نوع من السحر ضغط. لم تسفر عملية البحث على الإنترنت [ضغط 9D +] عن أي شيء ، باستثناء
استخدام 0x1F9D
كتوقيع لضغط LZW . إذا كان أي شيء ، وأنا أفهم أنواع ضغط LZ وقررت أن ننظر إلى البايتات بعد 0x9D. ورأيت أربعة خيارات:
9D 70 C4
9D 00
9D XX YY
9D XX 8Y YY
ماذا تمكنت من ملاحظة:
- ينبثق الخيار الأول مرة واحدة فقط على العنوان 0x30: من المحتمل استخدامه كمؤشر للبيانات المضغوطة ؛
- XX لا تتجاوز 0x7F ؛
- لا يتجاوز البايت الأخير من YY في الحالات الثالثة والرابعة 0x7F
مما أعرفه عن LZ ، يشبه هذا إلى حد كبير LZ77 أو LZSS ، حيث YY هي الخطوة البادئة و XX هو عدد البايتات المراد نسخها. والخيار الثاني هو حالة خاصة لإصدار 0x9D. لقد كتبت دالة C بسيطة تنفذ هذا المنطق. أكدت أننا نتحرك في الاتجاه الصحيح ، ولكن الخيار الرابع لا يزال غير متوافق مع المخطط.
حاولت بكل طريقة تفسيرها ، لكن لم يأت منها شيء. لذلك ، التفت إلى رفاقي للحصول على المشورة. لاحظ شخص واحد أنه وفقًا لملاحظاتي الخاصة ، تظهر البايتة الرابعة من YY فقط عند تعيين أعلى بت 0x8Y: هذه مجرد مسافة إضافية لخط المسافة البادئة. شعرت بالخجل ، كل شيء واضح للغاية ...
أخيرًا ، بدأ برنامج إلغاء الضغط في إصدار دفق صالح ... حتى يتم تعليقه في منتصف الملف. حدث هذا بسبب الطول غير المعروف للإطار المنزلق. تصحيح الأخطاء والاختبارات إضافية إصلاح الموقف.
لذلك كان هناك
أداة لتحليل البرامج الثابتة M240 .
هيكل البرامج الثابتة
للعمل بتنسيق غير معروف ، لم أتوصل إلى شيء أفضل من قياس بعض الإزاحات وأحجام مقاطع التعليمات البرمجية - ومحاولة العثور على أقرب القيم في رأس الملف. على سبيل المثال ، هذه الكتلة:
0x00: 1E 1C AF 2E 01 01 00 02 07 E1 EA 5E 00 5C 1A B1
0x10: 01 29 1A 7E AE 38 73 65 9C 3D 75 B4 34 2F 44 6E
0x20: 13 17 8E 6B 00 00 00 01 00 00 00 30 E1 E3 50 D1
تحولت في النهاية إلى:
1E1CAF2E — "LEICA FILE"
01010002 - 1.1.0.2
005C1AB1 — (big endian)
01291A7E — (big endian)
AE3873659C3D75B4342F446E13178E6B — MD5
00000001 —
00000030 —
كما فهمت بنية البرنامج الثابت ، قمت بتحسين أداتي ، وفي النهاية أنتجت هذا:
Running with options:
+ firmware folder: M240_FIRMWARE
+ verbose enabled
Open firmware file: FW_M240_1_1_0_2.FW
File size: 6036193 | 0x005C1AE1
Parse container header:
version: 1.1.0.2
packed size: 6036145 | 0x005C1AB1
unpacked size: 19470974 | 0x01291A7E
body blocks: 1 | 0x00000001
body offset: 48 | 0x00000030
MD5: AE387365 9C3D75B4 342F446E 13178E6B
MD5 check: PASSED
Uncompress container body:
6036145 -> 19470974
Uncompression: DONE
Split container:
Number of sections: 9 | 0x00000009
Section table size: 612 | 0x00000264
Section table offset: 36 | 0x00000024
Section 1
Section Name: "[A]IMG_LOKI-212"
Section offset: 0 | 0x00000000
Section size: 7340032 | 0x00700000
Section base: 1048576 | 0x00100000
MD5: A8D55AA2 B0ACDB14 0673AD79 707674F3
MD5 check: PASSED
Create file: M240_FIRMWARE/IMG_LOKI-212.bin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Section 9
Section Name: "[A]IMG-LENSDATA-213"
Section offset: 19214844 | 0x012531FC
Section size: 255478 | 0x0003E5F6
Section base: 16252928 | 0x00F80000
MD5: 39C2BEC0 27ED23F6 2C1C8513 EEE697B9
MD5 check: PASSED
Create file: M240_FIRMWARE/IMG-LENSDATA-213.bin
Splitting container: DONE
Extraction COMPLETE!
تتضمن البرامج الثابتة M240 حاوية واحدة مع تسعة عناصر:
IMG_LOKI-212.bin -
IMG_LOKI-213.bin -
CTRL_SYS-11.bin - -
IMG-FPGA-212.bin - ()
IMG-FPGA-213.bin - ()
IMG-DSP-212.bin - DSP
IMG-DSP-213.bin - DSP
IMG-LENSDATA-212.bin -
IMG-LENSDATA-213.bin -
كما ترون ، يوجد في أحد البرامج الثابتة مجموعتان من الملفات. فيما بعد تعلمت أن 212 عبارة عن نسخة من الدائرة الدقيقة لمعالجة الصور ، وتم إنتاج نسختين من طراز Leica M240. تستند هذه الدراسة إلى الإصدار 212.
إدارة النظام: CTRL_SYS-11.bin
الجزء الوحيد المشترك هو البرامج الثابتة لرقاقة التحكم في النظام. هذا ثنائي كبير بالفعل ، ويمكن للرمز أن يخمن بسهولة ما هو الغرض منه.
$ strings CTRL_SYS-11.bin | rg SH
-> Test SH7216 data flash driver
-> Test SH7216 SCI driver
-> Test SH7216 I2C driver
-> Test SH7216 MTU2 driver
-> Test SH7216 ADC functions
-> Test SH7216 CMT driver
وبالتالي ، لدينا معالج Renesas SH7216 (SH-2A) ، المسؤول عن المرحلة الأولى من التحميل واختبارات الإدخال / الإخراج وتحديثات البرامج الثابتة. من خارج الصندوق ، تدعم المؤسسة الدولية للتنمية هذا النوع من المعالج. بقي فقط للعثور على عنوان الحمل الأساسي الصحيح ، والمعروف من وصف أقسام البرامج الثابتة: هذا هو
0x0
.
Section Name: "[A]CTRL_SYS-11"
Section offset: 14680064 | 0x00E00000
Section size: 917277 | 0x000DFF1D
Section base: 0 | 0x00000000
لقد قمت بتحميله في المؤسسة الدولية للتنمية وتعرفت على جميع الوظائف ، لكنني لم أتطرق إليها بشكل خاص ، لأن البرنامج الثابت للمعالج الرئيسي أكثر إثارة للاهتمام.
هنا يمكن أيضًا ملاحظة أن UART من هذه الشريحة تفتح على منفذ الخدمة ، حيث تعرض سجل التنزيل. سوف نعود إلى هذا لاحقًا.
الشريحة الرئيسية: IMG_LOKI-212.bin
لبدء الهندسة العكسية لهذه البرامج الثابتة ، يجب أولاً الإجابة على بعض الأسئلة:
- ما نوع المعالج
- ما هو عنوان الحمل الأساسي
- ما هو نظام التشغيل على أساس ، إن وجدت
بفضل أداتنا ، نعلم بالفعل عنوان التحميل الأساسي: هذا هو
0x100000
.
Section Name: "[A]IMG_LOKI-212"
Section offset: 0 | 0x00000000
Section size: 7340032 | 0x00700000
Section base: 1048576 | 0x00100000
يخزّن البرنامج الثابت الإجابات المتبقية في شكل قابل للقراءة. على سبيل المثال ، هذا الخط:
$ strings ./IMG_LOKI-212.bin | rg Softune
6Softune REALOS/FR is Realtime OS for FR Family, based on micro-ITRON COPYRIGHT(C) FUJITSU LIMITED 1994-1999
...
وبالتالي ، نحن نتعامل مع معالج مخصص
Fujitsu FR (يطلق عليه Leica
Maestro )
ونظام التشغيل
Softune REALOS . في الواقع ، هذا أفضل بكثير من Blackfin ، لأن IDA خارج الصندوق يدعم FR.
وحدة المعالج الاب
لم يكن الواقع مشرقًا للغاية ، لأنه بعد تنزيل ملف البرنامج الثابت ، لم يُظهر برنامج IDA أي تعليمات أو روابط خارجية ، إلخ.
قررت إصلاحه ، لكن في النهاية اضطررت إلى
إعادة كتابة بعض أجزاء البرنامج الثابت بالكامل . هذه هي النتيجة:


بالإضافة إلى التصحيحات الموجودة في
ana
و
ins
and
out
، يمكن لرمز
emu
جديد تمامًا:
- التعرف على أنواع مختلفة من التعليمات البرمجية والروابط الخارجية للبيانات ؛
- التعرف على بيانات التبديل
- أداء تتبع المكدس.
- منفصلة الحجج المكدس والمتغيرات المحلية
- التعرف على الوظائف بشكل صحيح.
ولكن التغيير الأكبر ، كما لاحظت ، هو الأحرف الكبيرة للحصول على التعليمات :)
تريد أن ترى مجموعة كاملة من التعليمات؟ ومن هنا:
إضافة أو BTSTH LSR MOV BN LDRES EXTSH
ADD2 ORH MUL LSR2 JMP BP STRES EXTUH
ADDC ORB MULU ASR CALL BV COPOP SRCH0
ADDN EOR MULH ASR2 RET BNV COPLD SRCH1
ADDN2 EORH MULUH LDI INT BLT COPST SRCHC
SUB EORB DIV0S LDI INTE BGE COPSV LDM0
SUBC BANDL DIV0U LDI RETI BLE NOP LDM1
SUBN BANDH DIV1 LD BRA BGT ANDCCR STM0
CMP BORL DIV2 LDUH BNO BLS ORCCR STM1
CMP2 BORH DIV3 LDUB BEQ BHI STILM ENTER
و BEORL DIV4S ST BNE DMOV ADDSP LEVE
ANDH BEORH LSL STH BC DMOVH EXTSB XCHB
ANDB BTSTL LSL2 STB BNC DMOVB EXTUB
لذلك ، بسيطة وجميلة.
بالمناسبة ، ربما لاحظت أن بعض التعليمات غير محاذاة:
BRA: D loc_xxx
LDI: 8 # 0x64 ، R5
هذا ليس خطأ في وحدة المعالج ، ولكن في الواقع ميزة من عائلة فوجيتسو FR. يطلق عليه
فتحة التأخير وهو نموذجي للغاية بالنسبة لمعالجات RISC.
من
دليل المعالج FR80 (ملاحظة: الرابط لم يعد يعمل):
يتم تنفيذ التعليمات ، التي تقع مباشرة بعد تعليمات الفرع (يطلق عليها موقع "فتحة التأخير") ، قبل الفرع ، ويتم تنفيذ التعليمات على العنوان الهدف بعد الفرع. نظرًا لتنفيذ التعليمات في فتحة التأخير قبل تشغيل الفرع ، فإن سرعة التنفيذ الظاهرة هي دورة واحدة.
وبالتالي ، هذا هو ، في جوهره ، تحسين خط الأنابيب ، ومن الأفضل أن نتذكره ، لأنه يُستخدم في كل مكان في Leica الثابتة.
Softune ريالوس
من الويكي :
Softune هي بيئة التطوير المتكاملة لفوجيتسو لعائلات المعالجات Fujitsu FR و FR-V و F2MC. مدعوم من نواة REALOS µITRON في الوقت الحقيقي. على سبيل المثال ، يتم استخدامه في كاميرات Nikon DSLR (انظر Nikon EXPEED) وبعض كاميرات Pentax مع K.
لذلك هذا هو RTOS لائق شعبية جدا مع المهام ، والإشارات والأشياء الجيدة الأخرى. كنت أتساءل إذا كان من الممكن التعرف على بعض وظائف المكتبة القياسية في البرامج الثابتة Leica.
يجب أن أسمي الجزء الأول من الدراسة مضيعة كبيرة للوقت ، وهنا السبب.
تبين أنه من الصعب للغاية العثور على Softune IDE ، لكن في النهاية تمكنت من الحصول على شيء. كما هو متوقع ، تضمن IDE مكتبات. كان هناك أربعة ثنائيات:
- lib911.lib
- lib911e.lib
- lib911if.lib
- lib911p.lib
لا أعرف لماذا ، ربما بالقصور الذاتي ، حيث اخترقت كل شيء مرتبط بـ Leica ، بدأت في إجراء هندسة عكسية للتنسيق مرة أخرى. نعم ،
تنسيق وحدة كائن موثق جيدًا. ونعم ، بالطبع ،
كتبت أداة خاصة لهذا :
Fujitsu RISC Library Tool v1.0
Usage: FRLibTool [-s start] [-i imagebase] [-o output] [-f index] [-dv] FIRMWARE.BIN LIBRARY.LIB
This tool will help you to find Softune REALOS library functions in FR (Fujitsu RISC) firmware.
Use following arguments:
-f Specify firmware image file
-s Specify firmware image scan offset
-b Specify firmware imagebase
-o Specify output type (exclusively)
list - list of functions
idc - IDC script
py - IDA python script
pat - FLAIR pattern file
-i xxx Specify index of particular function
-d Dump library
-v Be verbose
باستخدامه ، يمكنك إنشاء ملفات
*.pat
واستخدامها كمدخلات في
IDA FLAIR لإنشاء
ملفات التوقيع .
$ FRLibTool -o pat lib911.lib
$ FRLibTool -o pat lib911e.lib
$ FRLibTool -o pat lib911if.lib
$ FRLibTool -o pat lib911p.lib
...
$ sigmake -n "SOFTUNE C/C++ Library" lib911.pat lib911e.pat lib911if.pat lib911p.pat softune.sig
بعد تطبيق هذا التوقيع ، رأيت أخيرًا المراسلات في
IMG_LOKI-212.idb .

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

انقطاع
يمكن العثور على جدول متجهات المقاطعة عن طريق الوصول إلى TBR (سجل قاعدة الجدول):
LDI:32 #int_table, R0
MOV R0, TBR
عادةً ما يحدث في معالج إعادة تعيين المتجه في بداية البرنامج الثابت.
يتم تخزين عناوين المعالجات في الجدول بترتيب عكسي وفقًا للصيغة
TBR + (0x3FC - 4 × inum)
، بحيث يتم تعويض متجه إعادة
0x3FC
في نهاية الجدول
0x3FC
.
لقد وجدت معظم الانقطاعات من دليل FR واقترح أن لايكا مايسترو لديها تخطيط مماثل. ثم أخذ كل معالج وحاول العثور على سلسلة أو أي تلميح آخر يكشف عن الغرض من المقاطعة.
نتيجة لذلك ، قمت بعمل هذه القائمة:

من المتوقع تمامًا العديد من المقاطعات ، مثل AUDIO / SDIO / VIDEO / JPEG / RAW ، ولكن هل تحاول التعرف على أكثرها غموضًا؟ أنا أتحدث عن مقاطعة
int_uart_in
. يبدو أن الكاميرا تدعم نوعًا من وضع وحدة التحكم UART CLI.
مكالمات النظام
مثل أي نظام تشغيل تقريبًا ، يستخدم Softline REALOS مكالمات النظام. في المجمع ، تبدو مثل هذا:

يتم حساب العنوان الفعلي لمعالج استدعاء النظام على النحو التالي. لنبدأ بالبحث عن معالج المقاطعة
INT #0x40
. كما هو موضح أعلاه ، هذا
(0x3FC - 4 × inum) = (0x3FC - 4 × 0x40) = 0x2FC = int_realos_syscall
في المعالج ، من السهل العثور على رابط أسفل جدول استدعاء النظام بكلمات ذات 16 بت. يتم حساب السجل المحدد في هذا الجدول بالصيغة
syscall_table_bottom + (num * 2)
:
[syscall_table_bottom + (-23 * 2)] = [syscall_table_bottom - 0x2E] = [0x1012EA] = 0xE68
لا يبدو هذا كعنوان ، لأنه يتم حساب العنوان الفعلي لمعالج استدعاء النظام على أنه
syscall_table_bottom + offset
. يتم عرض العملية برمتها في الرسم البياني.

تتم الإشارة إلى جميع مكالمات النظام ووظائفها في
دليل Softline REALOS / FR kernel ، لذلك تمكنت من استعادة جميع المعالجات المنفذة في الجدول وتحسين IDB أكثر قليلاً.

بالطبع ، يمكنك جعل الكود أكثر جمالا من خلال تحديد أنواع مكالمات النظام في المؤسسة الدولية للتنمية.

لقد كتبت
سكريبت Python للبحث تلقائيًا عن مكالمات النظام هذه والمزيد.
المهام
في استدعاء نظام
sta_tsk
لاحظت أنه لا يتم تمرير الوظيفة الرئيسية كمعلمة ، ولكن معرف المنتج. هذا يعني أن الوقت قد حان للبحث عن مجموعة كبيرة من واصفات المهام. ومن المنطقي أن نبدأ مع
sta_tsk
نفسها.
ROM: 102180 sys_sta_tsk:
ROM: 102180 ST RP ، @ -R15
ROM: 102182 LDUB @ (R14 ، 0x4F) ، R3
ROM: 102184 LDI: 32 # word_100B80، R14
في البداية نرى بعض الروابط. اضطررت إلى العبث قليلاً بأنواع البيانات ، ولكن في النهاية اجتمعت الأجزاء:
ROM: 100B80 word_100B80: .word 0xF؛ عدد المهام
ROM: 100B82 .word 0x1C؛ حجم واصف المهمة
ROM: 100B84. long 0x82A09F5C؛ مهمة 1 واصف
ROM: 100B88. طويل 0x1000D
ROM: 100B8C. طويلة 0
ROM: 100B90. طويل 0x40000000
ROM: 100B94. long sub_1A7DB2؛ المهمة الرئيسية
ROM: 100B98. طويلة 0x8286EEC0
ROM: 100B9C
ROM: 100BA0. long 0x82A09F88؛ مهمة 2 واصف
ROM: 100BA4. طويل 0x20010
ROM: 100BA8
ROM: 100BAC. طويلة 0x40000000
ROM: 100BB0. long sub_1A6BD2؛ المهمة الرئيسية
ROM: 100BB4. long 0x8287EEC0
ROM: 100BB8
...
و هكذا. فقط 15 مهمة. لقد كان الأمر مسألة وقت للنظر في كل وظيفة رئيسية ، وتحديد اسم المهمة والغرض منها (باستثناء آخر). هذه هي القائمة الكاملة:
- SubCPU
يبدو أن هذه المهمة مسؤولة عن عمليات الالتقاط مثل التعرض ، المشاهدة على الشاشة ، إلخ.
- Keymanager
على الأرجح ، ترتبط هذه المهمة بأزرار الأجهزة.
- غياناغر
مهمة كبيرة للغاية ، حيث يتم تنفيذ آلة حالة واجهة المستخدم وعرض الواجهة.
- Debugmanager
نعم ، هناك شيء لتصحيح. يم يم.
- مدير الملفات
هذه المهمة هي كل شيء عن عمليات الملفات.
- Fammanager
أود أن أقول إن المهمة مسؤولة عن الملفات والذاكرة ، لأنها تعتمد على مهام مدير الملفات ومدير الذاكرة.
- Memorymanager
لا مفاجآت: عمليات الذاكرة ، إدارة البلياردو ، إلخ.
- Imagemanager
تدير هذه المهمة عمليات الترميز / فك التشفير وعمليات معالجة الصور الأخرى.
- Usbmanager
التحدي الحالي هو معالجة اتصالات USB ، والتي تشمل بروتوكول MassStorage و PTP و Leica.
- IOManager
يبدو أن هذه المهمة هي إدارة أجهزة التخزين مثل بطاقات SD و CF (ماذا؟ ما هي CFs الأخرى؟ ربما تكون من الطراز 213).
- مدير النظام
مهام مختلفة مثل عمليات النظام العامة ، وإدارة الطاقة ، إلخ.
- SettingsManager
يعالج حالة الكاميرا والإعدادات.
- Monitormanager
يتتبع التغييرات حالة الكاميرا ويبلغ المهام الأخرى.
- المحيطي
تتحكم هذه المهمة في نظام تحديد المواقع (GPS) والسطوع وبعض أجهزة الاستشعار الأخرى.
- غير معروف
لسوء الحظ ، لم أجد أي شيء مهم بالنسبة لها.
من المثير للاهتمام أن نلاحظ أنه بعد المصفوفة الرئيسية يوجد واصف مميز آخر.
ROM:100D28 dword_100D28: .long 0x82A0A1F0
ROM:100D2C .long 0x21
ROM:100D30 .long 0
ROM:100D34 .long 0x80000000
ROM:100D38 .long tid16_task
ROM:100D3C .long 0x8285EEC0
ROM:100D40 .long 0
ووظيفة المهمة هي ببساطة تشعب نفسها.
ROM:101494 sub_101494:
ROM:101494 BRA sub_101494 ; CODE XREF: sub_101494
تتم الإشارة إلى هذا الواصف في نهاية وظيفة
start
، وهو المسؤول عن إنشاء مهام أخرى وإعداد البرامج الثابتة. لذلك هذا هو على الأرجح مهمة تقاعس النظام.
وحدات والرسائل
بالإضافة إلى المهام ، يمكنك تحديد بعض الكائنات المنطقية ، مثل IO والوحدات الطرفية. يتم تقديم الوحدات النمطية كمجموعة من معالجات الرسائل كجزء من إحدى المهام.
يبدو أن مجموعة IO تشمل:
- مدير IO
- المعالج الفرعي
- مدير USB
- USB PTP
- بروتوكول لايكا USB
- تخزين USB كبير السعة
- مدير الأزرار
- مدير التصحيح
- مدير العدسة
وفي المجموعة الطرفية:
- مدير الطرفية
- مستشعر الضوء
- المصابيح
- المتحدث
- استشعار الميل
- سقف إغلاق الاعتراف
- وحدة GPS
- وحدة 3DAxis
يستخدم نظام المراسلة نفسه بنية SOFTUNE القياسية:
struct RealOS_MsgPayload { uint32_t msgID; // +0x0 uint32_t data[]; // +0x4 } struct RealOS_Message { uint32_t os_reserved1; // +0x0 uint32_t os_reserved2; // +0x4 uint32_t to; // +0x8 uint32_t from; // +0xC RealOS_MsgPayload* payload; // +0x10 }
كما هو متوقع ، يحتوي IPC أيضًا على عدة مجموعات رسائل. نظرًا لأن العديد من الرسائل تتم معالجتها في مهام ووحدات نمطية ، فقد تمكنت من استرداد بعض هذه المجموعات فقط:
0x1101xxxx - رسائل النظام العامة:
0x11010002 = SYS_UPDATE_BOOTLOADER أو
0x11010005 = SYS_ERASE_SETTINGS
0x1102xxxx - الرسائل المتعلقة بالتقاط الصور:
0x11020001 = CMD_CAP_CAPTURE أو
0x11020008 = IMAGE_STATUS_CHANGED
0x1104xxxx - رسائل حول الأحداث المتعلقة بالتشغيل:
0x11040002 = PLY_DISABLE_PLAY_MODE
0x11040004 = PLY_IMAGE_READY
0x1108xxxx - PTP .:
0x11080002 = DBG_CHANGE_LEVEL
0x11080012 = DBG_WRITE_ROM_DUMP_SD
0x2201xxxx - USB PTP
0x22010108 =
0x22010118 = DebugObject
0x2202xxxx - SUBCPU:
0x22020002 = E_SUBCPU_REQUEST_M_EXPOSURE_REQUEST
0x22020015 = E_IO_SUBCPU_COMMAND_CLEANING_SENSOR
0x2203xxxx - :
0x22030001 =
0x2204xxxx - IO:
0x2204000C = / Mass Storage
0x22040012 =
0x330000xx - UI:
0x33000001 =
0x33000007 =
0x440000xx - ,
0x44000013 = E_IMG_CMD_CHANGE_PINFO
0x55xxxxxx — FAM:
0x558800xx = - FAM
0x558888xx = FAM
0x6602xxxx — LED, :
0x66020001 - LED X
0x66020002 = LED
0x6604xxxx - :
0x66040001 =
0x66040007 =
0x6611xxxx - ,
0x6622xxxx - ,
0x6660xxxx - بعض الرسائل الأخرى المتعلقة بالذاكرة:
0x66600006 = HISTOGRAM
0x66600011 = RAWCOMP
0x771100xx و 0x77AA00xx - الرسائل المتعلقة بتبديل أوضاع الكاميرا
لسوء الحظ ، تبقى العديد من المشاركات الأخرى غير معروفة.واجهة المستخدم الرسومية
في ملف البرنامج الثابت ، سننظر أيضًا في الأقسام التالية: CTRL_SYS-11 و IMG-LOKI-212 و IMG-DSP-212 و IMG-FPGA-212 و IMG-LENSDATA-212 .ما أدهشني هو الافتقار الكامل لموارد واجهة المستخدم الرسومية. ولكن يجب أن تكون في مكان ما ، وعلى الأرجح ، مضمنة في IMG-LOKI-212 .أحد الأساليب المعتادة لعكس تطوير البرامج الثابتة هو استعادة كل المراجع التبادلية الممكنة. ليس فقط في الرمز ، ولكن أيضًا في قسم البيانات. ثم أنظر من خلالها ، وأحاول العثور على بعض الأنماط أو الروابط لأجزاء معروفة من الشفرة.كان لايكا البرامج الثابتة ليست استثناء. هناك العديد من تسلسل البيانات المتشابهة مع عناوين لتسلسلات البيانات الأخرى التي تذهب أبعد من ذلك ، وما إلى ذلك. عندما صعدت التسلسل الهرمي للروابط ، رأيت أخيرًا وظيفة مألوفة.على سبيل المثال ، لقد وجدت بنية بيانات دون أي روابط: g_data = { ... }
هيكل آخر تناولها: g_data_struct1 = { ... , &g_data }
والذي بدوره يشار إليه بهيكل آخر: g_data_struct2 = { &g_data, ... }
تحتوي بنية البيانات هذه على رابط من الكود ، ويتم تمريرها كمعلمة إلى وظيفة أخرى: func1() ╰ func2(..., &g_data_struct2, ...)
ومع ذلك ، func1()
لا يتم استدعاؤها مباشرة من وظيفة أخرى ، ولكن يتم تخزينها في بعض الصفيف: g_func_list1[] = { ..., func1(), ... }
بالبحث أعلاه ، وجدت مكالمة في الكود g_func_list1
: func3() { g_func_list1[x] }
ومرة أخرى ، يتم تخزين هذه الوظيفة في صفيف: g_func_list2[] = { ..., func3(), ... }
بعض الرموز الأخرى تصل إلى الصفيف نفسه: func4() { g_func_list2[x] }
لحسن الحظ ، هذه المرة تسمى الوظيفة من وظيفة أخرى ، وهلم جرا gui_MADE_ApplicationRun
. gui_Statemachine_DoStateChange() ╰ gui_MADE_ApplicationRun() ╰ func5() ╰ func4()
تشير بعض الأسطر إلى أن نظام واجهة المستخدم الرسومية يسمى "MADE" ، وتتم معالجة انتقالات الصفحة باستخدام MADE_GetSysTri
كل ما يعنيه ذلك. يتم تطبيق آلة حالة واجهة المستخدم الرسومية في الأساس في وظيفة gui_Statemachine_DoStateChange
. بعد جمع المعلومات حول واجهة المستخدم الرسومية ، برزت الصورة العامة:
كما ترون ، الوظيفة الرئيسية لموارد واجهة المستخدم الرسومية gui_CopyImageDesc
(على الرغم من أن هذا ليس اسمًا حقيقيًا). لديها الحجج التالية: gui_CopyImageDesc( uint32_t dstAddress; // R4 - destination address UIDescType type; // R5 - description type UITarget target; // R6 - rendering target uint32_t descAddress; // R7 - description address uint8_t always0; // (SP + 0x0) - always 0 uint8_t index1; // (SP + 0x4) - index 1 uint8_t index2; // (SP + 0x8) - index 2 uint16_t x_offset; // (SP + 0xC) - x offset uint16_t y_offset; // (SP + 0x10) - y offset uint16_t unknown2; // (SP + 0x14) - uint32_t language1; // (SP + 0x18) - language id 1 uint32_t language2; // (SP + 0x1C) - language id 2 uint32_t funcAddress; // (SP + 0x20) - function address )
هناك أربعة أنواع من أوصاف الموارد: struct UIDescType0Header struct UIDescType1Header struct UIDescType2 struct UIDescType3 { { { { uint32_t address; uint32_t address; uint32_t reg; uint16_t x_offset; uint16_t entries; uint16_t entries; uint32_t address; uint16_t y_offset; uint16_t unknown; uint16_t unknown; uint16_t unknown1; uint32_t address; } } uint16_t unknown2; } uint16_t unknown3; struct UIDescType0Entry struct UIDescType1Entry uint16_t tableoff; { { } uint16_t x_offset; uint16_t x_offset; uint16_t y_offset; uint16_t y_offset; uint32_t address; uint32_t address; } uint16_t objects; uint16_t total_w; uint16_t total_h; uint16_t unknown; }
يحتوي النوع الأول على رأس مع الإشارة إلى مجموعة من السجلات. يحتوي كل سجل على إحداثيات وعنوان لبيانات البكسل. يبدو أن النوع الحالي يصف العناصر التي تعتمد على الحالة ، مثل الأيقونات ، والتي قد تكون بلون رمادي أو تختفي من واجهة المستخدم.يبدأ النوع الثاني أيضًا بعنوان ويستخدم لتوطين خطوط النص أو كتل النص أو وصفها.النوع الثالث يصف خرائط الأحرف للغات مختلفة.النوع الأخير مسؤول عن جميع الموارد الثابتة الأخرى ، مثل الصور والخلفيات ، إلخ.الآن دعونا نلقي نظرة على البيانات الخاصة بالصور نفسها. تبدو البايتات الست الأولى كأنها رأس صغير ، يتبعه نوع من نمط التكرار ، حيث تكون البايتة الثانية إما ، أو . فمن المنطقي أن نفترض أن و+0x00: 00 08 00 14 00 01 A2 FF 0A 04 05 FF 0C 04 03 FF
+0x10: 0D 04 03 FF 0E 04 02 FF 0E 04 02 FF 04 04 06 FF
+0x20: 04 04 02 FF 04 04 06 FF 04 04 02 FF 04 04 06 FF
+0x30: 04 04 02 FF 04 04 06 FF 04 04 02 FF 04 04 06 FF
+0x40: 04 04 02 FF 04 04 06 FF 04 04 02 FF 04 04 06 FF
+0x50: 04 04 02 FF 04 04 06 FF 04 04 02 FF 0E 04 02 FF
+0x60: 0E 04 02 FF 0D 04 03 FF 0D 04 03 FF 0C 04 04 FF
+0x70: 04 04 0C FF 04 04 0C FF 04 04 0C FF 04 04 0C FF
+0x80: 04 04 0C FF 04 04 0C FF 04 04 0C FF 04 04 0C FF
+0x90: 04 04 0D FF 02 04 2D FF 00 06 00 14 00 01 79 FF
0xFF
0x04
0x0008
0x0014
- العرض والارتفاع في طريقة عرض مع ترتيب بايت مباشر (endian كبير). في نهاية هذا التفريغ ، نرى بداية تسلسل آخر 00 06 00 14 00 01
. على الأرجح ، هذا هو المورد التالي (كما تم تأكيد ذلك بواسطة ارتباط إليه). وبالتالي ، فإن حجم بيانات الصورة الفعلية هو 146 بايت. ولكن يجب أن يكون حجم الصورة 0x8 * 0x14 = 0xA0 = 160. من الواضح أن البيانات ليست بكسل نقية ولا حتى طرفية 8 بت ، لأنها أصغر 14 بايت. ثم ماذا؟
ربما نوعا من الضغط.بالنظر إلى هذا التفريغ الست عشري ، من الصعب تصديق استخدام نوع من المخططات المعقدة. واجهة المستخدم الرسومية لايكا ليست ملونة للغاية ، لذلك في تجربتي فمن الأفضل استخدام الجدول LUT هنا. في هذه الحالة ، ستكرر موارد واجهة المستخدم تمامًا مؤشرات LUT مثل 03 03 03
أو 1 1 1
. عادةً ما يحاول الضاغط التخلص من ازدواجية البيانات واستبدالها برابط. تعد صفائف الفهرس مثالية للضغط حتى مع طريقة بسيطة مثل RLE [data][number]
. أمر بسيط لكتابة data
(القيمة) number
مرات.مع وضع كل ذلك في الاعتبار ، اقترحت أن ننظر على الأرجح إلى صورة بسيطة بألوان LUT ( 0xFF
و 0x04
) ، وأن البايت أمام اللون هو عدد البيكسلات المطلوب رسمها."ثم كتبت أداة أخرى" ، كما تعتقد. لكن لا ، أخذت القلم والورقة وبدأت في ملء الزنزانات. إنه أمر مضحك أنه لا يزال لدي تلك الصورة.
في مكان ما على طول الطريق ، أدركت أن 160 بكسل ليست كافية لهذه الصورة ، لذلك تحتاج إلى ضرب 0x8 و 0x14 اثنين. تشير الكلمة الثالثة 0x0001 إلى ما إذا كانت الصورة عبارة عن حرف ASCII ، وبالتالي فإن بنية ImageAsset النهائية كما يلي: struct ImageAsset { uint16_t width; // /2 (big endian) uint16_t height; // /2 (big endian) uint16_t ascii; // 1, ASCII struct image_data { uint8_t number; // uint8_t color; // LUT } data[]; }
ولكن لا يزال هناك جزء واحد مفقود: LUT.لم يكن من الصعب العثور عليه ، نظرًا لاستعادة العديد من الروابط والهياكل يدويًا ، لذلك قمت بالتمرير ببطء عبر أقسام البيانات ، أبحث عن مجموعة مكونة من 256 عنصرًا من قيم 16 بت أو 32 بت ، حتى صادفت هذا: مرة أخرى ، شكرًا في عملي مع Blackmagic Design ، تعرفت على الفور على بكسلات YUV (على سبيل المثال ، كل القيم بالأرقام 8080). أنا لست أحمق مرة أخرى لرسم واجهة المستخدم بالكامل يدويًا على الورق ، لذا نعم ، كتبت أداة أخرى - M240UITool . بالإضافة إلى إعادة تعيين جميع موارد الصور من ملف البرنامج الثابت إلى BMP / PNG ، يمكن لهذه الأداة إنشاء نصوص IDC في IDA لتحديد جميع موارد واجهة المستخدم..long 0x7008080, 0x72D8080, 0x73C8080, 0x75A8080, 0x79B8080, 0x71DFF6B, 0x7BE8080, 0x7FF8080
.long 0x77BBD27, 0x75B60E7, 0x7835F4A, 0x7D3089F, 0x7018080, 0x7028080, 0x7038080, 0x7048080
.long 0x7058080, 0x7068080, 0x7078080, 0x7088080, 0x7098080, 0x70A8080, 0x70B8080, 0x70C8080
.long 0x70D8080, 0x70E8080, 0x70F8080, 0x7108080, 0x7118080, 0x7128080, 0x7952B15, 0x7138080
.long 0x7148080, 0x7158080, 0x7168080, 0x7178080, 0x7188080, 0x7198080, 0x71A8080, 0x71C8080
.long 0x71D8080, 0x71E8080, 0x71F8080, 0x7338080, 0x7208080, 0x7218080, 0x7228080, 0x7238080
.long 0x7248080, 0x7248080, 0x7268080, 0x7278080, 0x7288080, 0x7298080, 0x72A8080, 0x72B8080
.long 0x72C8080, 0x75E8080, 0x7608080, 0x7628080, 0x7648080, 0x7678080, 0x7688080, 0x7698080
.long 0x76B8080, 0x76E8080, 0x7708080, 0x7728080, 0x7758080, 0x7778080, 0x7798080, 0x77C8080
.long 0x77E8080, 0x7818080, 0x7838080, 0x7868080, 0x7888080, 0x78B8080, 0x78D8080, 0x7908080
.long 0x7928080, 0x7958080, 0x7978080, 0x7998080, 0x79C8080, 0x79D8080, 0x7668080, 0x79E8080
.long 0x7A18080, 0x7A28080, 0x7A38080, 0x7A68080, 0x7A78080, 0x7A88080, 0x7AB8080, 0x7AC8080
.long 0x7AD8080, 0x7B08080, 0x7B28080, 0x7B58080, 0x7B88080, 0x7B98080, 0x7BC8080, 0x7CC8080
.long 0x7AB3BBB, 0x7E10094, 0x7E4556E, 0x4008080, 0x2922D17, 0x7B2AB00, 0x7C2A262, 0x71DFF6B
.long 0x768D4A2, 0x769D4EA, 0x7BD88AE, 0x705997B, 0x70BB377, 0x711CC73, 0x717E66F, 0x7238866
.long 0x729A262, 0x72FBB5E, 0x735D55A, 0x7417751, 0x747914D, 0x74DAA48, 0x753C444, 0x75F663B
.long 0x76B9933, 0x7998080, 0x771B32F, 0x77D5526, 0x7836F22, 0x789881E, 0x78FA21A, 0x7159095
.long 0x71AAA91, 0x720C38D, 0x726DD88, 0x7506F6A, 0x7568866, 0x75CA262, 0x762BB5E, 0x76E5E55
.long 0x7747751, 0x77A914D, 0x780AA48, 0x78C4D3F, 0x792663B, 0x7988037, 0x79E9933, 0x7AA3C2A
.long 0x7B05526, 0x7B66F22, 0x7BC881E, 0x72488AE, 0x72AA1AA, 0x72FBBA6, 0x735D4A2, 0x7427799
.long 0x7489095, 0x74DAA91, 0x753C38D, 0x77E556E, 0x7836F6A, 0x7898866, 0x78FA262, 0x79C4459
.long 0x7A15E55, 0x7A77751, 0x7AD914D, 0x7BF4D3F, 0x7CC8080, 0x7C5663B, 0x7CB8037, 0x7337FC8
.long 0x73999C4, 0x73FB2C0, 0x745CCBB, 0x7757799, 0x74C54FF, 0x77B9095, 0x780AA91, 0x7AB3C72
.long 0x7B1556E, 0x7B66F6A, 0x7BC8866, 0x74277E1, 0x74890DD, 0x74EAAD9, 0x754C3D5, 0x76066CC
.long 0x7667FC8, 0x76C99C4, 0x772B2C0, 0x77E55B7, 0x7846EB3, 0x78A88AE, 0x790A1AA, 0x7526EFB
.long 0x75787F7, 0x75DA1F3, 0x763BAEE, 0x76F5DE6, 0x77577E1, 0x77B90DD, 0x781AAD9, 0x78D4CD0
.long 0x79366CC, 0x79F99C4, 0x7E10094, 0x7CF44A1, 0x7DB7799, 0x7E71A90, 0x7ED338C, 0x7FF8080
.long 0x7328080, 0x7DC8080, 0x7C88080, 0x7508080, 0x775CD2C, 0x76944EA, 0x7808080, 0x71A61FF
.long 0x7244D40, 0x7242C15, 0xFFF8080, 0xF338080, 0xF668080, 0xF998080, 0xFCC8080, 0xF008080
.long 0xF4C54FF, 0xFAB3BBB, 0xFE10094, 0xFE4556E, 0xF952B15, 0xFDA7751, 0xFB2AB00, 0xFC2A262
.long 0xF1DFF6B, 0xF68D4A2, 0xF69D4EA, 0xFBD88AE, 0xA922D17, 0xC6E4130, 0xE286963, 0x74C55FF
.long 0x768D536, 0x7FF8080, 0x7FF8080, 0x7FF8080, 0x2922D17, 0x46E4130, 0x6286963, 0x8080
Leica M (typ 240) UI Tool v1.0
Usage: ./M240UITool [-a address] [-i imagebase] [-s script] [-d dump] [-f folder] [-l LUT] [-rbv] FIRMWARE.BIN
This tool will help you to find UI resources in firmware.
Use following arguments:
-a Specify address of the gui_CopyImageDesc function (ex. 0x2F95E0)
-i Specify firmware imagebase
-s Specify IDC file name
-c Specify container file name
-d Specify dump image format
png - PNG format
bmp - BMP (ARGB) format
-f Specify folder for dumped images
-l Specify LUT for images (filename of address)
-b Specify number of bytes to display in verbose mode
-r Try to recover string characters
-v Be verbose
نحن نعلم بالفعل أنه من الوظيفة التي تنشئها صفحة واجهة مستخدم واحدة ، يطلق عليها عدة مرات gui_CopyImageDesc
. اعتقدت أنه سيكون من الرائع إنشاء متصفح موارد واجهة المستخدم وتحديد جميع ميزات عرض الصفحة. الخيار مخصص لهذا -c
- فهو ينشئ حاوية خاصة لعرض الموارد.ومن قال إن متصفح مورد واجهة المستخدم قد لا يبدو غير عادي؟
كونها تفاعلية (أزرار شفافة في لقطة الشاشة) ، تتيح لك هذه الأداة التمرير ليس فقط من خلال صفحات قائمة EVF / LCD ، ولكن أيضًا عرض خطوات التقديم داخل صفحة واحدة.لسوء الحظ ، تم فقد الكود المصدري لهذه التحفة في مكان ما ، لكن ملفات الرأس لا تزال في كود M240UITool ، لذلك من الناحية التقنية يمكنك إعادة إنشائها من البداية.قائمة التصحيح
ما الخط الذي نبحث عنه في المقام الأول عند الهندسة العكسية؟ في رأيي ، هذه الكلمة debug
ومشتقاتها.كان هناك الكثير من الخطوط المثيرة للاهتمام في البرامج الثابتة ، لكن هذه الخطوط خاصة: يبدو أنه يمكنك إدخال وضع التصحيح باستخدام مجموعة من المفاتيح. يتم استدعاء كل هذه الخطوط من وظيفة واحدة عملاقة ، والتي تنفذ آلة حالة مسح زر. إليك ما تبدو عليه في المؤسسة الدولية للتنمية:$ strings ./IMG_LOKI-212_1.1.0.2.bin | grep "Debug Mode"
GUI: State: %d! Scanning for Debug Mode successful
GUI: Scanning for Debug Mode: State: %d, Ignore long DEL
GUI: Scanning for Debug Mode: State: %d
GUI: Scanning for Debug Mode: State: %d, Ignore long DEL
GUI: Scanning for Debug Mode: State: %d
GUI: Scanning for Debug Mode: State: %d, Ignore long DEL
GUI: Scanning for Debug Mode: State: %d
GUI: Scanning for Debug Mode: State: %d, Ignore long DEL
GUI: Scanning for Debug Mode: State: %d
GUI: Scanning for Debug Mode: State: %d, Ignore long DEL
GUI: Scanning for Debug Mode: State: %d
...
GUI: ScanningForDebugWithKeyAndJoyStick(): g_GUI_CheckForDebugWithKeyAndJoyStick = %d
ScanningForDebugWithKeyAndJoyStick
لن أكذب ، لقد استغرق الأمر بعض الوقت لفهم كيفية معالجة أزرار الأجهزة في البرامج الثابتة ، ثم استعادة الأنواع المذكورة للأزرار وعصا التحكم. ولكن عندما حصلت على الجمع ، اكتشفت مع الحزن أنها لا تفعل أي شيء. ربما يعمل فقط من صفحة واجهة المستخدم الرسومية محددة. أمسيات أخرى من التتبع اليدوي لجهاز حالة واجهة المستخدم الرسومية - وتم حل المشكلة ، وتمكنا أيضًا من العثور على صفحة قائمة إعادة الضبط.أخيرًا ، مرحبًا بك في وضع التصحيح.
فكرت كثيرًا في الإعلان عن هذا المزيج ، لكنني قررت الامتناع عن التصويت. إنني أحترم العمل الشاق الذي تقوم به لايكا ، حيث أفرج عن أجهزتها الفريدة ، ولا أريد أن أكون مسؤولاً عن حقيقة أن مراكز الخدمة الخاصة بهم سوف تملأ جثث الكاميرات المكسورة نتيجة لبعض الفضول الطائش.لكن مع ذلك ، سأقدم بعض الأنواع المذكورة من أجل تبسيط الهندسة العكسية لأولئك المستعدين للمضي بهذه الطريقة. enum ControlActionType { kControlAction_Idle, // 0 kControlAction_Push, // 1 kControlAction_Release, // 2 kControlAction_LongPush // 3 }; enum ControlBtnType { kControlBtn_LV, // 0 kControlBtn_PLAY, // 1 kControlBtn_DEL, // 2 kControlBtn_ISO, // 3 kControlBtn_MENU, // 4 kControlBtn_SET // 5 }; enum ControlJoystickType { kControlJoy_INFO, // 0 kControlJoy_Up, // 1 kControlJoy_Down, // 2 kControlJoy_Left, // 3 kControlJoy_Right // 4 };
PPT
بالتفكير في مهمة USB ، حددت ثلاثة أوضاع (والتي تم تأكيدها أيضًا في قائمة تصحيح الأخطاء):- PPT
- MSC (فئة التخزين كبير السعة)
- عرف لايكا
PTP هو الأكثر إثارة للاهتمام لأنه موثق جيدا ويسمح لك بالتحكم في الكاميرا.من السهل جدًا العثور على معالجات PTP في البرامج الثابتة ، نظرًا لوجود الكثير من المكالمات من هذا الرمز. وتنقسم PTP جميع المكالمات إلى ثلاث مجموعات: تراث ، لايكا للتمديد (جنيه) و الإنتاج .ساعدت رسائل تصحيح الأخطاء في إنشاء أسماء لكل الكود تقريبًا. إرث: لايكا الموسعة: الإنتاج:
0x1001 - GetDeviceInfo 0x9001 - تعيين إعدادات الكاميرا 0x9100 - جلسة الإنتاج المفتوحة
0x1002 - OpenSession 0x9002 - Get Camera Settings 0x9101 - Close Production Session
0x1003 - CloseSession 0x9003 - Get Lens Parameter 0x9102 - UpdateFirmware
0x1004 - Get Storage ID 0x9004 - Release Stage 0x9103 - Open OSD Session
0x1005 - Get Storage Info 0x9005 - Open LE Session 0x9104 - Close OSD Session
0x1006 - GetNumObjects 0x9006 - Close LE Session 0x9105 - Get OSD Data
0x1007 - GetObjectHandles 0x9007 - RequestObjectTransferReady 0x9106 - GetFirmwareStruct
0x1008 - GetObjectInfo 0x9008 - GetGeoTackingData 0x910B - GetDebugMenu
0x1009 - GetObject 0x900A - Open Debug Session 0x910C - SetDebugMenu
0x100A - Get Thumb 0x900B - Close Debug Session 0x910D - ODIN Message
0x100B - Delete Object 0x900C - Get Debug Buffer 0x910E - GetDebugObjectHandles
0x100E - Initiate Capture 0x900D - Debug Command String 0x910F - GetDebugObject
0x1014 - GetDevicePropDesc 0x900E - Get Debug Route 0x9110 - DeleteDebugObject
0x1015 - GetDevicePropV 0x900F - SetIPTCData 0x9111 - GetDebugObjectInfo
0x101C - Initiate Open Capture 0x9010 - GetIPTCData 0x9112 - WriteDebugObject
0x9020 - Get3DAxisData 0x9113 - CreateDebugObject
0x9030 - OpenLiveViewSession 0x9114 - Calibrate 3Daxis
0x9031 - CloseLiveViewSession 0x9115 - Magnetic calibration
0x9033 - Unknown 0x9116 - Get Viewfinder Data
يبدو تنفيذ واجهة PTP نفسها أمرًا قياسيًا ، لكن بعض الأوامر لها قيود أغفلها عمداً هنا.في أي حال ، كل ما سبق مثير للغاية. قد تظن ، "دعنا فقط قم بتوصيل الكاميرا عبر USB والبدء في التحقيق مع libptp." هذا صحيح.
اللعنةعليك ... لا يوجد لدى Leica M240 منفذ USB.التعامل مع الميناء
تقدم لايكا بعض الملحقات لهذه الكاميرا ، ولكن هناك واحدة مثيرة للاهتمام بشكل خاص. نحن نتحدث عن مقبض متعدد الوظائف Leica M (14495) . يستبدل الجزء المعدني السفلي من العلبة ، ويوفر نظام GPS مدمج وعدة موصلات مثل USB ، ومحطة فلاش SCA ، و DIN / ISO-X ومقبس طاقة.
وأنت تقول مرة أخرى: "رائع ، والآن فقط قم بشرائه ، وقم بتوصيله بالكاميرا ، وقم بتوصيل الكاميرا عبر USB وابدأ في البحث باستخدام libptp." هذا صحيح.
لعنة فقط ...يكلف حوالي 900 دولار.هذا هو ما يقرب من تسعمائة أسباب لإنشاء محول الخاص بك. ومع ذلك ، فقط في حالة ، قمت بإعداد إعلامات eBay لهذا الملحق.موصل
الموصل الموجود في الكاميرا هو كما يلي:
لقد حاولت العثور عليه على الإنترنت ، ولكن بجدية ، كيف تصفه على Google؟يائسًا بعض الشيء ، بدأت أفكر في بعض الأشياء المجنونة ، مثل الالتصاق بالرقائق أو الإبر على ممحاة مطاطية. لكن بمجرد العمل في Blackmagic Design ، عند النظر إلى لوحة دوائر الكاميرا ، لاحظت أن أحد الموصلات كان له شكل مألوف للغاية. في اليوم التالي ، أحضرت جهاز Leica M240 إلى العمل - ونعم ، بدا الأمر مشابهاً ، لفترة أطول بكثير مع الكثير من الفوط الصحية.يبقى السؤال عن رقم الجزء الخاص بمدير المكون الخاص بنا ، ثم العثور عليه في كتالوج Samtec : ERM8-013-05.0-L-DV-TR .
كما سألنا Samtec إذا كان من الممكن الحصول على عينة ، واتفقوا برفق.
القليل من العمل باستخدام مكواة لحام وورق مقوى وشريط كهربائي - وسدادي جاهز (نموذج 2013).
بعد خمس سنوات ، في عام 2018 ، قررت أن أسأل شخصياً Samtec لإرسال عينة أخرى. أردت أن أفعل شيئًا أفضل.ERCD-013-05.00-TTR-TTR-1-D
مرة أخرى ، هناك الكثير من العمل باستخدام مكواة لحام وأقسم وسلك مقطعة وأقسم ، والعمل مرة أخرى باستخدام مكواة لحام لصنع خيار جديد أكثر جاذبية:
Pinout
هناك 26 جهة اتصال في الموصل: 13 على كل جانب. حتى قبل لحام الجزء الخاص بي ، بحثت عن موصل الكاميرا بمقياس متعدد ومحلل منطقي. بالمناسبة ، تحتاج إلى وضع مغناطيس على مستشعر الغطاء السفلي حتى ترى الكاميرا أن الغطاء موجود.الأرض (الكاميرا مغلقة ، لا توجد بطارية)أبدأ دائمًا من الأرض لأنها آمنة وسهلة للغاية.
وبالتالي ، لدينا ثمانية خطوط أرضية (رمادي غامق).إمكانات (تشغيل الكاميرا)عندما تكون الكاميرا في وضع التشغيل ، يمكنك قياس الإمكانية عند كل دبوس والحصول على فكرة عن المنطق ومستويات الطاقة.alexhude.imtqy.com/assets/2019/2019-01-24-hacking-leica-m240/probe2_potential.pngإن الأداء على المسامير من 8 إلى 9 و 11-13 مرتفع للغاية بالنسبة إلى المسامير المنطقية ، لذلك قمت بتعريفها كقوة (أحمر).المقاومة (الكاميرا مغلقة ، لا توجد بطارية)من المفيد قياس المقاومة. في بعض الحالات ، يساعد هذا في تحديد المدخلات وتجميع بعض الخطوط.
المخرجات المتصلة (تم إيقاف تشغيل الكاميرا ، لا توجد بطارية) ،ثم قررت التحقق من جميع اللوحات الخارجية الموجودة على هيكل الكاميرا للتحقق مما إذا كانت متصلة بمنفذ الخدمة.
تم توصيل جهة اتصال مزامنة الفلاش مباشرة بالخط 10.محلل المنطق (تشغيل الكاميرا)تم تسجيل بيانات كل سطر بالتسلسل التالي: قم بتشغيله ، يجب أن تكون الكاميرا في وضع LV ، والتقاط صورة ، وبدء تسجيل الفيديو.
يُظهر خطان إرسال بعض البيانات: 01 و 21.01 - 115200 ، نقل 8 بتات ، بت توقف واحد ، بت تعادل ، LSB أولاً.
كل 500 مللي ثانية ، يرسل عداد C3 3C 02 81 00 01 00 82, C3 3C 02 81 01 01 00 83, C3 3C 02 81 02 01 00 80
...21 - 115200 ، ناقل 8 بت ، 1 بت توقف ، لا يوجد بت التحقق من التكافؤ ، LSB أولاً.
يرسل سجل أداة تحميل التشغيل إلى SH7216 ("Leica Camera AG" في لقطة الشاشة أعلاه).دعونا بمناسبة لهم الأزرق الداكن. إنه لأمر محزن أن سجل Maestro لا يخرج حتى مع الحد الأقصى لإعدادات تصحيح الأخطاء في قائمة Debug.
على هذه الاتصالات ، المقاومة حوالي 310kOhm.لا أعرف السبب ، لكنني اقترح أن خطوط البيانات الأخرى قد يكون لها مقاومة مماثلة أو سيتم إغلاقها. لذلك ، قمت بتعريف الأسطر ~ 300kOhm ، ~ 200kOhm ، و ~ 100kOhm كخطوط بيانات (ظلال زرقاء في الصورة).بشكل عام ، تم رسم الصورة التالية.
12 مرشحا على خط البيانات. ولكن كيف تحقق لهم؟ بعد محادثة قصيرة مع خبراء الحديد حول الحماية الكهربائية للدوائر المتكاملة ، بدأت بدس الاتصالات من خلال المقاوم 4kOhm ، مما يقلل من التيار إلى مستوى لا ينبغي حرق المدخلات.UART
لقد افترضت أن خط RX يجب أن يكون بالقرب من TX. تبدو الخطوط 02 و 03 و 20 مرشحين جيدين ، لأن كلاهما يحتوي على جهد 3.3 فولت مثل TX.في البداية ، حاولت استكشاف هذه الخطوط باستخدام Bus Pirate. لسوء الحظ ، كانت النتيجة قذرة إلى حد ما. ثم أخذت الكابلات القائمة على SiLabs كأكثر موثوقية وغير متعارضة على نظام التشغيل MacOS.أولاً ، قمت بتوصيل كبل TX بدبوس 20 وبدأت الكتابة help
بعد أداة تحميل التشغيل. كما هو متوقع ، بعد تأخير قصير ، كرر الكاميرا الأحرف.
كانت جهات الاتصال 02 و 03 المرشحين التاليين لـ UART. لسوء الحظ ، لم تكن هناك علامات على أن هذه الخطوط يتم استغلالها.في المخطط ، يشار إلى UARTs المعروفة بظلال أغمق من اللون الأخضر.
USB
بدأ كل شيء بقطع كبل USB إلى النصف برأس في المقاومات المتوسطة و 4 كيلو أوم للاستشعار. سلامة الإشارة من الزوج التفاضلي؟ كلا ، إذن لم أهتم حقًا. :)
ثم بحثت عن العديد من أجهزة USB المنزلية في المنزل للتعرف على شكل الاتصالات على هذا المنفذ. كاميراكانون
Blackmagic Pocket
Camcorder كاميرا كانون Canon
JVC كاميرا الفيديو
Keychain
KidiZoom الكاميرا
كلها مختلفة بعض الشيء ، لكن الحالة D-D + الأولية منخفضة. حسنًا ، سوف نعرف ، والآن سوف نتحقق من أن لدينا:- 22 - من غير المحتمل ، لأن D-D + هما زوج تفاضلي ويجب أن يكونا قريبين جدًا ؛
- 04/05 - هذا غير مرجح لأن لديهم مقاومة مختلفة ؛
- 14/15 — , ;
- 15/16 — , .
لذا ، قمت بتوصيل USB D-D + بالأزرار 15/16 وقمت بتوصيله بـ iMac ...
على شاشة USB PTP ، لكن الكاميرا لم تظهر على المضيف. حاولت تكوين خيارات مختلفة على تخطيط الدائرة الإلكترونية ، لكن لا شيء يعمل. بيغل أظهرت الكثير من الحزم التالفة وغيرها من الأخطاء. في النهاية ، استسلمت وأعدت الهندسة العكسية للبرامج الثابتة.هذا هو pinout النهائي ، يتم وضع علامة USB باللون الأخضر الداكن.
من كان يظن أنه بعد بضع سنوات سيأتي لي نفس إخطار eBay ، وسأشتري بثمن رخيص الثمن المطلوب.أخيرًا ، يمكنني اختبار افتراضاتي حول PTP. ولكن في البداية كان من الغريب أن يكون شكل USB PHY داخل الأداة.
كان داخل مركز SMSC 2512bعلى الطريق مباشرة من مقبس المقبض إلى موصل Mini USB. تعمل الشريحة في الوضع الافتراضي لعدم وجود دبابيس EEPROM أو SCL / SDA. يتم توجيه أول منفذ في اتجاه التيار إلى مأخذ على جسم الكاميرا ، لكن الثاني غير متصل بأي شيء.ربما فاتني شيء ما ، لكن بالنسبة لي مثل هذا الحل لا معنى له. يقول جواز السفر الفني أن الشريحة لديها "دبابيس USB مدمجة بالكامل ، بالإضافة إلى مقاومات لرفع وخفض الجهد الكهربائي." ربما قرر مهندسو لايكا عدم تنفيذ USB PHY الخاص بهم ، لكنهم استخدموا ذلك الموجود في المحور ، والذي تم اختباره جيدًا ويعمل خارج الصندوق. في الواقع ، لا يمكنني إلقاء اللوم عليهم ، لأنه قبل أن أحاول القيام بذلك ، اتضح أنها مهمة صعبة. ربما هذه هي ميزة للحماية ضد وهمية ، من يدري.على أي حال ، إذا فهمت USB PHY وكنت مستعدًا للمساعدة ، فلا تتردد في الكتابة إلي: يجب أن يكون من الممكن العمل من خلال منفذ USB بدون هذا الملحق ذي العلامة التجارية :)PTP مرة أخرى
كما قلت ، لقد حان الوقت للتجول بامتداد Leica PTP.لحسن الحظ ، وجدت مكتبة C ++ رائعة جدًا بدلاً من libptp - إنها libEasyPTP . كما لم يستغرق الكثير من الوقت لكتابة أداة تستند إلى هذه المكتبة: لقد كنت أعرف بالفعل بعض القيود في واجهة Leica PTP.وعلى الرغم من أن M240PTPTool عبارة عن عربات التي تجرها الدواب بشكل كبير ، إلا أنها مناسبة تمامًا لدور إثبات المفهوم ( رمز البرنامج ).فقط طلبين الانتقال خلال PTP: GetDebugBuffer (0x900C) و DebugCommandString (0x900D) . بالمناسبة ، من أجل ملء الوحدات النمطية لسجل التصحيح ، تحتاج إلى تعيين مستوى التصحيح "Debug" أو "Debug RAW" في القائمة.هناك العديد من الخيارات في واجهة M240PTPTool:- الخروج - أغلق الأداة ؛
- تدفق - دمج المخزن المؤقت debug من الكاميرا:
M240> flush
I:[00:11:468]|01| DATE/TIME CORRECTED by 5921 sec
D:[00:12:079]|00| Send message from TID 0 to TID 1 over MBX 3 - length: 4 - MesgID: 0x22020103
D:[00:12:179]|00| Send message from TID 0 to TID 1 over MBX 3 - length: 4 - MesgID: 0x22020103
D:[00:12:282]|11| Message received from TID 0 for TID 1 over MBX 3
D:[00:12:283]|11| Message received from TID 0 for TID 1 over MBX 3
D:[00:12:301]|00| Send message from TID 0 to TID 1 over MBX 3 - length: 4 - MesgID: 0x22020103
D:[00:12:402]|00| Send message from TID 0 to TID 1 over MBX 3 - length: 4 - MesgID: 0x22020103
D:[00:12:502]|00| Send message from TID 0 to TID 1 over MBX 3 - length: 4 - MesgID: 0x22020103
...
يتم إرسال أي نص آخر إلى الكاميرا كأمر تصحيح. على سبيل المثال ، help
يعرض كل الأوامر الممكنة باستخدام الوسائط: القائمة الكاملة كبيرة جدًا ، لكن انظر ، يمكنك إرسال رسائل مباشرة إلى Softune لأي مهمة! ما هو مهم جدًا لإرساله إلى هناك ... خط شائع آخر يتم البحث عنه غالبًا في البرامج الثابتة . دعونا نرى ما اذا كان لدينا واحدة. على ما يبدو ، يمكنك تفريغ البرامج الثابتة على بطاقة SD. باستخدام الرابط إلى سطر "Dumping files to card" ، من السهل العثور على الكود المسؤول عن ذلك. إنه موجود في "كتلة مهام النظام" العملاقة (pid 11 ، كما نعلم بالفعل) ويتم استدعاؤه بواسطة الرسالة بدون وسيطات. الطلب في M240PTPTool ، أدخل الصحافة ونظرة على الشاشة.M240> help
********* debug command description ********
exposure request
Description: requests a release from Sub CPU
Parameter 1: Exposure Time TV
still request
Description: simulates the -still request- command flow of Sub CPU
Parameter: no
...
send Message;[Parameter1];[Parameter2];[Parameter2];...;...
Description: Sending Message to Task
Parameter 1: Receiver Task ID
Parameter 2: Command ID
Parameter 3: Command Data[0] (32 Bit)
Parameter 4: Command Data[1] (32 Bit)
Parameter 5: .
Parameter 6: .
use maximum 10 Parameter
...
dump
$ strings IMG_LOKI-212_1.1.0.2.bin | rg -i dump
GUI: HEX DUMP: Address: %x, Length: %d
HSK: DBG_WRITE_ROM_DUMP_SD: File was properly opened, but it seems to be empty.
ROM_DUMP
HSK: DBG_WRITE_ROM_DUMP_SD: Flushing Dump to ROM. Size %d
SD:\ROM_DUMP.bin
HSK: DBG_WRITE_ROM_DUMP_SD Command received!
ROM_DUMP.bin
HSK: DUMP failed, no cards inserted!
HSK: DUMP FlashROM to SD card.
HSK: DUMP FlashROM to CF card.
Dumping files to card
0x11080006
send Message;11;0x11080006
ثم قم بإزالة بطاقة SD وتحقق مما هو موجود عليها.
ومن هنا ، تفريغ كامل ، بما في ذلك البرامج الثابتة.هذا يفتح احتمالات لا نهاية لها. على سبيل المثال ، يمكنك إنشاء جهاز صغير باستخدام وحدة MCU ودعم مضيف USB وأزرار لإطلاق تسلسلات معقدة من الرسائل ...وبعد ذلك كان لدينا طفل ثانٍ. :)
خاتمة
إذا كنت لا ترغب في كسر الجهاز ، فهناك عادة طريقة لفحصه دون فتح العلبة أو أسلاك اللحام بلوحة الدائرة. فيما يلي نصائحي إذا كنت مهتمًا:- العثور على جميع المعلومات العامة حول الجهاز: المواصفات الفنية ، بيانات المكونات ، صور الدواخل ، الفيديو من المصنع ؛)
- إذا كان لديك برنامج ثابت ، فقم بالبحث فيه وابحث عن نصائح حول المخرجات الخارجية ؛
- , ;
- GND// , ;
- ;
- , ;
- , (, );
- , Google (USB/UART/SPI/I2C/1Wire);
- , ;
, ;
- , .
github.com/alexhude!