WSW Header

Aus M740 WikiWeb

Wechseln zu: Navigation, Suche

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