m8-2_005.upd
), который начинается с магии PWAD. Узнаёте? Да, всё правильно, это формат Doom Patch WAD. Кажется, ребята любят классику. Формат очень хорошо документирован, так что распарсить его оказалось совсем несложно.RULES: 0x0000008C ( 3036:0x00000BDC) - описание XML LUTS: 0x00000C68 ( 183274:0x0002CBEA) GAMMA: 0x0000007C ( 31760:0x00007C10) GAIN: 0x00007C8C ( 50344:0x0000C4A8) LEICA: 0x00014134 ( 7000:0x00001B58) BLEMISH: 0x00015C8C ( 250:0x000000FA) WREF: 0x00015D88 ( 82480:0x00014230) OBJ: 0x00029FB8 ( 11268:0x00002C04) VERSION: 0x0002CBBC ( 46:0x0000002E) PXA: 0x0002D854 ( 858384:0x000D1910) BF: 0x000FF164 ( 134522:0x00020D7A) - семейство процессоров Analog Devices Blackfin GUI: 0x0011FEE0 ( 3574180:0x003689A4) TRANS: 0x0000005C ( 59988:0x0000EA54) - локализация IMAGES: 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) VERSION: 0x003689A4 ( 0:0x00000000) M16C: 0x00488884 ( 130406:0x0001FD66) - семейство Renesas M16C (Motorola S-record) FPGA: 0x004A85EC ( 131604:0x00020214) - Xilinx Spartan 3 FSL: 0x004C8800 ( 814:0x0000032E) - загрузчик первой стадии
m9-1_196.upd
) выглядит зашифрованным: гистограмма показывает распределение около 0,45%.RULES: 0x0000007C ( 2788:0x00000AE4) - описание XML LUTS: 0x00000B60 ( 4060616:0x003DF5C8) PROCESS: 0x0000004C ( 3900572:0x003B849C) CREATE: 0x0000004C ( 20:0x00000014) - метка времени LUTS: 0x00000060 ( 427744:0x000686E0) GAINMAP: 0x00068740 ( 20008:0x00004E28) LENS: 0x0006D568 ( 3452724:0x0034AF34) CCD: 0x003B84E8 ( 148662:0x000244B6) CREATE: 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) - Analog Devices Blackfin Processor family bf0: 0x0000004C ( 117846:0x0001CC56) - основной процессор bf1: 0x0001CCA4 ( 117826:0x0001CC42) - прошивка подпроцессора bf0.map: 0x000398E8 ( 27072:0x000069C0) - карта прошивки основного процессора с символами :D bf1.map: 0x000402A8 ( 26304:0x000066C0) - карта прошивки подпроцессора с символами :D BODY: 0x00426A90 ( 143280:0x00022FB0) - семейство Renesas M16C (Motorola S-record) GUI: 0x00449A40 ( 3647624:0x0037A888) TRANS: 0x0000005C ( 131656:0x00020248) - локализация IMAGES: 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) - семейство процессоров Analog Devices Blackfin (FSL?)
9D 70 C4
9D 00
9D XX YY
9D XX 8Y YY
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!
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 - данные по оптике
$ 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
0x0
.Section Name: "[A]CTRL_SYS-11"
Section offset: 14680064 | 0x00E00000
Section size: 917277 | 0x000DFF1D
Section base: 0 | 0x00000000
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
...
ana
, ins
и out
, совершенно новый код emu
умеет:ADD OR 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 AND BEORL DIV4S ST BNE DMOV ADDSP LEAVE ANDH BEORH LSL STH BC DMOVH EXTSB XCHB ANDB BTSTL LSL2 STB BNC DMOVB EXTUB
BRA:D loc_xxx LDI:8 #0x64, R5
Инструкция, которая находится сразу после инструкции ветвления (её расположение называется «слотом задержки»), выполняется перед ветвлением, а инструкция по целевому адресу выполняется после ветвления. Поскольку инструкция в слоте задержки выполняется перед операцией ветвления, видимая скорость выполнения составляет 1 цикл.
Softune — это интегрированная среда разработки Fujitsu для семейств процессоров Fujitsu FR, FR-V и F2MC. Работает на ядре реального времени REALOS µITRON. Например, используется в цифровых зеркальных камерах Nikon (см. Nikon EXPEED) и некоторых камерах Pentax с байонетом K.
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
LDI:32 #int_table, R0
MOV R0, TBR
TBR + (0x3FC - 4 × inum)
, так что вектор сброса в конце таблицы со смещением 0x3FC
.int_uart_in
. Похоже, что камера поддерживает какой-то консольный режим UART CLI.INT #0x40
. В соответствии с описанием выше это(0x3FC - 4 × inum) = (0x3FC - 4 × 0x40) = 0x2FC = int_realos_syscall
syscall_table_bottom + (num * 2)
:[syscall_table_bottom + (-23 * 2)] = [syscall_table_bottom - 0x2E] = [0x1012EA] = 0xE68
syscall_table_bottom + offset
. Весь процесс показан на диаграмме.sta_tsk
я заметил, что в качестве параметра передаётся не основная функция, а pid. Это означает, что пришло время искать большой массив дескрипторов задач. И имеет смысл начать с самого 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 ; number of tasks ROM:100B82 .word 0x1C ; task descriptor size ROM:100B84 .long 0x82A09F5C ; task 1 descriptor ROM:100B88 .long 0x1000D ROM:100B8C .long 0 ROM:100B90 .long 0x40000000 ROM:100B94 .long sub_1A7DB2 ; task main ROM:100B98 .long 0x8286EEC0 ROM:100B9C .long 0 ROM:100BA0 .long 0x82A09F88 ; task 2 descriptor ROM:100BA4 .long 0x20010 ROM:100BA8 .long 0 ROM:100BAC .long 0x40000000 ROM:100BB0 .long sub_1A6BD2 ; task main ROM:100BB4 .long 0x8287EEC0 ROM:100BB8 .long 0 ...
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
, которая отвечает за создание других задач и настройку встроенного ПО. Так что это, скорее всего, задача бездействия системы.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
}
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 and 0x77AA00xx - сообщения, связанные с переключением режимов камеры
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_GetSysTri
, что бы это ни значило. Машина состояний GUI, в основном, реализована в функции gui_Statemachine_DoStateChange
. После сбора информации о GUI сложилась общая картина: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
— ширина и высота в представлении с прямым порядком байтов (big endian). В конце этого дампа мы видим начало другой последовательности 00 06 00 14 00 01
. Скорее всего, это следующий ресурс (что подтверждается ссылкой на него). Таким образом, размер фактических данных изображения составляет 146 байт. Но размер изображения должен быть 0x8 * 0x14 = 0xA0 = 160. Ясно, что в данных не чисто пиксели и даже не 8-битная LUT, потому что она на 14 байт меньше. Тогда что? Вероятно, какое-то сжатие.03 03 03
или А1 А1 А1
. Обычно компрессор пытается избавиться от дублирования данных, заменяя их ссылкой. Эти массивы индексов идеальны для сжатия даже простым методом вроде RLE [data][number]
. Простая команда записать data
(значение) number
раз.0xFF
и 0x04
), а байт перед цветом — количество пикселей для рисования.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[];
}
.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
. Я подумал, что будет здорово сделать браузер ресурсов UI и определить все функции рендеринга страниц. Для этого предназначена опция -c
— она сооздаёт специальный контейнер для просмотра ресурсов.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
, которая реализует машину состояний сканирования кнопок. Вот как это выглядит в IDA: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
};
Legacy: Leica Extented: Production: 0x1001 - GetDeviceInfo 0x9001 - Set Camera Settings 0x9100 - Open Production Session 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
C3 3C 02 81 00 01 00 82, C3 3C 02 81 01 01 00 83, C3 3C 02 81 02 01 00 80
…help
после загрузчика. Как и ожидалось, после небольшой задержки камера повторила символы.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
выводит все возможные команды с аргументами: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
в M240PTPTool, нажмите Enter и смотрите на экран.Source: https://habr.com/ru/post/438168/