This file is a documentation for various python tools written to help reverse engineer Canon DSLR updates. Arm.Indy, feb 2013 find_fnt.py find bitmap fonts in firmware dumps find_audio_thr.py find audio threshold table ofir_tool.py dump firmware updates for 5D, 30D and 400d fir_tool2.py dump firmware updates for 1Dm3 to 6D dump_fir.py dump or extract decrypted updates content gui_strings.py parse GUI resources and extract strings gui_bitmaps.py parse GUI resources and extract bitmap icons dump_srec.py dump TX19A patches parse_prop.py parses properties stored in flash (CAMSET00.DAT) parse_tune.py parses properties stored in flash (slightly different format: FIX00.BIN, TUNE00.BIN, ...) parse_lens.py parses LENS00.BIN from 550D (with peripherical illunination correction tables only) parse_lens60.py parses LENS00.BIN from 60D (also with chromatic aberration correction) find_fnt.py ----------- See http://magiclantern.wikia.com/wiki/Fonts Usage: find_fnt.py dump_file base_offset $ python python/find_fnt.py 6d/6D_112_F0000000.bin 0xf0000000 Find bitmap fonts in Canon DSLR firmwares Arm.Indy. based on work by Pel, Trammel Hudson and A1ex 0xf03664ac: FNT 0xf03664b0: (+0x04) 0xffd8 0xf03664b2: (+0x06) font_width = 40 0xf03664b4: (+0x08) charmap_offset = 0x24 0xf03664b8: (+0x0c) charmap_size = 0x32c4 0xf03664bc: (+0x10) bitmap_size = 0x8e312 0xf03664c0: (+0x14) font name = 'HCanonGothic ///' 0xf03664d0: (+0x24) char_codes[]. 3249 chars 0xf0369794: (+0x32e8) offsets[]. Last offset value = 0x8e2dc 0xf036ca58: (+0x65ac) bitmaps[] 0xf03fad34: (+0x94888) last bitmap +0x00: bitmap width = 28 +0x02: bitmap height = 28 +0x04: char width = 36 +0x06: X offset = 4 +0x08: Y offset = 16 bitmap size = 0x70 ... find_audio_thr.py ----------------- $ python python/find_audio_thr.py 6d/1.1.2/firmware_05.bin 0x910308 0x-1 ofir_tool.py ------------ See http://chdk.setepontos.com/index.php?topic=5161.0 Usage: $ python python/ofir_tool.py firmware/5d000111.fir Fir_tool 0.6 for 5D/30D/400D (11Nov2010) fileLen = 0x4f6424 ---.fir header--- 0x000: modelId = 0x80000213, (5D, VxWorks) 0x010: version = 1.1.1 ---ciphered part (xor)--- xor_decoding [0x20-0x4f6424]... OK (0213_111_firmware.bin) 0x020: checksum = 0xe1a7fb7b 0x024: updater offset = 0x30 0x028: firmware pack offset = 0x16e4d0 0x02c: = 0x0 0x030: ---updater--- 0x16e4d0: ---firmware--- 0x16e4d0: (+0x000) firmware checksum = 0xe9f97565 0x16e4d4: 0x96e4d4 (only with 5D) 0x16e4d8: number of files in the pack = 6 0x16e4dc: offset to the file table = 0x20 (from 0x16e4d0) 0x16e4e0: header size = 0x140 (from 0x16e4d0). end of header = 0x16e610 0x16e4e4: size of file table = 0x120 0x16e4e8: size after table = 0x387e14 0x16e4cc: 0x1 (only with 5D) 0x16e4d0: (+0x020) files table +-flags-+-offset-+-length-+--name--------------------------+---??--- 0x16e4f0: 0x01 0x0002 0x000140 0x000042 MPU_FIRMWARE 0x0001f4 0x16e520: 0x02 0x0002 0x000182 0x0010a0 MPU_FIRMWARE 0x00047e 0x16e550: 0x03 0x0002 0x001222 0x018098 MPU_FIRMWARE 0x00ae4c 0x16e580: 0x04 0x0001 0x0192ba 0x35d8c0 -------- 0xf8010000 0x013880 0x16e5b0: 0x05 0x0001 0x376b7a 0x011398 -------- 0xf8780000 0x000172 0x16e5e0: 0x06 0x0002 0x387f12 0x000042 MPU_FIRMWARE 0x0001f4 0x16e610: (+0x140) end of table, first file fir_tool2.py ------------ See http://magiclantern.wikia.com/wiki/Firmware_file $ python python/fir_tool2.py firmware/6D000112.FIR Fir_tool 0.5 (20Mar2010) fileLen = 0x12fc3ec ---.fir header--- 0x000: modelId = 0x80000302, 0x010: version = 1.1.2 0x020: checksum = 0x68bb5542 0x024: updater1 header = 0xb0 0x028: updater1 offset = 0x120 0x02c: updater2 offset = 0xffffffff 0x030: firmware offset = 0x1bc2a0 0x034: 0xffffffff 0x038: embedded file size = 0x12fc3ec 0x03c: 0x0 0x040: sha1 seed = 0x11407eb6 0x044: 0x00000004 0x00000000 0x00000020 0x00000024 0x00000044 0x000000b0 0x001bc1f0 0x060: 0x1bc2a0 0x064: firmware length = 0x114014c 0x068: updater1 hmac-sha1 = b1c400446e0c8442b5b4b4e1ed0cee96bcf83e16 0x088: firmware hmac-sha1 = a0cb9878ae9141d123e1c582d23e84a5c8cce716 ---updater1 header--- 0x0b0: updater1 length = 0x1bc180. starts at 0x120 0x0b4: 0x1bc180 0x0b8: 0x0 0x0bc: xor seed value = 0xfbc57cb2 0x0c0: a55c283bbf4afb159f91bd2f57f34b24 0x0d0: 7e60b6e8abf349332144460a46e40f5580b8ea28d2e6add5c7640ccd49e1fe63 0x0f0: 12c74374370185d5b1e7578567a47e42 0x100: 84b2a1b84fc69f6e1118f410b95fe8ee7366610e5c5b804d511624068fcc90f1 0x120: --- updater1 (ciphered) --- ---firmware header--- 0x1bc2a0: (+0x000), offset to decryption data = 0xc 0x1bc2a4: (+0x004), offset to encrypted data = 0x7c. starts at 0x1bc2a0 0x1bc2a8: (+0x008), total firmware length (including header) = 0x114014c. starts at 0x1bc2a0 - 0x1bc2ac: (+0x00c), firmware length (encrypted part) = 0x11400d0. starts at 0x1bc31c 0x1bc2b0: (+0x010), 0x011400cc 0x1bc2b4: (+0x014), 0x0 0x1bc2b8: (+0x018), 0x37a70ca5 0x1bc2bc: (+0x01c), 035d7a42d6e68d83966336b70d1bcfd3 0x1bc2cc: (+0x02c), 52b53cc66e42f23edf74c736aee5d8105cb94cbb78a28213a21c3262eb7a6941 0x1bc2ec: (+0x04c), b98705d2282574e5029f826d1b04f402 0x1bc2fc: (+0x05c), 7e02b6a079024faaa54bd0486ebfb69328c17f548dd7c3f07a4570a150afb82f ---firmware (encrypted)--- 0x1bc31c: (+0x07c) dump_fir.py ----------- See http://magiclantern.wikia.com/wiki/Update_records $ python python/dump_fir.py -v 6d/1.1.2/0302_112_firmware.bin Dump_fir 0.5 (22dec2012) fileLen = 0x11400d0 0x000: checksum = 0x979dc27a 0x004: 0x00000000 0x008: 0x00000002 0x00c: 0x00000000 0x010: nb_record = 0x5 0x014: table_offset = 0x20 0x018: record_size = 0x18 0x01c: size_after = 0x1140034 0x020: ---patches table--- + tag + foffset + size + moffset + ? -------------------------------------------------------- 0x01: 0x0200 0x00000098 0x00000000 0x00000000 0x000002bc 0x02: 0x0200 0x00000098 0x00000000 0x00000000 0x0000add4 0x03: 0x0100 0x00000098 0x00095760 0xf00c0000 0x00000bb8 0x04: 0x0100 0x000957f8 0x004138ec 0xf0240000 0x00003a98 0x05: 0x0100 0x004a90e4 0x00c96fe8 0xf80c0000 0x00018a88 0x098: ---patch#1--- $ python python/dump_fir.py -x 5 6d/1.1.2/0302_112_firmware.bin Dump_fir 0.5 (22dec2012) fileLen = 0x11400d0 0x000: checksum = 0x979dc27a 0x004: 0x00000000 0x008: 0x00000002 0x00c: 0x00000000 0x010: nb_record = 0x5 0x014: table_offset = 0x20 0x018: record_size = 0x18 0x01c: size_after = 0x1140034 0x020: ---patches table--- + tag + foffset + size + moffset + ? -------------------------------------------------------- 0x01: 0x0200 0x00000098 0x00000000 0x00000000 0x000002bc 0x02: 0x0200 0x00000098 0x00000000 0x00000000 0x0000add4 0x03: 0x0100 0x00000098 0x00095760 0xf00c0000 0x00000bb8 0x04: 0x0100 0x000957f8 0x004138ec 0xf0240000 0x00003a98 0x05: 0x0100 0x004a90e4 0x00c96fe8 0xf80c0000 0x00018a88 0x098: ---patch#1--- writing firmware_05.bin [0x4a90e4-0x11400cc]. size=0xc96fe8/13201384 gui_strings.py -------------- See http://magiclantern.wikia.com/wiki/GUI_Resources to parse strings from GUI resources (update record 4 in update 2.1.1 of 5dm2): python gui_strings.py 5dm2/2.1.1/firmware_04.bin |less 0x00000018: strings_data at 0x000c8c40 0x000c8c44: nb_lang=0x00000019 0x000c8c48: nb_offset=0x00000673 end=0x000ca61c 0x000c8c4c: 0x0000 0x000019d8 (delta=0x000019d8) 0xca618 English 0x000c8c50: 0x0001 0x00001ab3 (delta=0x000000db) 0xca6f3 English 0x000c8c54: 0x0002 0x00001bc8 (delta=0x00000115) 0xca808 LEFT 0x000c8c58: 0x0003 0x00001c46 (delta=0x0000007e) 0xca886 OK 0x000c8c5c: 0x0004 0x00001caf (delta=0x00000069) 0xca8ef OK 0x000c8c60: 0x0005 0x00001d21 (delta=0x00000072) 0xca961 Cancel 0x000c8c64: 0x0006 0x00001e11 (delta=0x000000f0) 0xcaa51 Erase 0x000c8c68: 0x0007 0x00001edc (delta=0x000000cb) 0xcab1c Quality 0x000c8c6c: 0x0008 0x00001fe5 (delta=0x00000109) 0xcac25 Beep 0x000c8c70: 0x0009 0x00002118 (delta=0x00000133) 0xcad58 On 0x000c8c74: 0x000a 0x000021aa (delta=0x00000092) 0xcadea Off 0x000c8c78: 0x000b 0x00002238 (delta=0x0000008e) 0xcae78 Shoot w/o card 0x000c8c7c: 0x000c 0x0000242f (delta=0x000001f7) 0xcb06f On 0x000c8c80: 0x000d 0x000024be (delta=0x0000008f) 0xcb0fe Off 0x000c8c84: 0x000e 0x00002558 (delta=0x0000009a) 0xcb198 WB SHIFT/BKT 0x000c8c88: 0x000f 0x0000271a (delta=0x000001c2) 0xcb35a SHIFT 0x000c8c8c: 0x0010 0x000027ee (delta=0x000000d4) 0xcb42e BKT 0x000c8c90: 0x0011 0x000028ab (delta=0x000000bd) 0xcb4eb Clear all 0x000c8c94: 0x0012 0x00002a11 (delta=0x00000166) 0xcb651 Custom WB 0x000c8c98: 0x0013 0x00002c2a (delta=0x00000219) 0xcb86a Custom WB regist. 0x000c8c9c: 0x0014 0x00002e60 (delta=0x00000236) 0xcbaa0 Correct WB may not be obtained 0x000c8ca0: 0x0015 0x0000320b (delta=0x000003ab) 0xcbe4b with the selected image 0x000c8ca4: 0x0016 0x0000351e (delta=0x00000313) 0xcc15e Use WB data from this image ... 0x000ca604: 0x066e 0x000b51bc (delta=0x000000b5) 0x17ddfc RELEASE 0x000ca608: 0x066f 0x000b5283 (delta=0x000000c7) 0x17dec3 CF PLAY 0x000ca60c: 0x0670 0x000b5352 (delta=0x000000cf) 0x17df92 SD PLAY 0x000ca610: 0x0671 0x000b5421 (delta=0x000000cf) 0x17e061 Fail 0x000ca614: 0x0672 0x000b549e (delta=0x0000007d) 0x17e0de UNIT 0x000ca618: 0x0673 0x000b551a (delta=0x0000007c) 0x17e15a 0x0017e15a: 0x00000020: dialogs_data at 0x0017e178 0x0017e17c: nb_dialogs = 0x00000001 0x0017e178: nb_dialogs = 0x00000001 0x0017e17c: 0x00000001 0x00000784 delta=0x0784 0x17e8fc 010000000100010002000000434f4d4d4f4e0000000000000200000028000040 380000000000c0031c0200000000c0031c0200000000000000000000000000000000000001000002444c475f5243200011000202aa00e2006c022800 0009010401000000000a03040100004001000000010006000c000000434f4d4d4f4e0000000000000000000002000040380000000000d002e0010000 0000d002e00100000000000000000000000000000000000000000001444c475f524320000100020232001a0128002800000400040000000000090304 010000400100020332005a0128002800000400040000000000090304010000400100020432009a012800280000040004000000000009030401000040 gui_bitmaps.py -------------- python gui_bitmaps.py 5dm2/2.1.1/firmware_04.bin nb_records=6, filesize= 0x001c78bc 0x00000008: 0x00000038 0x0004e93c 0x00000010: 0x0004e974 0x0007a2cc 0x00000018: 0x000c8c40 0x000b5538 0x00000020: 0x0017e178 0x00047f48 0x00000028: 0x001c60c0 0x00000f68 0x00000030: 0x001c7028 0x00000894 0x00000038: nb_bitmaps = 0x0000047d 0x0000003c: 0x10000001 0x00002424 delta=0x0000, 52 26 5 00f3 00091819ed8f41124321 1352 0x00000044: 0x10000002 0x00002524 delta=0x0100, 48 24 5 00ce 00091819d54f410ec330 1152 0x0000004c: 0x10000003 0x00002600 delta=0x00dc, 48 24 5 00ce 00091819d54f410ec330 1152 0x00000054: 0x10000004 0x000026dc delta=0x00dc, 52 26 3 00a9320100323d0101013d01 1352 0x0000005c: 0x10000005 0x00002758 delta=0x007c, 48 24 3 00cc2902002d2f0134022f01 1152 0x00000064: 0x10000006 0x000027c8 delta=0x0070, 48 24 3 00cc3202002d3d0101023d01 1152 0x0000006c: 0x10000007 0x00002838 delta=0x0070, 52 26 5 00c5 00091819c54f5b0ec330 1352 0x00000074: 0x10000008 0x0000290c delta=0x00d4, 48 24 5 00b5 00091819b58f4b128430 1152 ... 0x000023f4: 0x00000478 0x0004e3b8 delta=0x006c, 40 20 7 0063 00091819458db1098040 120 0x000023fc: 0x00000479 0x0004e428 delta=0x0070, 40 40 7 006f 000918196dccb10d0231 200 0x00002404: 0x0000047a 0x0004e4a4 delta=0x007c, 160 160 7 01c0 00091819ed8fb1b1c320 3200 0x0000240c: 0x0000047b 0x0004e670 delta=0x01cc, 160 160 7 01db 00091819ed8fb16dc430 3200 0x00002414: 0x0000047c 0x0004e858 delta=0x01e8, 40 40 7 0084 00091819658e3d0ac330 200 0x0000241c: 0x0000047d 0x0004e8e8 delta=0x0090, 40 40 7 007e 0009181965ce410ac320 200 to extract icons: python gui_bitmaps.py -x 5dm2/2.1.1/firmware_04.bin dump_srec.py ------------ See http://magiclantern.wikia.com/wiki/Update_records $ python dump_srec.py 0218_209_01.bin Dump Canon SRec, v0.5 k218_eep.mot 487 bytes, 0x2000-0x2370 k218_eep.mot 325 bytes, 0x20c-0x7f0 k218_eep.mot 2 bytes, 0x7f0-0x7f0 k218_eep.mot 211 bytes, 0x1204-0x1a10 parse_prop.py ------------- See http://magiclantern.wikia.com/wiki/Properties and https://groups.google.com/forum/?fromgroups=#!topic/ml-devel/-BP-GfnJgT0 $ python parse_prop.py 550d_my/1.0.9/CAMSET00.DAT 138048 0x00000: 0x02000000, 4, ffff0000 0x0000c: 0x02000001, 16, 312e302e390035342830312900000000 0x00024: 0x02000002, 4, 00000000 0x00030: 0x02000003, 4, ffffffff 0x0003c: 0x02000004, 32, 0000000000000000000000000000000000000000000000000000000000000000 0x00064: 0x02000005, 16, 342e332e362035342830312900000000 0x0007c: 0x02000006, 8, 0603040001000054 0x0008c: 0x02000007, 16, 302e302e300000000000000000000000 0x000a4: 0x02010000, 4, 8e000000 0x000b0: 0x02010001, 4, 64000000 0x000bc: 0x02010002, 4, 64000000 0x000c8: 0x02010003, 4, 00000000 0x000d4: 0x02010004, 4, 65260000 ... 0x18828: 0x02090000, 4, 01000000 0x18834: 0x0e070000, 64, 2d000072656e7420434c4556590000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000 0x1887c: 0x0e070001, 64, 2d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000 0x188c4: 0x0b000000, 36272, d80e1c00300080000000000000000000200040031000000000000000000000000000000000000000000000000000 0000f600000000000000e700000070030000a0000000e0060000e6000000500a0000b0000000c00d0000ed0000003011000029000000a01400002e00 0000a0140000e4000000101800009c00000010180000... 0x2167c: 0x8003001f, 1210, 65284b38000000030000000000330000000168300000010001ff00010000000000010000000000000000000004000 000010000000000000002000001036598103800000000000000010000000000000000020001000000000001000000000000000000000400000001000 0000000000000000000010200000100000001ff0600... parse_tune.py ------------- $ python parse_tune.py 550d_my/1.0.9/FIX00.BIN 0x18 filesize=262144/0x40000 offset=24/0x18 0x00018: 0x00000000, 4, 80000000 0x00024: 0x00000001, 4, 00000000 0x00030: 0x00000002, 484, 43616e6f6e20454f53204b69737320583400000000000000000000000000000070020080ea310000e0140000c00d0 000e0140000bc0d0000e0140000bc0d0000300f0000200a0000200a0000c0060000300f0000200a0000200a0000c006000040140000800d0000800d0 0000009000000000000000000000000000000000000... 0x0021c: 0x00000004, 160, 0d009000b3006600a80084000200a800b40075000b00a80082000000c6007b000100a3001d00a300f100560089005 7009b00540095005b00ae00440081004d0088004d0098004e00ab004e00a3004e00b1004b00bf004a00a4003a00ac003a008f0044008c003800b9003 d00860045000a0088001a006900ad004300a9006900... 0x002c4: 0x00000005, 8, 43414e4f4e000000 0x002d4: 0x00000006, 20, 900005002800030061006100e8030000f3000000 $ python parse_tune.py 550d_my/1.0.9/TUNE00.BIN 0x18 filesize=1048576/0x100000 offset=24/0x18 0x00018: 0x01000000, 4, ffffffff 0x00024: 0x01000001, 4, feafdcba 0x00030: 0x01000008, 16, 344b0fef46e9a629f1d304e2eb6484ff 0x00048: 0x01000002, 16, 56413036323231353200000000000000 0x00060: 0x01000003, 4, cc100000 0x0006c: 0x01000004, 4, 420e0000 0x00078: 0x01000006, 4, 8c219c31 0x00084: 0x01000007, 8, 494d475f00000000 0x00094: 0x01000009, 4, 00000000 0x000a0: 0x0100000a, 4, 00000000 0x000ac: 0x0100000b, 8, 640cfbb42b200e1a 0x000bc: 0x0100000c, 20, 5ed9baa83543b5bafce3fbb58db665a08e9ed89b 0x000d8: 0x01000011, 44, 1a00000056f71b00fb010000dde396005d040200130000200000000000000000499f06ff280000000d000700 0x0010c: 0x01000012, 4, ffffffff 0x00118: 0x0100000e, 4, 00000000 0x00124: 0x0100000f, 16, 0e0c030000000000000000001d000000 0x0013c: 0x01000010, 32, 43616e6f6e20454f532035353044000000000000000000000000000000000000 $ python 550d/parse_tune.py 550d_my/1.0.9/RASEN00.BIN 0x20018 filesize=393216/0x60000 offset=131096/0x20018 0x20018: 0x05010000, 24, 180000000000000000000000000000000100000001000000 0x20038: 0x05010001, 544, 000000006c00000001000000c0a80102ffffff0000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000006c00000001000000c0a80102ffffff00... 0x20260: 0x05010002, 2204, 00000000b8010000c0a801143139322e3136382e312e3230000000000000000000000000000000000000000000000 000616e6f6e796d6f75730000000000000000000000000000000000000000000000000000007766742d654063616e6f6e2e636f2e6a7000000000000 0000000000000000000000000002f00000000000000... $ python 550d/parse_tune.py 550d_my/1.0.9/RING00.BIN 0x18 filesize=131072/0x20000 offset=24/0x18 0x00018: 0x02000000, 4, ffff0000 0x00024: 0x02000001, 16, 312e302e390035342830312900000000 0x0003c: 0x02000005, 16, 342e332e362035342830312900000000 0x00054: 0x02000002, 4, 00000000 0x00060: 0x02000003, 4, ffffffff 0x0006c: 0x02000004, 32, 0000000000000000000000000000000000000000000000000000000000000000 0x00094: 0x02000006, 8, 0603040001000054 0x000a4: 0x02000007, 16, 302e302e300000000000000000000000 parse_lens.py ------------- python parse_lens.py 550d/1.0.9/LENS00.BIN see http://cpn.canon-europe.com/content/education/masterclass/peripheral_illumination_correction.do see http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html#LensType call sub_ff019f70 in 550d 109 see https://groups.google.com/forum/?fromgroups=#!searchin/ml-devel/lens00/ml-devel/YLplVVQIhVA/V_VeB85CojwJ see https://groups.google.com/forum/?fromgroups=#!searchin/ml-devel/lens00/ml-devel/-BP-GfnJgT0/5MKdruttlnsJ filesize=196608 base=1104/0x450 Lens_id= 246, offset=0x450 16-35 000001 0010 0023 00180100000000000000000000000000000000000000000000 1000 1400 1900 2300 f30d4d09a60400000000 f502ea055a0ad40bff0f 1c0028003900e200 ff1f9c1ff71e18190a140b04 ff1f671fc01d2e19f5165907 ff1f6e1fb51d31193d17050b ff1f711fb61d25192d172a11 ff1faa1fb01e7c18c7137a04 ff1f681fbf1d2e19fa160408 ff1f6e1fb51d32193f17e00b ff1f711fb61d27192e172611 ff1fbf1f841efa177a13af04 ff1f681fbf1d3019fe164908 ff1f6e1fb61d331940173e0c ff1f711fb61d281930172311 ff1fc91f5c1ea2174d13cc04 ff1f671fbf1d341901176e08 ff1f6e1fb61d34194017750c ff1f711fb71d291931172111 1c0028003900e200 ff1ff21f781eef183516380b ff1f831f081e2a1a8718f60f ff1f821f041e0d1a50181212 ff1f841f041efc193718a612 ff1fec1f391e21183415f40a ff1f821f091e261a7818bf0f ff1f821f041e0d1a50180212 ff1f841f041efc193618a312 ff1fe81f0c1e9c17ab14b90a ff1f841f081e2a1a8818c00f ff1f821f041e0d1a5018ff11 ff1f841f041efc193718a212 ff1ff01ff31d431749148d0a ff1f841f081e2a1a8818b30f ff1f821f051e0d1a5018fe11 ff1f841f041efc193718a212 1c0028003900e200 ff1fd61f561d0c17bc14e10c ff1fa21f8c1e9b1b4b1aad13 ff1fa21f871e861b2e1a9c15 ff1fa31f871e791b181a8115 ff1fce1f221d75160214290c ff1fa31f8c1e9d1b4d1a5313 ff1fa21f871e871b2f1a9615 ff1fa31f871e791b181a8015 ff1fc91fff1c1c169313b90b ff1fa31f8d1e9d1b4e1acf12 ff1fa21f881e881b301aa415 ff1fa31f881e791b181a7e15 ff1fc91fe81cd4153313530b ff1fa31f8d1e9e1b4e1a7e12 ff1fa21f881e881b301a9a15 ff1fa31f871e791b181a7d15 1c0028003900e200 ff1f531e471b7a158013390b ff1fbf1f131f1f1d121c1513 ff1fc31f101f261d4a1ca918 ff1fc51f141f2b1d4c1c4019 ff1ffd1dc41ad614c6128a0a ff1fb81f1d1f141dc71b4112 ff1fc31f101f281d4c1c8618 ff1fc51f141f2b1d4b1c3f19 ff1fc81d7a1a791465120f0a ff1fb81f211ff91c9e1bbe11 ff1fc31f111f291d4d1c5518 ff1fc51f141f2b1d4b1c3e19 ff1f9e1d401a36141412b009 ff1fb81f231fef1c8b1b5d11 ff1fc41f111f2a1d4e1c4218 ff1fc51f141f2b1d4b1c3e19 444444440000000000000000000000001a010000 Lens_id= 231, offset=0x7c0 17-40 000001 0011 0028 00180100000000000000000000000000000000000000000000 1100 1500 1c00 2800 f30d4d09a60400000000 7004df08920cca0eff0f 280039005000e200 ... parse_lens60.py --------------- python parse_lens60.py 60d/1.0.9/LENS00.BIN filesize=393216 base=2128/0x850 Lens_id= 246, offset=0x850 16-35 000001 0010 0023 00180100000000000000000000000000000000000000000000 1000 1400 1900 2300 f30d4d09a60400000000 f502ea055a0ad40bff0f 1c0028003900e200 ff1f9c1ff71e18190a140b04 ff1f671fc01d2e19f5165907 ff1f6e1fb51d31193d17050b ff1f711fb61d25192d172a11 ff1faa1fb01e7c18c7137a04 ff1f681fbf1d2e19fa160408 ff1f6e1fb51d32193f17e00b ff1f711fb61d27192e172611 ff1fbf1f841efa177a13af04 ff1f681fbf1d3019fe164908 ff1f6e1fb61d331940173e0c ff1f711fb61d281930172311 ff1fc91f5c1ea2174d13cc04 ff1f671fbf1d341901176e08 ff1f6e1fb61d34194017750c ff1f711fb71d291931172111 1c0028003900e200 ff1ff21f781eef183516380b ff1f831f081e2a1a8718f60f ff1f821f041e0d1a50181212 ff1f841f041efc193718a612 ff1fec1f391e21183415f40a ff1f821f091e261a7818bf0f ff1f821f041e0d1a50180212 ff1f841f041efc193618a312 ff1fe81f0c1e9c17ab14b90a ff1f841f081e2a1a8818c00f ff1f821f041e0d1a5018ff11 ff1f841f041efc193718a212 ff1ff01ff31d431749148d0a ff1f841f081e2a1a8818b30f ff1f821f051e0d1a5018fe11 ff1f841f041efc193718a212 1c0028003900e200 ff1fd61f561d0c17bc14e10c ff1fa21f8c1e9b1b4b1aad13 ff1fa21f871e861b2e1a9c15 ff1fa31f871e791b181a8115 ff1fce1f221d75160214290c ff1fa31f8c1e9d1b4d1a5313 ff1fa21f871e871b2f1a9615 ff1fa31f871e791b181a8015 ff1fc91fff1c1c169313b90b ff1fa31f8d1e9d1b4e1acf12 ff1fa21f881e881b301aa415 ff1fa31f881e791b181a7e15 ff1fc91fe81cd4153313530b ff1fa31f8d1e9e1b4e1a7e12 ff1fa21f881e881b301a9a15 ff1fa31f871e791b181a7d15 1c0028003900e200 ff1f531e471b7a158013390b ff1fbf1f131f1f1d121c1513 ff1fc31f101f261d4a1ca918 ff1fc51f141f2b1d4c1c4019 ff1ffd1dc41ad614c6128a0a ff1fb81f1d1f141dc71b4112 ff1fc31f101f281d4c1c8618 ff1fc51f141f2b1d4b1c3f19 ff1fc81d7a1a791465120f0a ff1fb81f211ff91c9e1bbe11 ff1fc31f111f291d4d1c5518 ff1fc51f141f2b1d4b1c3e19 ff1f9e1d401a36141412b009 ff1fb81f231fef1c8b1b5d11 ff1fc41f111f2a1d4e1c4218 ff1fc51f141f2b1d4b1c3e19 444444440000000000000000000000001a010000 a60400000000 7004df08920cca0eff0f 0840bd3eb73cd33abb392c39 0f40de3e2f3db73beb3a893a 1040f03e773d453cad3b6a3b 1040fc3ea83da73c343c073c f53f263fe53dee3c883c683c fa3f3b3f323e883d603d653d fb3f473f613eea3deb3d0a3e fb3f4f3f813e2e3e4c3e7e3e da3f8c3f173f053f443f873f e43f9c3f403f5a3fc13f1d40 e43fa23f593f903f10407d40 e33fa73f6b3fb63f4840c040 b03fa63fb13f11408c40e840 da3fd83fed3f5d40e7404e41 da3fdb3ff73f744009417741 d93fde3fff3f854021419541 33333333 1000 1400 1900 2300 f30d4d09a60400000000 7004df08920cca0eff0f 1c0039007100e200 00400040ae3fc541b83f8243923e9346d83cb749763bf74b 00400040c33fce411740fb420c3fcd45373d2149b43ba44b 00400040ca3fc1412c40ba424e3f8245ad3df648503c9c4b 00400040d23fb7413440aa424d3f7245a13de9483c3c914b 004000400d40c94023406b4104408143c73f0746943ff047 004000402a400a4124410941ed40b942c43f5e45ad3e8547 00400040344003415541e8402c418742f13f2a45c53e5447 004000404140f7409441db407d41784231401845ef3e3e47 00400040624017404941f43f3c415a416c407543a43f2245 00400040804089401842e23f4e42d3403d41e6422140b244 004000408e4089405942d33fb742af40b241b24297407444 004000409d407d407b42bf3ff8429b401142a3420a416a44 00400040a7400e400a42b23f60425040b8418741fc408d42 00400040bf404040bc42993f6b43f33fb7421f41d4413142 00400040d6403c400a432b3fcf43823f0d430b4116427842 00400040e34032402143053f0244573f6043f14082427142 1c0039007100e200 00400040243f0c42ef3ed643563ecb45773d6a47c13c7d48 00400040443f4342513fb843f13e65452a3efc467d3d1f48 00400040543f4542593f9843113f2445783eaf46f23dcf47 004000404a3f3e42573f8043263f1145a43eb1462d3ee447 00400040e63fe6400940d741f13f1e43a73f4644653f1045 00400040d13f90411f40f9413940ad420740b443cd3f8e44 00400040c93f90416640f341ba4084428c40604345401944 00400040cc3f8b417f40e541f9406842ec403643ba40e443 004000400e402f4097408040e2403641cf40f441a7407d42 00400040ed3fff40fb40cd40bc41dd40c74169419941f541 004000400e4006413e41cf403142c2406b422b415d429f41 0040004016400e415541ce406342ad40b7420441bb426b41 004000403e4009404341ee3f0d420b4044424f403f428b40 004000400d40854064412440a442e13f2543024045433b40 004000403b409d40c24120402943bc3fc143d13fee430740 004000404f40b140df41144055438f3fff439a3f3944d13f 1c0039007100e200 00400040d23e02427d3ef843223e2345a13d7b45353d8545 00400040ef3e8542663e3044803e0345db3e4a45273f6045 00400040e23e7c425d3e3a44443e3c45513eb1455e3ee745 00400040d43e7f42473e3b44083e5d45e23d0246c83d5f46 00400040cb3fc240a53fd241b93fbc42e93f384313407343 00400040483fa741603f9742c13fef420140fd421f40fb42 00400040493fc441653fbd42c63f0843024002431d40f142 004000404e3fcd41613fc242c43f00430a40f0422f40d942 00400040ed3f3e402a409b40a640d9401441e9405c41e840 00400040c83f134116406741a6403a411841f8405d41c940 00400040b13f2d4114409841d9405a417941f140dc41a340 00400040a83f49411640b541f7406441b241e94027428f40 00400040ee3f0a408f4007409841fb3f6d42f13ff242eb3f 00400040ee3fc2407740bf40824149407142dc3f1043983f 00400040e73fc9407940ba40a6412c40ba42ac3f74435c3f 00400040e43ff0408f40ec40ce414140e342983f9743293f 1c0039007100e200 00400040c03fc5400e3fc041483efc42c93d0144843dab44 00400040fe3ed341a33e3a425f3ebd420f3e9543ce3d5044 00400040e83edd416f3e4243233ef243dd3d1a44a73d1844 00400040ce3e0c42fb3db9438e3da544663dee44583dfb44 00400040c83f5640e93f76400a4099400940c640fe3fe940 004000408b3f0241b03f3b41f23f1e410b4006410d40fd40 00400040633f5641583fef41a33fe941ea3fb04118408141 00400040573f5d411b3f35425b3f4842bf3ff8410c40ab41 00400040f13ff63f1e401540bb40e83f6841893fe441373f 00400040f23f634018406740af4010405b41ae3fd941693f 00400040c73fc440ee3ff1408e4081403841ef3fb041853f 00400040b53fe040df3f24418a40b7403e411c40bc41a93f 00400040fd3f0140a240fa3fbe41433faf424b3e4a438b3d 00400040ee3f0540664000407e41503f8f42603e4b43a53d 00400040f03f3c405040354058417f3f6a42983e2b43ea3d 00400040f33f7340594068406341963f72429c3e3043e33d 22222222 Lens_id= 231, offset=0x12e0 17-40 000001 0011 0028 00180100000000000000000000000000000000000000000000 1100 1500 1c00 2800 f30d4d09a60400000000 7004df08920cca0eff0f 280039005000e200 ...