Penafian: penelitian dimulai pada 2013, jadi jika Anda berpikir beberapa metode bodoh dan berbahaya - Anda benar, itu saja. Namun, saya belajar banyak dalam prosesnya.EntriSemuanya dimulai beberapa bulan sebelum kelahiran anak pertama saya. Istri saya dan saya selalu ingin membeli kamera Leica yang keren dan tiba-tiba menyadari bahwa jika kami tidak membelinya sekarang, maka kami tidak dapat melakukannya untuk waktu yang lama. Karena itu, kami memesan kamera M240 dan ... booming, kami antri selama enam bulan. Segera saya bosan menunggu, dan saya mulai mempelajari situs mereka. Perhatian saya segera ditarik ke bagian file. Nah, Anda bisa menebak mengapa ... Firmware!
Saya melihat file yang tidak dienkripsi dan tidak terkompresi (
m8-2_005.upd
) yang dimulai dengan
PWAD magic . Apakah kamu mengenali? Ya, itu benar, ini adalah format Doom Patch WAD. Cowok sepertinya menyukai yang klasik. Formatnya
didokumentasikan dengan sangat baik , sehingga tidak sulit untuk menguraikannya.
File firmware Leica
Firmware Leica M8
Ini sebenarnya sangat lucu, karena ketika saya kemudian mempelajari file firmware Leica T terkompresi, saya pertama kali memutuskan untuk menguji metode kompresi yang digunakan id Software di masa lalu.
Wikipedia mengatakan mereka menggunakan
format LHA , yang pada dasarnya adalah LZW. Tapi dekompresor LZW yang umum tidak cocok, jadi saya mulai mencari implementasi spesifik dari perangkat lunak id - dan voila, saya menemukan
Catacomb Armageddon di
sumbernya . Saya harus mengakui, beruntung.
Bagaimanapun, kembali ke M8. Berikut adalah struktur firmware:
ATURAN: 0x0000008C (3036: 0x00000BDC) - Deskripsi XML
LUTS: 0x00000C68 (183274: 0x0002CBEA)
GAMMA: 0x0000007C (31760: 0x00007C10)
KEUNTUNGAN: 0x00007C8C (50344: 0x0000C4A8)
LEICA: 0x00014134 (7000: 0x00001B58)
BLEMISH: 0x00015C8C (250: 0x000000FA)
WREF: 0x00015D88 (82480: 0x00014230)
OBJ: 0x00029FB8 (11268: 0x00002C04)
VERSI: 0x0002CBBC (46: 0x0000002E)
PXA: 0x0002D854 (858384: 0x000D1910)
BF: 0x000FF164 (134522: 0x00020D7A) - Perangkat Analog Keluarga prosesor Blackfin
GUI: 0x0011FEE0 (3574180: 0x003689A4)
TRANS: 0x0000005C (59988: 0x0000EA54) - lokalisasi
GAMBAR: 0x0000EAB0 (267433: 0x000414A9)
21_1PRT: 0x000000CC (18411: 0x000047EB) - gambar JFIF
21_2GRP: 0x000048B8 (23172: 0x00005A84) - gambar JFIF
21_3PAN: 0x0000A33C (23034: 0x000059FA) - gambar JFIF
24_1PRT: 0x0000FD38 (18489: 0x00004839) - gambar JFIF
24_2GRP: 0x00014574 (23230: 0x00005ABE) - gambar JFIF
24_3PAN: 0x0001A034 (22998: 0x000059D6) - gambar JFIF
28_1PRT: 0x0001FA0C (22605: 0x0000584D) - gambar JFIF
28_2GRP: 0x0002525C (23081: 0x00005A29) - gambar JFIF
28_3PAN: 0x0002AC88 (23282: 0x00005AF2) - gambar JFIF
35_1PRT: 0x0003077C (22496: 0x000057E0) - gambar JFIF
35_2GRP: 0x00035F5C (23532: 0x00005BEC) - gambar JFIF
35_3PAN: 0x0003BB48 (22881: 0x00005961) - gambar JFIF
FONT1: 0x0004FF5C (1522988: 0x00173D2C)
FONT2: 0x001C3C88 (1723676: 0x001A4D1C)
VERSI: 0x003689A4 (0: 0x00000000)
M16C: 0x00488884 (130406: 0x0001FD66) - Keluarga Renesas M16C (Rekor Motorola)
FPGA: 0x004A85EC (131604: 0x00020214) - Xilinx Spartan 3
FSL: 0x004C8800 (814: 0x0000032E) - bootloader tahap pertama
IDA di luar kotak tidak mendukung prosesor Blackfin, tetapi ada
plugin pihak ketiga .
Firmware Leica M9
File firmware Leica M9 (
m9-1_196.upd
) terlihat terenkripsi: histogram menunjukkan distribusi sekitar 0,45%.

Akhir cerita? Mungkin tidak. Faktanya adalah Leica menggunakan prosesor yang agak lemah di kamera, dan pada saat itu enkripsi XOR sering digunakan dalam elektronik konsumen, jadi saya memutuskan untuk menulis alat sederhana untuk operasi XOR untuk membandingkan firmware dengan saya dan menghitung beberapa statistik.
Panjang kunci ditentukan dengan mencari pola pengulangan terpanjang. Ini masuk akal, karena setiap firmware biasanya menyertakan blok besar data berulang, seperti pad 0x00 / 0xFF atau grafik dengan piksel LUT. Kunci itu sendiri dihitung oleh frekuensi byte dalam panjang kunci, di mana byte yang paling umum pergi ke buffer kunci. Hasil program dengan jelas menunjukkan enkripsi XOR. Kemudian saya harus
memodifikasi alat sedikit untuk mendapatkan kunci potensial dan mendekripsi kode. Ini lagi ternyata file PWAD.
Isi PWAD mengungkapkan struktur berikut:
ATURAN: 0x0000007C (2788: 0x00000AE4) - Deskripsi XML
LUTS: 0x00000B60 (4060616: 0x003DF5C8)
PROSES: 0x0000004C (3900572: 0x003B849C)
BUAT: 0x0000004C (20: 0x00000014) - cap waktu
LUTS: 0x00000060 (427744: 0x000686E0)
GAINMAP: 0x00068740 (20008: 0x00004E28)
LENS: 0x0006D568 (3452724: 0x0034AF34)
CCD: 0x003B84E8 (148662: 0x000244B6)
BUAT: 0x0000004C (20: 0x00000014) - cap waktu
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) - Perangkat Analog keluarga Prosesor Blackfin
bf0: 0x0000004C (117846: 0x0001CC56) - prosesor utama
bf1: 0x0001CCA4 (117826: 0x0001CC42) - firmware dari subprocessor
bf0.map: 0x000398E8 (27072: 0x000069C0) - kartu firmware prosesor utama dengan karakter: D
bf1.map: 0x000402A8 (26304: 0x000066C0) - kartu firmware sub-prosesor dengan karakter: D
BODY: 0x00426A90 (143280: 0x00022FB0) - Keluarga Renesas M16C (Rekor Motorola)
GUI: 0x00449A40 (3647624: 0x0037A888)
TRANS: 0x0000005C (131656: 0x00020248) - lokalisasi
GAMBAR: 0x000202A4 (267433: 0x000414A9)
21_1PRT: 0x000000CC (18411: 0x000047EB) - gambar JFIF
21_2GRP: 0x000048B8 (23172: 0x00005A84) - gambar JFIF
21_3PAN: 0x0000A33C (23034: 0x000059FA) - gambar JFIF
24_1PRT: 0x0000FD38 (18489: 0x00004839) - gambar JFIF
24_2GRP: 0x00014574 (23230: 0x00005ABE) - gambar JFIF
24_3PAN: 0x0001A034 (22998: 0x000059D6) - gambar JFIF
28_1PRT: 0x0001FA0C (22605: 0x0000584D) - gambar JFIF
28_2GRP: 0x0002525C (23081: 0x00005A29) - gambar JFIF
28_3PAN: 0x0002AC88 (23282: 0x00005AF2) - gambar JFIF
35_1PRT: 0x0003077C (22496: 0x000057E0) - gambar JFIF
35_2GRP: 0x00035F5C (23532: 0x00005BEC) - gambar JFIF
35_3PAN: 0x0003BB48 (22881: 0x00005961) - gambar JFIF
FONT1: 0x00061750 (1522988: 0x00173D2C)
USBLOGO: 0x001D547C (1775: 0x000006EF) - gambar JFIF
FONT2: 0x001D5B6C (1723676: 0x001A4D1C)
FPGA: 0x007C42C8 (150176: 0x00024AA0) - Xilinx Spartan 3A
BF547: 0x007E8D68 (937576: 0x000E4E68) - Perangkat Analog Keluarga Prosesor Blackfin (FSL?)
Firmware Leica M240
Saya terbiasa memeriksa halaman unduhan dengan firmware Leica setiap pagi. Segera muncul file baru:
FW_M240_1_1_0_2.FW .
Itu tidak terlihat dienkripsi, tetapi dikompresi ...
Kompresi
Histogram menunjukkan ledakan besar pada 0x9D.

Mungkin ini semacam sihir kompresi. Pencarian di Internet [kompresi 9D +] tidak menghasilkan apa-apa, kecuali bahwa 0x1F9D
digunakan sebagai tanda tangan untuk kompresi LZW . Jika ada, saya mengerti jenis kompresi LZ dan memutuskan untuk melihat byte setelah 0x9D. Dan saya melihat empat opsi:
9D 70 C4
9D 00
9D XX YY
9D XX 8Y YY
Apa lagi yang berhasil Anda perhatikan:
- opsi pertama hanya muncul sekali pada alamat 0x30: mungkin digunakan sebagai indikator data terkompresi;
- XX tidak pernah melebihi 0x7F;
- byte terakhir YY dalam kasus ketiga dan keempat tidak pernah melebihi 0x7F
Dari apa yang saya ketahui tentang LZ, ini sangat mirip dengan LZ77 atau LZSS, di mana YY adalah langkah indent dan XX adalah jumlah byte yang akan disalin. Dan opsi kedua adalah kasus khusus mengeluarkan 0x9D. Saya menulis fungsi C sederhana yang mengimplementasikan logika ini. Dia mengkonfirmasi bahwa kami bergerak ke arah yang benar, tetapi opsi keempat masih tidak sesuai dengan skema.
Saya mencoba segala cara untuk menafsirkannya, tetapi tidak ada hasilnya. Oleh karena itu, saya meminta saran pada teman-teman saya. Seorang pria memperhatikan bahwa menurut pengamatan saya sendiri, byte keempat YY hanya muncul ketika bit tertinggi 0x8Y diatur: ini hanya jarak ekstra untuk langkah indent. Saya malu, semuanya ternyata sangat jelas ...
Akhirnya, decompressor mulai mengeluarkan aliran yang valid ... sampai macet di tengah file. Ini terjadi karena panjang jendela geser yang tidak diketahui. Debugging tambahan dan tes memperbaiki situasi.
Jadi ada
alat untuk parsing firmware M240 .
Struktur firmware
Untuk bekerja dengan format yang tidak dikenal, saya tidak menghasilkan sesuatu yang lebih baik daripada mengukur beberapa offset dan ukuran bagian kode - dan mencoba untuk menemukan nilai terdekat di header file. Misalnya, blok ini:
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
akhirnya berubah menjadi:
1E1CAF2E β "LEICA FILE"
01010002 - 1.1.0.2
005C1AB1 β (big endian)
01291A7E β (big endian)
AE3873659C3D75B4342F446E13178E6B β MD5
00000001 β
00000030 β
Ketika saya memahami struktur firmware, saya meningkatkan alat saya, dan pada akhirnya, ini menghasilkan ini:
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!
Firmware M240 mencakup satu wadah dengan sembilan elemen:
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 -
Seperti yang Anda lihat, dalam satu firmware ada dua set file. Kemudian saya mengetahui bahwa 212 adalah versi dari mikrosirkuit pemrosesan gambar, dan dua versi Leica M240 mulai diproduksi. Penelitian ini didasarkan pada versi 212.
Manajemen Sistem: CTRL_SYS-11.bin
Satu-satunya bagian yang umum adalah firmware untuk chip kontrol sistem. Ini adalah biner yang sangat besar, dan kodenya dapat dengan mudah menebak apa yang dimaksudkan.
$ 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
Dengan demikian, kami memiliki prosesor Renesas SH7216 (SH-2A), yang bertanggung jawab untuk tahap awal pemuatan, tes I / O dan pembaruan firmware. Di luar kotak, IDA mendukung jenis prosesor ini. Tinggal mencari alamat pemuatan basis yang benar, yang diketahui dari deskripsi bagian firmware: ini
0x0
.
Section Name: "[A]CTRL_SYS-11"
Section offset: 14680064 | 0x00E00000
Section size: 917277 | 0x000DFF1D
Section base: 0 | 0x00000000
Saya memasukkannya ke dalam IDA dan mengenali semua fungsi, tetapi saya tidak menggali khususnya, karena firmware dari prosesor utama jauh lebih menarik.
Di sini juga dapat dicatat bahwa UART chip ini terbuka ke port layanan, tempat ia menampilkan log pengunduhan. Kami akan kembali ke sini nanti.
Chip utama: IMG_LOKI-212.bin
Untuk memulai rekayasa balik firmware ini, Anda harus terlebih dahulu menjawab beberapa pertanyaan:
- jenis prosesor apa
- apa alamat beban dasar
- berdasarkan OS apa, jika ada
Berkat alat kami, kami sudah tahu alamat beban dasar: ini
0x100000
.
Section Name: "[A]IMG_LOKI-212"
Section offset: 0 | 0x00000000
Section size: 7340032 | 0x00700000
Section base: 1048576 | 0x00100000
Firmware menyimpan jawaban yang tersisa dalam bentuk yang dapat dibaca. Misalnya, baris ini:
$ 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
...
Maka, kami berhadapan dengan prosesor kustom
Fujitsu FR (Leica menyebutnya
Maestro ) dan
sistem operasi
Softune REALOS . Sebenarnya, ini jauh lebih baik daripada Blackfin, karena IDA out of the box mendukung FR.
Modul prosesor FR
Kenyataannya tidak begitu cerah, karena setelah mengunduh file firmware, program IDA tidak menunjukkan instruksi, tautan eksternal, dll.
Saya memutuskan untuk memperbaikinya, tetapi pada akhirnya saya harus
sepenuhnya menulis ulang beberapa bagian dari firmware . Inilah hasilnya:


Selain koreksi dalam
ana
,
ins
dan
out
, kode
emu
sama sekali baru dapat:
- mengenali berbagai jenis kode dan tautan eksternal ke data;
- Kenali pernyataan sakelar
- melakukan stack tracing;
- Pisahkan argumen stack dan variabel lokal
- mengenali fungsi dengan benar.
Tetapi perubahan terbesar, seperti yang Anda perhatikan, adalah huruf kapital untuk instruksi :)
Ingin melihat set instruksi lengkap? Ini dia:
TAMBAH ATAU BTSTH LSR MOV BN LDRES EXTSH
ADD2 ORH MUL LSR2 JMP BP STRES EXTUH
ADDC ORB MULU ASR PANGGILAN BV COPOP SRCH0
TAMBAH 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
DAN BEORL DIV4S ST BNE DMOV ADDSP TINGGALKAN
ANDH BEORH LSL STH BC DMOVH EXTSB XCHB
ANDB BTSTL LSL2 STB BNC DMOVB EXTUB
Sangat sederhana dan indah.
Omong-omong, Anda mungkin telah memperhatikan bahwa beberapa instruksi tidak selaras:
BRA: D loc_xxx
LDI: 8 # 0x64, R5
Ini bukan kesalahan dalam modul prosesor, tetapi sebenarnya fitur keluarga Fujitsu FR. Ini disebut
slot tunda dan cukup khas untuk prosesor RISC.
Dari
manual prosesor FR80 (catatan: tautan tidak lagi berfungsi):
Instruksi, yang terletak tepat setelah instruksi cabang (lokasinya disebut "slot tunda"), dieksekusi sebelum cabang, dan instruksi pada alamat target dieksekusi setelah cabang. Karena instruksi dalam slot penundaan dijalankan sebelum operasi cabang, kecepatan eksekusi yang terlihat adalah 1 siklus.
Dengan demikian, ini, pada intinya, optimasi pipa, dan lebih baik untuk mengingatnya, karena digunakan di mana-mana dalam firmware Leica.
Softune REALOS
Dari wiki :
Softune adalah lingkungan pengembangan terintegrasi Fujitsu untuk keluarga prosesor Fujitsu FR, FR-V, dan F2MC. Didukung oleh REALOS ΞΌITRON kernel real-time. Misalnya, ini digunakan pada kamera DSLR Nikon (lihat Nikon EXPEED) dan beberapa kamera Pentax dengan K.
Jadi ini adalah RTOS yang layak cukup populer dengan tugas, semaphore dan barang lainnya. Saya bertanya-tanya apakah mungkin untuk mengenali beberapa fungsi perpustakaan standar dalam firmware Leica.
Saya harus menyebut bagian pertama dari penelitian ini sebagai pemborosan waktu, dan inilah alasannya.
Softune IDE ternyata sangat sulit ditemukan, tetapi pada akhirnya saya berhasil mendapatkan sesuatu. Seperti yang diharapkan, IDE menyertakan perpustakaan. Ada empat binari:
- lib911.lib
- lib911e.lib
- lib911if.lib
- lib911p.lib
Saya tidak tahu mengapa, mungkin dengan inersia, ketika saya meretas semua yang berhubungan dengan Leica, saya mulai merekayasa balik format tersebut lagi. Ya,
Format Modul Objek yang didokumentasikan dengan sangat baik. Dan ya, tentu saja, saya
menulis alat khusus untuk ini :
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
Dengan menggunakannya, Anda dapat membuat file
*.pat
dan menggunakannya sebagai input dalam
IDA FLAIR untuk menghasilkan
file tanda tangan .
$ 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
Setelah menerapkan tanda tangan ini, saya akhirnya senang melihat korespondensi di
IMG_LOKI-212.idb .

Tata letak
Jumlah baris dalam firmware segera menarik perhatian. Banyak fungsi diberi nama karena fungsinya. Ini sangat berguna dalam proses rekayasa terbalik untuk memahami pola umum.
Penting juga untuk dicatat bahwa beberapa bagian file firmware disalin ke alamat berbeda di handler reset. Misalnya, pemuat bawaan saat runtime bergerak lebih tinggi dalam RAM.
Saya harus secara manual membuat bagian tambahan, akibatnya, saya mendapat tata letak berikut:

Gangguan
Tabel vektor interupsi dapat ditemukan dengan mengakses TBR (Table Base Register):
LDI:32 #int_table, R0
MOV R0, TBR
Biasanya ini terjadi pada handler reset vektor di awal firmware.
Alamat penangan dalam tabel disimpan dalam urutan terbalik sesuai dengan formula
TBR + (0x3FC - 4 Γ inum)
, sehingga vektor reset di akhir tabel diimbangi
0x3FC
.
Saya menemukan sebagian besar gangguan dari manual FR dan menyarankan bahwa Leica Maestro memiliki tata letak yang mirip. Kemudian dia mengambil masing-masing pawang dan mencoba menemukan seutas tali atau petunjuk lain yang mengungkapkan tujuan interupsi.
Sebagai hasilnya, saya membuat daftar ini:

Banyak interupsi yang cukup diharapkan, seperti AUDIO / SDIO / VIDEO / JPEG / RAW, tetapi mencoba mengidentifikasi yang paling misterius dari mereka? Saya berbicara tentang interupsi
int_uart_in
. Tampaknya kamera mendukung semacam mode konsol UART CLI.
Panggilan sistem
Seperti hampir semua OS, Softline REALOS menggunakan panggilan sistem. Di assembler, mereka terlihat seperti ini:

Alamat aktual penangan panggilan sistem dihitung sebagai berikut. Mari kita mulai dengan mencari interrupt handler
INT #0x40
. Seperti dijelaskan di atas, ini
(0x3FC - 4 Γ inum) = (0x3FC - 4 Γ 0x40) = 0x2FC = int_realos_syscall
Di handler, mudah untuk menemukan tautan ke bagian bawah tabel panggilan sistem dengan kata-kata 16-bit. Catatan spesifik dalam tabel ini dihitung dengan rumus
syscall_table_bottom + (num * 2)
:
[syscall_table_bottom + (-23 * 2)] = [syscall_table_bottom - 0x2E] = [0x1012EA] = 0xE68
Ini tidak terlihat seperti alamat, karena alamat sebenarnya dari penangan panggilan sistem dihitung sebagai
syscall_table_bottom + offset
. Seluruh proses ditunjukkan dalam diagram.

Semua panggilan sistem dan fungsinya ditunjukkan dalam
manual kernel Softline REALOS / FR , jadi saya berhasil mengembalikan semua penangan yang diimplementasikan dalam tabel dan sedikit meningkatkan IDB.

Tentu saja, Anda dapat membuat kode lebih indah dengan mendefinisikan jenis-jenis panggilan sistem di IDA.

Saya menulis
skrip Python untuk secara otomatis mencari panggilan sistem ini dan banyak lagi.
Tugasnya
Dalam panggilan sistem
sta_tsk
saya perhatikan bahwa bukan fungsi utama yang dilewatkan sebagai parameter, tetapi pid. Ini berarti saatnya untuk mencari array besar deskriptor tugas. Dan masuk akal untuk memulai dengan
sta_tsk
itu sendiri.
ROM: 102180 sys_sta_tsk:
ROM: 102180 ST RP, @ -R15
ROM: 102182 LDUB @ (R14, 0x4F), R3
ROM: 102184 LDI: 32 # word_100B80, R14
Pada awalnya kami melihat beberapa tautan. Saya harus mengotak-atik sedikit dengan tipe data, tetapi pada akhirnya potongan-potongan itu menyatu:
ROM: 100B80 word_100B80: .word 0xF; sejumlah tugas
ROM: 100B82 .word 0x1C; ukuran deskriptor tugas
ROM: 100B84 .panjang 0x82A09F5C; deskriptor tugas 1
ROM: 100B88. Panjang 0x1000D
ROM: 100B8C. Panjang 0
ROM: 100B90 .panjang 0x40000000
ROM: 100B94 .long sub_1A7DB2; tugas utama
ROM: 100B98. Panjang 0x8286EEC0
ROM: 100B9C. Panjang 0
ROM: 100BA0. Panjang 0x82A09F88; deskriptor tugas 2
ROM: 100BA4. Panjang 0x20010
ROM: 100BA8. Panjang 0
ROM: 100BAC .panjang 0x40000000
ROM: 100BB0 .panjang sub_1A6BD2; tugas utama
ROM: 100BB4 .panjang 0x8287EEC0
ROM: 100BB8. Panjang 0
...
dan sebagainya. Hanya 15 tugas. Itu masalah waktu untuk melihat ke dalam setiap fungsi utama, menentukan nama dan tujuan tugas (kecuali yang terakhir). Berikut daftar lengkapnya:
- SubCPU
Tugas ini tampaknya bertanggung jawab untuk operasi penangkapan seperti pemaparan, penampakan di layar, dll.
- Manajer kunci
Kemungkinan besar, tugas ini dikaitkan dengan tombol perangkat keras.
- Guimanager
Tugas yang cukup besar, di mana mesin keadaan UI dan rendering antarmuka diimplementasikan.
- Debugmanager
Ya, ada sesuatu yang harus di-debug. Yum yum.
- Pembuat film
Tugas ini adalah semua tentang operasi file.
- Fammanager
Saya akan mengatakan bahwa tugas bertanggung jawab atas file dan memori, karena itu tergantung pada tugas manajer file dan manajer memori.
- Memorymanager
Tidak ada kejutan: operasi memori, manajemen kolam, dll.
- Imagemanager
Tugas ini mengelola proses encoding / decoding dan proses pemrosesan gambar lainnya.
- Manajer Usb
Tantangan saat ini adalah pemrosesan komunikasi USB, yang mencakup MassStorage, PTP, dan protokol Leica sendiri.
- IOManager
Tugas ini tampaknya mengelola perangkat penyimpanan seperti kartu SD dan CF (apa? Apa CF lainnya? Mungkin itu dari model 213).
- Manajer sistem
Berbagai tugas seperti operasi sistem umum, manajemen daya, dll.
- Pengaturan Manajer
Menangani status dan pengaturan kamera.
- Monitormanager
Melacak perubahan kondisi kamera dan menginformasikan tugas lainnya.
- Manajer periferal
Tugas ini mengontrol GPS, kecerahan, dan beberapa sensor lainnya.
- Tidak dikenal
Sayangnya, saya tidak menemukan sesuatu yang signifikan baginya.
Sangat menarik untuk dicatat bahwa setelah array utama ada keterangan lain yang beredar.
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
Dan fungsi dari tugas ini hanya bercabang sendiri.
ROM:101494 sub_101494:
ROM:101494 BRA sub_101494 ; CODE XREF: sub_101494
Deskriptor ini direferensikan di akhir fungsi
start
, yang bertanggung jawab untuk membuat tugas-tugas lain dan mengatur firmware. Jadi ini kemungkinan besar adalah tugas tidak adanya sistem.
Modul dan Pesan
Selain tugas, Anda dapat menentukan beberapa objek logis, seperti IO dan modul periferal. Modul disajikan sebagai sekelompok penangan pesan sebagai bagian dari salah satu tugas.
Kelompok IO tampaknya meliputi:
- Manajer IO
- Subprocessor
- Manajer USB
- USB PTP
- Protokol Leica USB
- Penyimpanan massal USB
- Pengelola Tombol
- Manajer debug
- Manajer lensa
Dan pada kelompok periferal:
- Manajer Periferal
- Sensor cahaya
- LED
- Pembicara
- Sensor kemiringan
- Pengakuan penutupan tutup
- Modul GPS
- Modul 3DAxis
Sistem pengiriman pesan itu sendiri menggunakan struktur SOFTUNE standar:
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 }
Seperti yang diharapkan, IPC juga memiliki beberapa grup pesan. Karena banyak pesan diproses dalam tugas dan modul, saya hanya dapat memulihkan beberapa dari grup ini:
0x1101xxxx - pesan sistem global:
0x11010002 = SYS_UPDATE_BOOTLOADER atau
0x11010005 = SYS_ERASE_SETTINGS
0x1102xxxx - pesan yang terkait dengan pengambilan gambar:
0x11020001 = CMD_CAP_CAPTURE atau
0x11020008 = IMAGE_STATUS_CHANGED
0x1104xxxx - pesan tentang acara yang berkaitan dengan pemutaran:
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 - beberapa pesan lain yang berkaitan dengan memori:
0x66600006 = HISTOGRAM
0x66600011 = RAWCOMP
0x771100xx dan 0x77AA00xx - pesan yang terkait dengan beralih mode kamera
Sayangnya, banyak posting lain masih belum diketahui.GUI
Dalam file firmware, kita juga akan melihat bagian-bagian berikut: CTRL_SYS-11 , IMG-LOKI-212 , IMG-DSP-212 , IMG-FPGA-212 dan IMG-LENSDATA-212 .Yang mengejutkan saya adalah kurangnya sumber daya GUI. Tetapi mereka harus berada di suatu tempat dan, kemungkinan besar, dibangun ke IMG-LOKI-212 .Salah satu pendekatan saya yang biasa untuk membalikkan pengembangan firmware adalah mengembalikan semua referensi silang yang mungkin. Tidak hanya di kode, tetapi juga di bagian data. Lalu saya melihat-lihat, mencoba menemukan beberapa pola atau tautan ke bagian kode yang diketahui.Firmware Leica tidak terkecuali. Ada banyak urutan data serupa dengan alamat ke urutan data lain yang lebih jauh, dll. Ketika saya menaiki hierarki tautan, saya akhirnya melihat fungsi yang sudah dikenal.Misalnya, saya menemukan struktur data tanpa tautan: g_data = { ... }
Struktur lain mengatasinya: g_data_struct1 = { ... , &g_data }
Yang pada gilirannya disebut oleh struktur lain: g_data_struct2 = { &g_data, ... }
Struktur data ini memiliki tautan dari kode, dan diteruskan sebagai parameter ke fungsi lain: func1() β° func2(..., &g_data_struct2, ...)
Namun, func1()
itu tidak dipanggil langsung dari fungsi lain, tetapi disimpan dalam beberapa array: g_func_list1[] = { ..., func1(), ... }
Melihat di atas, saya menemukan panggilan dalam kode g_func_list1
: func3() { g_func_list1[x] }
Dan lagi, fungsi ini disimpan dalam array: g_func_list2[] = { ..., func3(), ... }
Beberapa kode lain mengakses array itu sendiri: func4() { g_func_list2[x] }
Untungnya, kali ini fungsinya dipanggil dari fungsi lain, dan seterusnya gui_MADE_ApplicationRun
. gui_Statemachine_DoStateChange() β° gui_MADE_ApplicationRun() β° func5() β° func4()
Beberapa baris menunjukkan bahwa subsistem GUI disebut "MADE," dan transisi halaman ditangani menggunakan MADE_GetSysTri
apa pun artinya. Mesin negara GUI pada dasarnya diimplementasikan dalam suatu fungsi gui_Statemachine_DoStateChange
. Setelah mengumpulkan informasi tentang GUI, gambaran umum muncul:
Seperti yang Anda lihat, fungsi utama untuk sumber daya GUI adalah gui_CopyImageDesc
(meskipun ini bukan nama asli). Dia memiliki argumen berikut: 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 )
Ada empat jenis deskripsi sumber daya: 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; }
Tipe pertama memiliki header dengan referensi ke array catatan. Setiap catatan memiliki koordinat dan alamat untuk data piksel. Jenis saat ini tampaknya menggambarkan elemen yang bergantung pada keadaan, seperti ikon, yang mungkin berwarna abu-abu atau menghilang dari UI.Tipe kedua juga dimulai dengan tajuk dan digunakan untuk melokalkan, menjelaskan garis atau blok teks.Tipe ketiga menjelaskan peta karakter untuk berbagai bahasa.Jenis yang terakhir bertanggung jawab untuk semua sumber daya statis lainnya, seperti gambar, latar belakang, dll.Sekarang mari kita lihat data untuk gambar itu sendiri. Enam byte pertama terlihat seperti header kecil, diikuti oleh semacam pola berulang, di mana setiap byte kedua adalah salah satu , atau . Adalah logis untuk mengasumsikan bahwa dan+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
- lebar dan tinggi dalam tampilan dengan urutan byte langsung (big endian). Di akhir dump ini, kita melihat awal dari urutan lainnya 00 06 00 14 00 01
. Kemungkinan besar, ini adalah sumber daya berikutnya (seperti yang dikonfirmasi oleh tautan ke sana). Dengan demikian, ukuran data gambar aktual adalah 146 byte. Tetapi ukuran gambar harus 0x8 * 0x14 = 0xA0 = 160. Jelas bahwa data tersebut bukan piksel murni dan bahkan LUT 8-bit, karena lebih kecil 14 byte. Lalu apa?
Mungkin semacam kompresi.Melihat dump heksadesimal ini, sulit untuk percaya bahwa beberapa jenis skema kompleks digunakan. GUI Leica tidak terlalu berwarna, jadi menurut pengalaman saya, yang terbaik adalah menggunakan tabel LUT di sini. Dalam hal ini, sumber daya UI akan sepenuhnya mengulangi indeks LUT seperti 03 03 03
atau 1 1 1
. Biasanya, kompresor mencoba menyingkirkan duplikasi data, menggantinya dengan tautan. Array indeks ini ideal untuk kompresi bahkan dengan metode sederhana seperti RLE [data][number]
. Perintah sederhana untuk menulis data
(nilai) number
kali.Dengan semua ini dalam pikiran, saya menyarankan agar kita kemungkinan besar melihat gambar sederhana dengan dua warna LUT ( 0xFF
dan 0x04
), dan byte di depan warna adalah jumlah piksel untuk menggambar."Dan kemudian Anda menulis instrumen lain," Anda berpikir. Tapi tidak, saya mengambil pena dan kertas dan mulai mengisi sel. Lucu kalau saya masih punya foto itu.
Di suatu tempat di sepanjang jalan, saya menyadari bahwa 160 piksel tidak cukup untuk gambar ini, jadi 0x8 dan 0x14 perlu dikalikan dua. Kata ketiga 0x0001 menunjukkan apakah gambar adalah karakter ASCII, jadi struktur ImageAsset akhir adalah sebagai berikut: 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[]; }
Tetapi satu bagian masih hilang: LUT.Itu tidak begitu sulit ditemukan, karena banyak tautan dan struktur sudah dipulihkan secara manual, jadi saya perlahan menggulir bagian data, mencari array 256 elemen dari nilai 16-bit atau 32-bit, sampai saya menemukan ini: Sekali lagi, terima kasih Dalam pekerjaan saya dengan Desain Blackmagic, saya langsung mengenali piksel YUV (misalnya, semua nilai dengan angka 8080). Saya tidak bodoh lagi menggambar seluruh antarmuka pengguna secara manual di atas kertas, jadi ya, saya menulis alat lain - M240UITool . Selain mengatur ulang semua sumber daya gambar dari file firmware ke BMP / PNG, alat ini dapat membuat skrip IDC di IDA untuk menentukan semua sumber daya UI..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
Kita sudah tahu bahwa dari fungsi yang dibuat oleh satu halaman UI, itu disebut beberapa kali gui_CopyImageDesc
. Saya pikir akan sangat bagus untuk membuat browser sumber daya UI dan mendefinisikan semua fitur rendering halaman. Opsi -c
ini dimaksudkan untuk ini - ini menciptakan wadah khusus untuk melihat sumber daya.Dan siapa yang mengatakan bahwa browser sumber daya UI mungkin tidak terlihat tidak biasa?
Menjadi interaktif (tombol tembus pada tangkapan layar), alat ini memungkinkan Anda untuk tidak hanya menelusuri halaman-halaman menu EVF / LCD, tetapi juga melihat langkah-langkah rendering dalam satu halaman.Sayangnya, kode sumber untuk karya ini hilang di suatu tempat, tetapi file header masih dalam kode M240UITool, jadi secara teknis Anda dapat membuatnya dari awal.Menu debug
Baris apa yang kita cari terutama saat reverse engineering? Menurut saya, kata ini debug
dan turunannya.Ada banyak baris menarik di firmware, tetapi ini khusus: Tampaknya Anda dapat masuk ke mode debug menggunakan beberapa kombinasi tombol. Semua garis ini dipanggil dari satu fungsi raksasa , yang mengimplementasikan mesin pemindaian tombol. Begini tampilannya di IDA:$ 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
Saya tidak akan berbohong, butuh beberapa waktu untuk memahami bagaimana tombol perangkat keras diproses dalam firmware, dan kemudian mengembalikan jenis yang disebutkan untuk tombol dan joystick. Tetapi ketika saya mendapat kombinasinya, saya mengetahui dengan kecewa bahwa dia tidak melakukan apa-apa. Mungkin hanya bekerja dari halaman GUI tertentu. Beberapa malam lagi penelusuran manual mesin negara GUI - dan masalahnya selesai, dan kami juga berhasil menemukan halaman menu Reset.Akhirnya, selamat datang di mode debug.
Saya banyak berpikir apakah akan mengumumkan kombinasi ini, tetapi memutuskan untuk abstain. Saya menghargai kerja keras yang dilakukan Leica, merilis perangkat uniknya, dan saya tidak ingin bertanggung jawab atas kenyataan bahwa pusat layanan mereka akan mengisi bangkai kamera yang rusak sebagai hasil dari beberapa keingintahuan yang tidak masuk akal.Tapi tetap saja, saya akan memberikan beberapa jenis yang disebutkan untuk menyederhanakan rekayasa balik bagi mereka yang siap untuk pergi dengan cara ini. 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 };
Ptp
Berpikir tentang tugas USB, saya mendefinisikan tiga mode (yang juga dikonfirmasi dalam menu debug):- Ptp
- MSC (Kelas Penyimpanan Massal)
- Leica custom
PTP paling menarik karena didokumentasikan dengan baik dan memungkinkan Anda untuk mengontrol kamera.Cukup mudah untuk menemukan penangan PTP dalam firmware, karena ada banyak panggilan dari kode ini. Semua panggilan PTP dibagi menjadi tiga kelompok: Legacy , Leica Extended (LE) dan Production .Pesan debug membantu membangun nama untuk hampir semua kode. Warisan: Leica Extents: Produksi:
0x1001 - GetDeviceInfo 0x9001 - Tetapkan Pengaturan Kamera 0x9100 - Buka Sesi Produksi
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
Implementasi antarmuka PTP itu sendiri tampaknya standar, tetapi beberapa perintah memiliki keterbatasan yang sengaja saya hilangkan di sini.Bagaimanapun, semua hal di atas cukup menarik. Anda mungkin berpikir, "Mari kita colokkan kamera melalui USB dan mulai memeriksa dengan libptp." Benar juga.
Sialan ...Leica M240 tidak memiliki port USB.Tangani port
Leica menawarkan beberapa aksesoris untuk kamera ini, tetapi ada satu yang sangat menarik. Kita berbicara tentang pegangan multi-fungsi Leica M (14495) . Ini menggantikan bagian logam bawah casing, menyediakan GPS built-in dan beberapa konektor seperti USB, terminal flash SCA, DIN / ISO-X dan soket daya.
Dan Anda berkata lagi: "Bagus, sekarang beli saja, pasangkan ke kamera, hubungkan kamera via USB dan mulailah menyelidik menggunakan libptp." Benar juga.
Hanya sialan ...Harganya hampir 900 dolar.Ini hampir sembilan ratus alasan untuk membuat adaptor Anda sendiri. Namun, untuk berjaga-jaga, saya mengatur pemberitahuan eBay untuk aksesori ini.Konektor
Konektor pada kamera adalah sebagai berikut:
Saya mencoba menemukannya di Internet, tetapi serius, bagaimana Anda menggambarkannya di Google?Dengan sedikit putus asa, saya mulai memikirkan beberapa hal gila, seperti menempelkan kertas timah atau jarum ke penghapus karet. Tapi begitu bekerja di Blackmagic Design, melihat papan sirkuit kamera, saya perhatikan bahwa salah satu konektor memiliki bentuk yang sangat akrab. Hari berikutnya saya membawa Leica M240 saya ke kantor - dan ya, tampilannya mirip, hanya jauh lebih lama dengan banyak pembalut.Tetap menanyakan nomor komponen manajer komponen kami, dan kemudian menemukannya di katalog Samtec : ERM8-013-05.0-L-DV-TR .
Kami juga bertanya kepada Samtec apakah mungkin untuk mendapatkan sampel, dan mereka setuju.
Sedikit kerja dengan besi solder, kardus, dan pita listrik - dan steker saya sudah siap (sampel tahun 2013).
Lima tahun kemudian, pada tahun 2018, saya memutuskan untuk secara pribadi meminta Samtec untuk mengirim sampel lain. Saya ingin melakukan sesuatu yang lebih baik.ERCD-013-05.00-TTR-TTR-1-D
Sekali lagi, banyak pekerjaan dengan besi solder, bersumpah, memotong kawat, bersumpah, lagi bekerja dengan besi solder untuk membuat opsi baru yang lebih menarik:
Pinout
Ada 26 kontak di konektor: 13 di setiap sisi. Bahkan sebelum menyolder bagian saya, saya memeriksa konektor kamera dengan multimeter dan penganalisis logika. Ngomong-ngomong, Anda perlu meletakkan magnet pada sensor penutup bawah sehingga kamera menganggap bahwa penutup sudah terpasang.Bumi (kamera mati, tidak ada baterai)Saya selalu mulai dari tanah karena aman dan sangat mudah ditemukan.
Dengan demikian, kami memiliki delapan garis tanah (abu-abu gelap).Potensi (kamera aktif)Saat kamera aktif, Anda dapat mengukur potensi di setiap pin dan mendapatkan gagasan tentang tingkat logika dan daya.alexhude.imtqy.com/assets/2019/2019-01-24-hacking-leica-m240/probe2_potential.pngPerforma pada pin 8-9 dan 11-13 terlalu tinggi untuk pin logika, jadi saya mendefinisikannya sebagai power (merah).Resistansi (kamera mati, tidak ada baterai)Ini berguna untuk mengukur resistansi. Dalam beberapa kasus, ini membantu mengidentifikasi input dan mengelompokkan beberapa baris.
Output yang terhubung (kamera dimatikan, tidak ada baterai)Kemudian saya memutuskan untuk memeriksa semua bantalan eksternal pada bodi kamera untuk memeriksa apakah mereka terhubung ke port layanan.
Kontak sinkronisasi flash langsung terhubung ke saluran 10.Penganalisis logika (kamera dihidupkan)Data untuk setiap saluran direkam dalam urutan berikut: aktifkan, kamera harus dalam mode LV, ambil gambar, mulai merekam video.
Dua baris menunjukkan transmisi beberapa data: 01 dan 21.01 - 115200, transmisi 8 bit, 1 stop bit, parity bit, LSB pertama.
Setiap 500 ms, ia mengirimkan penghitung 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, transmisi 8 bit, 1 stop bit, tidak ada bit parity check, LSB pertama.
Ini mengirimkan log bootloader ke SH7216 ("Leica Camera AG" pada gambar di atas).Mari kita tandai mereka biru tua. Sangat menyedihkan bahwa log Maestro tidak keluar bahkan dengan pengaturan debug maksimum di menu Debug.
Pada kontak ini, resistansi sekitar 310kOhm.Saya tidak tahu mengapa, tetapi saya menyarankan bahwa jalur data lain mungkin memiliki resistensi yang sama atau akan ditutup. Oleh karena itu, saya mendefinisikan garis ~ 300kOhm, ~ 200kOhm, dan ~ 100kOhm sebagai garis data (nuansa biru pada gambar).Secara umum, gambar berikut ini diambil.
12 kandidat di jalur data. Tapi bagaimana cara memeriksanya? Setelah percakapan singkat dengan para ahli besi tentang perlindungan listrik dari sirkuit terpadu, saya mulai menyodok kontak melalui resistor 4kOhm, yang mengurangi arus ke tingkat yang tidak boleh terbakar oleh input.UART
Saya membuat asumsi lain bahwa garis RX harus dekat TX. Baris 02, 03, dan 20 terlihat seperti kandidat yang baik karena keduanya memiliki tegangan 3,3 V seperti TX.Awalnya, saya mencoba menjelajahi jalur ini menggunakan Bus Pirate. Sayangnya, hasilnya agak kotor. Kemudian saya mengambil kabel berbasis SiLabs sebagai lebih dapat diandalkan dan tidak bertentangan pada macOS.Pertama, saya menghubungkan kabel TX ke pin 20 dan mulai mengetik help
setelah bootloader. Seperti yang diharapkan, setelah jeda singkat, kamera mengulangi karakter.
Kontak 02 dan 03 adalah kandidat berikutnya untuk UART. Sayangnya, tidak ada tanda-tanda bahwa garis-garis ini disadap.Dalam diagram, UART yang terkenal ditunjukkan oleh warna hijau yang lebih gelap.
USB
Semuanya dimulai dengan memotong kabel USB menjadi dua dengan header di tengah dan resistor 4kOhm untuk penginderaan. Sinyal integritas pasangan diferensial? Tidak, maka saya tidak terlalu peduli. :)
Kemudian saya memeriksa beberapa perangkat rumah USB di rumah untuk mendapatkan gambaran tentang bagaimana komunikasi pada port ini.Canon
Camera Blackmagic Pocket
Camcorder Canon
Camcorder JVC Camcorder
Keychain
KidiZoom Camera
Mereka semua sedikit berbeda, tetapi keadaan awal D-D + rendah. Yah, kita akan tahu, dan sekarang kita akan memeriksa bahwa kita memiliki:- 22 - tidak mungkin, karena D-D + adalah pasangan diferensial dan harus cukup dekat;
- 04/05 - tidak mungkin karena mereka memiliki resistensi yang berbeda;
- 14/15 β , ;
- 15/16 β , .
Jadi saya menghubungkan USB D-D + ke pin 15/16 dan menghubungkannya ke iMac ...
Pada layar USB PTP, tetapi kamera tidak muncul di host. Saya mencoba mengkonfigurasi berbagai opsi pada tata letak sirkuit elektronik, tetapi tidak ada yang berhasil. Beagle menunjukkan banyak paket yang rusak dan kesalahan lainnya. Pada akhirnya, saya menyerah dan kembali untuk merekayasa balik firmware.Ini adalah pinout terakhir, USB ditandai dengan warna hijau tua.
Siapa yang menyangka bahwa beberapa tahun kemudian pemberitahuan eBay yang sama akan datang kepada saya dan saya akan dengan murah membeli aksesori yang diinginkan.Akhirnya, saya bisa menguji asumsi saya tentang PTP. Tapi pada awalnya itu sangat penasaran bagaimana USB PHY terlihat di dalam gadget.
Di dalamnya ada hub SMSC 2512btepat di jalan dari gagang jack ke konektor Mini USB. Chip bekerja dalam mode default karena tidak ada pin EEPROM atau SCL / SDA. Port hilir pertama diarahkan ke soket pada bodi kamera, tetapi yang kedua tidak terhubung ke apa pun.Saya mungkin melewatkan sesuatu, tetapi bagi saya solusi seperti itu tidak masuk akal. Paspor teknis mengatakan bahwa chip tersebut memiliki "pin USB terintegrasi penuh, serta resistor untuk menaikkan dan menurunkan tegangan." Mungkin para insinyur Leica memutuskan untuk tidak mengimplementasikan USB PHY mereka sendiri, tetapi menggunakan yang ada di hub, yang telah teruji dengan baik dan berhasil di luar kotak. Sebenarnya, saya tidak bisa menyalahkan mereka, karena sebelum saya mencoba melakukan ini, dan itu ternyata menjadi tugas yang sulit. Mungkin ini adalah fitur untuk perlindungan terhadap penipuan, siapa tahu.Bagaimanapun, jika Anda mengerti USB PHY dan siap membantu, jangan ragu untuk menulis kepada saya: seharusnya dapat bekerja melalui port USB tanpa aksesori bermerek ini :)PTP lagi
Seperti yang saya katakan, saatnya bermain-main dengan ekstensi Leica PTP.Untungnya, saya menemukan pustaka C ++ yang cukup keren daripada libptp - ini libEasyPTP . Juga tidak butuh banyak waktu untuk menulis alat berdasarkan pustaka ini: Saya sudah tahu beberapa batasan dalam antarmuka Leica PTP.Dan meskipun M240PTPTool cukup bermasalah, ia cukup cocok untuk peran pembuktian konsep ( kode program ).Hanya dua permintaan melalui PTP: GetDebugBuffer (0x900C) dan DebugCommandString (0x900D) . By the way, agar modul untuk mengisi log debug, Anda perlu mengatur Level Debug sebagai "Debug" atau "Debug RAW" di menu.Ada beberapa opsi di antarmuka M240PTPTool:- keluar - tutup alat;
- flush - gabungkan buffer debug dari kamera:
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
...
Teks lain dikirim ke kamera sebagai perintah debugging. Misalnya, ini help
menampilkan semua perintah yang mungkin dengan argumen: Daftar lengkapnya cukup besar, tetapi lihat, Anda dapat mengirim pesan langsung ke Softune untuk tugas apa pun! Apa yang akan sangat menarik untuk dikirim ke sana ... Baris populer lain yang sering dicari dalam firmware adalah . Mari kita lihat apakah kita punya satu. Tampaknya, Anda dapat membuang firmware ke kartu SD. Menggunakan tautan ke baris "Membuang file ke kartu", mudah untuk menemukan kode yang bertanggung jawab untuk ini. Itu terletak di blok Sistem Tugas raksasa (pid 11, seperti yang kita sudah tahu) dan dipanggil oleh pesan tanpa argumen. Dial di M240PTPTool , tekan Enter dan melihat layar.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
Kemudian lepaskan kartu SD dan periksa apa yang ada di dalamnya.
Ini dia, dump lengkap, termasuk firmware.Ini membuka kemungkinan yang tak terbatas. Misalnya, Anda dapat membuat perangkat kecil dengan MCU, dukungan untuk host USB dan tombol untuk meluncurkan urutan pesan yang kompleks ...Dan kemudian kami memiliki anak kedua. :)
Epilog
Jika Anda tidak ingin merusak perangkat, biasanya ada cara untuk memeriksanya tanpa membuka kasing atau menyolder kabel ke papan sirkuit. Di bawah ini tips saya jika Anda tertarik:- temukan semua informasi publik tentang perangkat: spesifikasi teknis, data komponen, foto bagian dalam, video dari pabrik ;)
- jika Anda memiliki firmware, selidiki dan cari tip tentang output eksternal;
- , ;
- GND// , ;
- ;
- , ;
- , (, );
- , Google (USB/UART/SPI/I2C/1Wire);
- , ;
, ;
- , .
github.com/alexhude!