WSW Header
Aus M740 WikiWeb
Inhaltsverzeichnis |
Einleitung
Siemens verteilt die Firmware in Dateien mit der Endung WSW. Daher werden die Dateien auch als WSW Dateien bezeichnet. Dieser Artikel befasst sich nun mit dem Aufbau des Kopfes dieser WSW Dateien.
Aufbau des WSW Headers
Das folgende C-struct beschreibt den Aufbau eines WSW Headers, der immer 1416 Bytes lang ist:
struct wsw_header // big-endian
{
char magic[4]; // Magic: 'WSW '
uint16 md5sum_len_1; // ?? Länge der [[MD5]]-Ausgabe inkl. LF
uint16 rsa_len_1; // Länge der 1. RSA Prüfsumme
uchar rsa_1[0x038]; // 1. [[RSA Prüfsumme]] (ab FW 1.12.1)
uint16 md5sum_len_2; // ?? Länge der [[MD5]]-Ausgabe inkl. LF
uint16 rsa_len_2; // Länge der 2. RSA Prüfsumme
uchar rsa_2[0x3bc]; // 2. [[RSA Prüfsumme]] (ab FW 1.29.5)
// MD5SUM wird ab hier bis zum Dateiende berechnet (Adresse 0x400)
char box_name[64]; // Name der Box: 'M740AV'
char upd_name[60]; // Name des Updates, z.B.: '1.18small'
char unknown[4]; // ???
time_t timestamp; // (Erstellungs-) Datum
uint32 num_of_pages; // Anzahl der Pages im Update
uchar page_map[256]; // die Page-Map
};
RSA Prüfsummen
An Adresse 0x006 befindet sich ein zwei Byte Wort mit der Anzahl der Bytes der RSA Prüfsumme. Dieser Wert ist bisher immer 44. Daher folgen auch 44 Bytes dieser Prüfsumme. Werden diese 44 Bytes dem Programm rsadecode mit dem Schlüssel /etc/.rsapublic via stdin übergeben, dann erfolgt eine stdout Ausgabe der MD5SUM. Die MD5SUM wird dabei ab Adresse 0x400 berechnet.
Ab FW 1.29.5 wurde offensichtlich eine zweite RSA Prüfsumme mit wesentlich längeren Schlüssel eingebaut. Diese 2. Prüfsumme befindet sich ab Adresse 0x040. In der FW 1.29.5 selbst wurden beide Schlüsselfelder belegt, so dass die Firmware von den bisherigen und auch von den zukünftigen Firmware-Versionen eingespielt werden kann. Test haben ergeben, dass die FW 1.29.5 keine alten FW-Versionen als Update mehr akzeptiert, aber sich selbst. Modifiziert man jedoch die zweite RSA Prüfsumme, damit sie ungültig wird, dann akzeptiert sich die FW 1.29.5 auch nicht mehr selbst.
Der Artikel »Firmware Update« beschäftigt sich noch detailierter mit diesem Thema.
Flash-RAM mapping
Ab Adresse 0x488 befindet sich ein 256 Byte großes Feld, welches eine Art Mapping beschreibt. Für jede dem WSW-Header folgende Page (64K) gibt es eine Index-Eintrag, in welche Flash-RAM-Page sie geschrieben werden soll.
Der 4-Byte-Wert ab Adresse 0x484 gibt dabei die Anzahl der Pages im Update an.
Gegenüberstellung FW 1.12.1 und FW 1.18
Hier eine Hexdump-Gegenüberstellung der WSW-Header der beiden ersten öffentlichen Firmware-Versionen:
[[FW 1.12.1]]new2.wsw [[FW 1.18]]small.wsw
----------------------------------------------------------
000: 57 53 57 20 :WSW : 57 53 57 20 :WSW : WSW-Kennung
004: 00 24 :.$: 00 24 :.$: ?? Länge der MD5SUM-Ausgabe inkl. LF
006: 00 2c :.,: 00 2c :.,: Länge der RSA Prüfsumme
008: ec 4a 6b 75 :lJku: 96 ab b8 20 :.+8 : [[RSA Prüfsumme]]
00c: ef 58 7d f1 :oX}q: bd 01 c6 d9 :=.FY:
010: af 51 40 df :/Q@_: 2e 3b 40 6e :.;@n:
014: e6 13 83 66 :f..f: b3 12 d3 d5 :3.SU:
018: 66 a0 01 55 :f .U: 60 5d d7 d0 :`]WP:
01c: 13 00 9a 9e :....: c6 30 85 c6 :F0.F:
020: a2 3a 6d 66 :":mf: 92 8f 99 79 :...y:
024: a8 2f f0 e3 :(/pc: 91 39 4f 5b :.9O[:
028: 40 a1 ab 10 :@!+.: 40 45 51 d1 :@EQQ:
02c: df 42 ea 1e :_Bj.: 80 96 a1 47 :..!G:
030: 0d a6 3c 00 :.&<.: e9 8f b3 00 :i.3.:
034: 00 00 00 00 :....: 00 00 00 00 :....:
.... (alles 00)
3fc: 00 00 00 00 :....: 00 00 00 00 :....:
Ab hier wird die [[MD5] berechnet!
400: 4d 37 34 30 :M740: 4d 37 34 30 :M740: Name der Box
404: 41 56 00 00 :AV..: 41 56 00 00 :AV..:
408: 00 00 00 00 :....: 00 00 00 00 :....:
.... (alles 00)
43c: 00 00 00 00 :....: 00 00 00 00 :....:
440: 31 2e 31 32 :1.12: 31 2e 31 38 :1.18: Name des Updates
444: 2e 31 6e 65 :.1ne: 73 6d 61 6c :smal:
448: 77 32 00 00 :w2..: 6c 00 00 00 :l...:
44c: 00 00 00 00 :....: 00 00 00 00 :....:
.... (alles 00)
478: 00 00 00 00 :....: 00 00 00 00 :....:
47c: 38 95 ce 53 :8.NS: 67 00 b6 0f :g.6.: ??? Dieser Teil ist mir noch unklar!
480: 41 9d 9b 8e :A...: 41 bb 31 ad :A;1-: (Erstellungs-)Datum (time_t)
484: 00 00 00 fc :...|: 00 00 00 c8 :...H: Längenangabe in Pages (64K)
488: 00 01 02 03 :....: 00 01 02 03 :....: ab hier: Mapping
48c: 04 05 06 07 :....: 04 05 06 07 :....:
490: 08 09 0a 0b :....: 08 09 0a 0b :....:
494: 0c 0d 0e 0f :....: 0c 0d 0e 0f :....:
498: 10 11 12 13 :....: 10 11 12 13 :....:
49c: 14 15 16 17 :....: 14 15 16 17 :....:
4a0: 18 19 1a 1b :....: 18 19 1a 1b :....:
4a4: 1c 1d 1e 1f :....: 1c 1d 1e 1f :....:
4a8: 20 21 22 23 : !"#: 20 21 22 23 : !"#:
4ac: 24 25 26 27 :$%&': 24 25 26 27 :$%&':
4b0: 28 29 2a 2b :()*+: 28 29 2a 2b :()*+:
4b4: 2c 2d 2e 2f :,-./: 2c 2d 2e 2f :,-./:
4b8: 30 31 32 33 :0123: 30 31 32 33 :0123:
4bc: 34 35 36 37 :4567: 34 35 36 37 :4567:
4c0: 38 39 3a 3b :89:;: 38 39 3a 3b :89:;:
4c4: 3c 3d 3e 3f :<=>?: 3c 3d 3e 3f :<=>?:
4c8: 40 41 42 43 :@ABC: 40 41 42 43 :@ABC:
4cc: 44 45 46 47 :DEFG: 44 45 46 47 :DEFG:
4d0: 48 49 4a 4b :HIJK: 48 49 4a 4b :HIJK:
4d4: 4c 4d 4e 4f :LMNO: 4c 4d 4e 4f :LMNO:
4d8: 50 51 52 53 :PQRS: 50 51 52 53 :PQRS:
4dc: 54 55 56 57 :TUVW: 54 55 56 57 :TUVW:
4e0: 58 59 5a 5b :XYZ[: 58 59 5a 5b :XYZ[:
4e4: 5c 5d 5e 5f :\]^_: 5c 5d 5e 5f :\]^_:
4e8: 60 61 62 63 :`abc: 60 61 62 63 :`abc:
4ec: 64 65 66 67 :defg: 64 65 66 67 :defg:
4f0: 68 69 6a 6b :hijk: 68 69 6a 6b :hijk:
4f4: 6c 6d 6e 6f :lmno: 6c 6d 6e 6f :lmno:
4f8: 70 71 72 73 :pqrs: 70 71 72 73 :pqrs:
4fc: 74 75 76 77 :tuvw: 74 75 76 77 :tuvw:
500: 78 79 7a 7b :xyz{: 78 79 7a 7b :xyz{:
504: 7c 7d 7e 7f :|}~.: 7c 7d 7e 7f :|}~.:
508: 80 81 82 83 :....: 80 81 82 83 :....:
50c: 84 85 86 87 :....: 84 85 86 87 :....:
510: 88 89 8a 8b :....: 88 89 8a 8b :....:
514: 8c 8d 8e 8f :....: 8c 8d 8e 8f :....:
518: 90 91 92 93 :....: 90 91 92 93 :....:
51c: 94 95 96 97 :....: 94 95 96 97 :....:
520: 98 99 9a 9b :....: 98 99 9a 9b :....:
524: 9c 9d 9e 9f :....: 9c 9d 9e 9f :....:
528: a0 a1 a2 a3 : !"#: a0 a1 a2 a3 : !"#:
52c: a4 a5 a6 a7 :$%&': a4 a5 a6 a7 :$%&':
530: a8 a9 aa ab :()*+: a8 a9 aa ab :()*+:
534: ac ad ae af :,-./: ac ad ae af :,-./:
538: b0 b1 b2 b3 :0123: b0 b1 b2 b3 :0123:
53c: b4 b5 b6 b7 :4567: b4 b5 b6 b7 :4567:
540: b8 b9 ba bb :89:;: b8 b9 ba bb :89:;:
Hier fehlt /dev/mdt3 (4x64K). Daher auch der Sprung von 4
544: c0 c1 c2 c3 :@ABC: c1 c2 c3 c4 :ABCD: mit (1.12.1) und ohne (1.18)
548: c4 c5 c6 c7 :DEFG: c5 c6 c7 c8 :EFGH: boot-sektor.
54c: c8 c9 ca cb :HIJK: c9 ca cb cc :IJKL: Daher sind die folgenden
550: cc cd ce cf :LMNO: cd ce cf d0 :MNOP: Einträge um jeweils
554: d0 d1 d2 d3 :PQRS: d1 d2 d3 d4 :QRST: 1 Byte verschoben.
558: d4 d5 d6 d7 :TUVW: d5 d6 d7 d8 :UVWX:
55c: d8 d9 da db :XYZ[: d9 da db dc :YZ[\:
560: dc dd de df :\]^_: dd de df e0 :]^_`:
564: e0 e1 e2 e3 :`abc: e1 e2 e3 e4 :abcd:
568: e4 e5 e6 e7 :defg: e5 e6 e7 e8 :efgh:
56c: e8 e9 ea eb :hijk: e9 ea eb ec :ijkl:
570: ec ed ee ef :lmno: ed ee ef f0 :mnop:
574: f0 f1 f2 f3 :pqrs: f1 f2 f3 f4 :qrst:
578: f4 f5 f6 f7 :tuvw: f5 f6 f7 f8 :uvwx:
57c: f8 f9 fa fb :xyz{: f9 fa fb fc :yz{|:
580: fc fd fe ff :|}~.: fd fe ff 00 :}~..:
584: 00 01 02 03 :....: 01 02 03 04 :....:
Gegenüberstellung FW 1.18 und FW 1.29.5
Hier folgt eine Hexdump-Gegenüberstellung der WSW-Header der beiden Firmware-Versionen 1.18 und 1.29.5:
[[FW 1.18]]small.wsw [[FW 1.29.5]]small.wsw
------------------------------------------------------
000: 57 53 57 20 :WSW : 57 53 57 20 :WSW :
MD5 mit RSA verschlüsselt
0024 Länge der MD5
002c Länge der Verschlüsselung
004: 00 24 00 2c :.$.,: 00 24 00 2c :.$.,:
008: 96 ab b8 20 :.+8 : 6d 67 4b 89 :mgK.: <<<<<
00c: bd 01 c6 d9 :=.FY: 3a 3b 5c 31 ::;\1: <<<<<
010: 2e 3b 40 6e :.;@n: ec 91 20 a9 :l. ): <<<<<
014: b3 12 d3 d5 :3.SU: 3e ea bd 6a :>j=j: <<<<<
018: 60 5d d7 d0 :`]WP: cc f2 cc 95 :LrL.: <<<<<
01c: c6 30 85 c6 :F0.F: dc 00 f8 8b :\.x.: <<<<<
020: 92 8f 99 79 :...y: 58 27 40 d0 :X'@P: <<<<<
024: 91 39 4f 5b :.9O[: 74 d1 40 61 :tQ@a: <<<<<
028: 40 45 51 d1 :@EQQ: 50 ea a1 69 :Pj!i: <<<<<
02c: 80 96 a1 47 :..!G: f7 41 56 52 :wAVR: <<<<<
030: e9 8f b3 00 :i.3.: ea 1f 54 20 :j.T : <<<<<
034: 00 00 00 00 :....: 00 00 00 00 :....:
038: 00 00 00 00 :....: 00 00 00 00 :....:
03c: 00 00 00 00 :....: 00 00 00 00 :....:
Ab hier: Neuer genutzer Datenbereich
0024 Länge der MD5
0081 Länge der Verschlüsselung
040: 00 00 00 00 :....: 00 24 00 81 :.$..: <<<<<
044: 00 00 00 00 :....: f9 40 18 ee :y@.n: <<<<<
048: 00 00 00 00 :....: c1 86 f8 11 :A.x.: <<<<<
04c: 00 00 00 00 :....: 99 81 bb ec :..;l: <<<<<
050: 00 00 00 00 :....: 8a a6 90 67 :.&.g: <<<<<
054: 00 00 00 00 :....: 6d 61 3e f1 :ma>q: <<<<<
058: 00 00 00 00 :....: 5e de 46 16 :^^F.: <<<<<
05c: 00 00 00 00 :....: a1 27 19 f0 :!'.p: <<<<<
060: 00 00 00 00 :....: 5d b0 66 89 :]0f.: <<<<<
064: 00 00 00 00 :....: d2 93 b0 c1 :R.0A: <<<<<
068: 00 00 00 00 :....: fa 05 0d c1 :z..A: <<<<<
06c: 00 00 00 00 :....: a5 94 54 7d :%.T}: <<<<<
070: 00 00 00 00 :....: 80 47 28 c3 :.G(C: <<<<<
074: 00 00 00 00 :....: ea 98 6f f4 :j.ot: <<<<<
078: 00 00 00 00 :....: d8 b8 d5 65 :X8Ue: <<<<<
07c: 00 00 00 00 :....: 07 27 db e4 :.'[d: <<<<<
080: 00 00 00 00 :....: 8d 42 35 cb :.B5K: <<<<<
084: 00 00 00 00 :....: 0d fd 9d ec :.}.l: <<<<<
088: 00 00 00 00 :....: 8f 68 ed 97 :.hm.: <<<<<
08c: 00 00 00 00 :....: 19 5f 9c d8 :._.X: <<<<<
090: 00 00 00 00 :....: 31 c4 fc a8 :1D|(: <<<<<
094: 00 00 00 00 :....: 66 7c 49 f7 :f|Iw: <<<<<
098: 00 00 00 00 :....: 87 5f bd b9 :._=9: <<<<<
09c: 00 00 00 00 :....: c6 35 9c 02 :F5..: <<<<<
0a0: 00 00 00 00 :....: be 4f 64 2d :>Od-: <<<<<
0a4: 00 00 00 00 :....: e3 a8 25 bd :c(%=: <<<<<
0a8: 00 00 00 00 :....: ee 06 67 e2 :n.gb: <<<<<
0ac: 00 00 00 00 :....: 04 bd 28 74 :.=(t: <<<<<
0b0: 00 00 00 00 :....: 01 fe 84 4b :.~.K: <<<<<
0b4: 00 00 00 00 :....: 2e 69 21 69 :.i!i: <<<<<
0b8: 00 00 00 00 :....: 25 bc df 4a :%<_J: <<<<<
0bc: 00 00 00 00 :....: 56 b0 fa 74 :V0zt: <<<<<
0c0: 00 00 00 00 :....: 7a 03 5d d4 :z.]T: <<<<<
0c4: 00 00 00 00 :....: 91 00 00 00 :....: <<<<<
0c8: 00 00 00 00 :....: 00 00 00 00 :....:
Lauter Nullen
3fc: 00 00 00 00 :....: 00 00 00 00 :....:
Der Name der Box
400: 4d 37 34 30 :M740: 4d 37 34 30 :M740:
404: 41 56 00 00 :AV..: 41 56 00 00 :AV..:
408: 00 00 00 00 :....: 00 00 00 00 :....:
Lauter Nullen
43c: 00 00 00 00 :....: 00 00 00 00 :....:
Der Name der Firmware
440: 31 2e 31 38 :1.18: 31 2e 32 39 :1.29: <<<<<
444: 73 6d 61 6c :smal: 2e 35 73 6d :.5sm: <<<<<
448: 6c 00 00 00 :l...: 61 6c 6c 00 :all.: <<<<<
44c: 00 00 00 00 :....: 00 00 00 00 :....:
Lauter Nullen
478: 00 00 00 00 :....: 00 00 00 00 :....:
unbekannt
47c: 67 00 b6 0f :g.6.: ab a2 24 a6 :+"$&: <<<<<
timestamp:
480: 41 bb 31 ad :A;1-: 42 10 a3 da :B.#Z: <<<<<
Länge der Map
484: 00 00 00 c8 :...H: 00 00 00 c8 :...H:
Map
488: 00 01 02 03 :....: 00 01 02 03 :....:
48c: 04 05 06 07 :....: 04 05 06 07 :....:
490: 08 09 0a 0b :....: 08 09 0a 0b :....:
494: 0c 0d 0e 0f :....: 0c 0d 0e 0f :....:
498: 10 11 12 13 :....: 10 11 12 13 :....:
49c: 14 15 16 17 :....: 14 15 16 17 :....:
4a0: 18 19 1a 1b :....: 18 19 1a 1b :....:
4a4: 1c 1d 1e 1f :....: 1c 1d 1e 1f :....:
4a8: 20 21 22 23 : !"#: 20 21 22 23 : !"#:
4ac: 24 25 26 27 :$%&': 24 25 26 27 :$%&':
4b0: 28 29 2a 2b :()*+: 28 29 2a 2b :()*+:
4b4: 2c 2d 2e 2f :,-./: 2c 2d 2e 2f :,-./:
4b8: 30 31 32 33 :0123: 30 31 32 33 :0123:
4bc: 34 35 36 37 :4567: 34 35 36 37 :4567:
4c0: 38 39 3a 3b :89:;: 38 39 3a 3b :89:;:
4c4: 3c 3d 3e 3f :<=>?: 3c 3d 3e 3f :<=>?:
4c8: 40 41 42 43 :@ABC: 40 41 42 43 :@ABC:
4cc: 44 45 46 47 :DEFG: 44 45 46 47 :DEFG:
4d0: 48 49 4a 4b :HIJK: 48 49 4a 4b :HIJK:
4d4: 4c 4d 4e 4f :LMNO: 4c 4d 4e 4f :LMNO:
4d8: 50 51 52 53 :PQRS: 50 51 52 53 :PQRS:
4dc: 54 55 56 57 :TUVW: 54 55 56 57 :TUVW:
4e0: 58 59 5a 5b :XYZ[: 58 59 5a 5b :XYZ[:
4e4: 5c 5d 5e 5f :\]^_: 5c 5d 5e 5f :\]^_:
4e8: 60 61 62 63 :`abc: 60 61 62 63 :`abc:
4ec: 64 65 66 67 :defg: 64 65 66 67 :defg:
4f0: 68 69 6a 6b :hijk: 68 69 6a 6b :hijk:
4f4: 6c 6d 6e 6f :lmno: 6c 6d 6e 6f :lmno:
4f8: 70 71 72 73 :pqrs: 70 71 72 73 :pqrs:
4fc: 74 75 76 77 :tuvw: 74 75 76 77 :tuvw:
500: 78 79 7a 7b :xyz{: 78 79 7a 7b :xyz{:
504: 7c 7d 7e 7f :|}~.: 7c 7d 7e 7f :|}~.:
508: 80 81 82 83 :....: 80 81 82 83 :....:
50c: 84 85 86 87 :....: 84 85 86 87 :....:
510: 88 89 8a 8b :....: 88 89 8a 8b :....:
514: 8c 8d 8e 8f :....: 8c 8d 8e 8f :....:
518: 90 91 92 93 :....: 90 91 92 93 :....:
51c: 94 95 96 97 :....: 94 95 96 97 :....:
520: 98 99 9a 9b :....: 98 99 9a 9b :....:
524: 9c 9d 9e 9f :....: 9c 9d 9e 9f :....:
528: a0 a1 a2 a3 : !"#: a0 a1 a2 a3 : !"#:
52c: a4 a5 a6 a7 :$%&': a4 a5 a6 a7 :$%&':
530: a8 a9 aa ab :()*+: a8 a9 aa ab :()*+:
534: ac ad ae af :,-./: ac ad ae af :,-./:
538: b0 b1 b2 b3 :0123: b0 b1 b2 b3 :0123:
53c: b4 b5 b6 b7 :4567: b4 b5 b6 b7 :4567:
540: b8 b9 ba bb :89:;: b8 b9 ba bb :89:;:
544: c1 c2 c3 c4 :ABCD: c1 c2 c3 c4 :ABCD:
548: c5 c6 c7 c8 :EFGH: c5 c6 c7 c8 :EFGH:
54c: c9 ca cb cc :IJKL: c9 ca cb cc :IJKL:
550: cd ce cf d0 :MNOP: cd ce cf d0 :MNOP:
554: d1 d2 d3 d4 :QRST: d1 d2 d3 d4 :QRST:
558: d5 d6 d7 d8 :UVWX: d5 d6 d7 d8 :UVWX:
55c: d9 da db dc :YZ[\: d9 da db dc :YZ[\:
560: dd de df e0 :]^_`: dd de df e0 :]^_`:
564: e1 e2 e3 e4 :abcd: e1 e2 e3 e4 :abcd:
568: e5 e6 e7 e8 :efgh: e5 e6 e7 e8 :efgh:
56c: e9 ea eb ec :ijkl: e9 ea eb ec :ijkl:
570: ed ee ef f0 :mnop: ed ee ef f0 :mnop:
574: f1 f2 f3 f4 :qrst: f1 f2 f3 f4 :qrst:
578: f5 f6 f7 f8 :uvwx: f5 f6 f7 f8 :uvwx:
57c: f9 fa fb fc :yz{|: f9 fa fb fc :yz{|:
580: fd fe ff 00 :}~..: fd fe ff 00 :}~..:
584: 01 02 03 04 :....: 01 02 03 04 :....:
Firmware Links
- Firmware Übersicht, Firmware Downloads, Beta-Firmware
- Firmware 1.12.1
- Firmware 1.18, Firmware 1.18.lemmi
- Firmware 1.29.5, Firmware 1.29.5.lemmi
- Firmware 1.33_cf, Firmware 1.33.lemmi (spanische FW)
- Firmware 1.37.4, Firmware 1.37.4.lemmi
- Firmware 1.44.4_cf, Firmware 1.44.4.lemmi (spanische FW)
- Firmware 1.49.5, Firmware 1.49.5.lemmi
- Firmware 1.50.6, Firmware 1.50.6.lemmi
- Firmware 2.1, Firmware 2.01.0.lemmi
- Allgemeine Infos:
- Hintergrundwissen:
- Aufbau der Updates: WSW Dateien, WSW Header, RSA Verschlüsselung
- Flash-RAM, cramfs Dateisystem
- Portal »Linux Projekt«

