Skip to content

Commit 0bba557

Browse files
authored
Initial
0 parents  commit 0bba557

2 files changed

Lines changed: 110 additions & 0 deletions

File tree

Makefile

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Target:
2+
# p pack firmware file
3+
# u unpack firmware file
4+
t ?= p
5+
6+
all:
7+
@rm -rf FPUPDATE.DAT
8+
@touch FPUPDATE.DAT output
9+
10+
@${CC} firm.c -o firm.o
11+
@./firm.o ${t}
12+
@rm -rf *.o
13+
14+
diff:
15+
@xxd FPUPDATE.DAT > a
16+
@xxd FPUPDATE-orig.DAT > b
17+
-@diff a b
18+
@rm -rf a b
19+
20+
clean:
21+
@rm -rf a b
22+
@rm -rf *.o
23+
@rm -rf FPUPDATE.DAT

firm.c

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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

Comments
 (0)