1+ #include <stdio.h>
2+ #include <stdlib.h>
3+
4+ char * original = "FWUP0024.DAT" ;
5+
6+ // Length of header (before xored payload)
7+ #define HEADERLEN 4 + 512 + 16
8+
9+ void unpack () {
10+ // System software version, relates
11+ // to camera model
12+ unsigned int version ;
13+
14+ // Some kind of checksum (?) AES IV?
15+ unsigned char key [512 ] = {0 };
16+
17+ // Firmware version and initial information
18+ unsigned char firmver [16 ] = {0 };
19+
20+ FILE * f = fopen (original , "r" );
21+ fread (& version , 1 , 4 , f );
22+ fread (key , 1 , 512 , f );
23+ fread (firmver , 1 , 16 , f );
24+
25+ // Payload data is bit flipped
26+ FILE * o = fopen ("output" , "w" );
27+ while (1 ) {
28+ int c = fgetc (f );
29+ if (c == EOF ) {
30+ break ;
31+ }
32+
33+ fputc (~(unsigned char )c , o );
34+ }
35+
36+ fclose (o );
37+ }
38+
39+ // Firmware numbers are printed in hex.
40+ #define HEADER_V1 4 + 512
41+ #define HEADER_V2 4 + 512 + 4
42+
43+ void pack () {
44+ FILE * f = fopen ("FPUPDATE.DAT" , "wr" );
45+
46+ // Write the original header
47+ FILE * p = fopen (original , "r" );
48+ char header [HEADERLEN ];
49+ fread (header , 1 , HEADERLEN , p );
50+ fclose (p );
51+
52+ printf ("Firmware Version: %d.%d\n" , header [4 + 512 ], header [4 + 512 + 4 ]);
53+
54+ // Change firmware version
55+ //header[4 + 512] = 1;
56+ //header[4 + 512 + 4] = 5;
57+
58+ fseek (f , 0 , SEEK_SET );
59+ fwrite (header , 1 , HEADERLEN , f );
60+
61+ // Copy payload from output
62+ FILE * o = fopen ("output" , "r" );
63+
64+ while (1 ) {
65+ int c = fgetc (o );
66+ if (c == EOF ) {
67+ break ;
68+ }
69+
70+ fputc (~(unsigned char )c , f );
71+ }
72+
73+ fclose (f );
74+ fclose (o );
75+
76+ }
77+
78+ int main (int argc , char * argv []) {
79+ switch (argv [1 ][0 ]) {
80+ case 'p' :
81+ pack ();
82+ break ;
83+ case 'u' :
84+ unpack ();
85+ break ;
86+ }
87+ }
0 commit comments