diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-07-09 12:01:18 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-07-09 12:01:18 +0000 |
commit | e51fc6d8da1175701f5958081a05deaa457d23e0 (patch) | |
tree | 200eaf49f332190cfd05ca89f6d4b5318ff0ce8a | |
parent | a75f0e579f2ef9d1817d363dd76640ea4bb2764f (diff) | |
download | rockbox-e51fc6d8da1175701f5958081a05deaa457d23e0.tar.gz rockbox-e51fc6d8da1175701f5958081a05deaa457d23e0.zip |
Adapted fwpatcher to patch both H110/H115 and H120/H140 firmwares. Unpatched firmwares are detected by md5sum, and the patched firmware's md5sum is compared to the matching entry, so it should be even more safe than before.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7086 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | tools/fwpatcher/Makefile | 12 | ||||
-rw-r--r-- | tools/fwpatcher/checksums.h | 6 | ||||
-rw-r--r-- | tools/fwpatcher/h100sums.h | 9 | ||||
-rw-r--r-- | tools/fwpatcher/h120sums.h | 15 | ||||
-rw-r--r-- | tools/fwpatcher/main.c | 111 | ||||
-rw-r--r-- | tools/fwpatcher/resource.h | 3 | ||||
-rw-r--r-- | tools/fwpatcher/resource.rc | 3 |
7 files changed, 121 insertions, 38 deletions
diff --git a/tools/fwpatcher/Makefile b/tools/fwpatcher/Makefile index f5255975f3..7dd56f037b 100644 --- a/tools/fwpatcher/Makefile +++ b/tools/fwpatcher/Makefile | |||
@@ -7,8 +7,12 @@ | |||
7 | # $Id$ | 7 | # $Id$ |
8 | # | 8 | # |
9 | 9 | ||
10 | #value for crosscompiling on linux | ||
10 | PREFIX=i586-mingw32msvc- | 11 | PREFIX=i586-mingw32msvc- |
11 | 12 | ||
13 | #value for compiling on cygwin | ||
14 | #PREFIX= | ||
15 | |||
12 | TARGET = fwpatchernu.exe | 16 | TARGET = fwpatchernu.exe |
13 | TARGETU = fwpatcher.exe | 17 | TARGETU = fwpatcher.exe |
14 | 18 | ||
@@ -16,9 +20,15 @@ WINDRES = $(PREFIX)windres | |||
16 | CC = $(PREFIX)gcc | 20 | CC = $(PREFIX)gcc |
17 | 21 | ||
18 | UNICODE = -DUNICODE -D_UNICODE | 22 | UNICODE = -DUNICODE -D_UNICODE |
23 | |||
24 | #values for crosscompiling on linux | ||
19 | CFLAGS = -I. -Os -s -fomit-frame-pointer | 25 | CFLAGS = -I. -Os -s -fomit-frame-pointer |
20 | LDFLAGS = -lmingw32 -mwindows -s | 26 | LDFLAGS = -lmingw32 -mwindows -s |
21 | 27 | ||
28 | #values for compiling on cygwin | ||
29 | #CFLAGS = -I. -Os -s -fomit-frame-pointer -mno-cygwin -DNOCYGWIN | ||
30 | #LDFLAGS = -lmingw32 -mwindows -s -mno-cygwin | ||
31 | |||
22 | OBJS= resource.o iriver.o main.o md5.o | 32 | OBJS= resource.o iriver.o main.o md5.o |
23 | OBJSU= resource.o iriveru.o mainu.o md5.o | 33 | OBJSU= resource.o iriveru.o mainu.o md5.o |
24 | 34 | ||
@@ -30,7 +40,7 @@ $(TARGET): $(OBJS) | |||
30 | $(TARGETU): $(OBJSU) | 40 | $(TARGETU): $(OBJSU) |
31 | $(CC) $(LDFLAGS) $(OBJSU) -o $@ | 41 | $(CC) $(LDFLAGS) $(OBJSU) -o $@ |
32 | 42 | ||
33 | resource.o: resource.rc bootloader.bin rockbox.ico | 43 | resource.o: resource.rc bootloader-h100.bin bootloader-h120.bin rockbox.ico |
34 | $(WINDRES) -v $< $@ | 44 | $(WINDRES) -v $< $@ |
35 | 45 | ||
36 | iriveru.o: iriver.c iriver.h | 46 | iriveru.o: iriver.c iriver.h |
diff --git a/tools/fwpatcher/checksums.h b/tools/fwpatcher/checksums.h deleted file mode 100644 index 22f0a7f912..0000000000 --- a/tools/fwpatcher/checksums.h +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | "4935d52ad3b720b6a156465201245eab", /* 1.63eu */ | ||
2 | "e87c75ea6788d417d9be7b3700cf0557", /* 1.63k */ | ||
3 | "d302d3b90bb26f55f01332fd47968647", /* 1.63us */ | ||
4 | "ffdf317356cc0a964a2708d6b90f59cb", /* 1.65eu */ | ||
5 | "30a33bbfcc37dd4980e36974a5122f02", /* 1.65k */ | ||
6 | "35b19d2acafe795c30c42d0208af1af8", /* 1.65us */ | ||
diff --git a/tools/fwpatcher/h100sums.h b/tools/fwpatcher/h100sums.h new file mode 100644 index 0000000000..1605fafc4f --- /dev/null +++ b/tools/fwpatcher/h100sums.h | |||
@@ -0,0 +1,9 @@ | |||
1 | /* Checksums of firmwares for ihp_100 */ | ||
2 | /* order: unpatched, patched */ | ||
3 | |||
4 | /* 1.65-EU */ | ||
5 | {"478dc657b97e77d1b4944ef26c3dcb8e", "b20d9674c449ef6d929ad5fe2ce3132b"}, | ||
6 | /* 1.65-K */ | ||
7 | {"97ba82fb8099bb23ca0c78fc119f8cce", "5851315169e535b7ae69174d888ceec5"}, | ||
8 | /* 1.65-US */ | ||
9 | {"d3725865e0948cd5f604b00db2ec89aa", "4ff207b3034aac0d1e1dfbf93b046624"}, | ||
diff --git a/tools/fwpatcher/h120sums.h b/tools/fwpatcher/h120sums.h new file mode 100644 index 0000000000..70d42d71c3 --- /dev/null +++ b/tools/fwpatcher/h120sums.h | |||
@@ -0,0 +1,15 @@ | |||
1 | /* Checksums of firmwares for ihp_120 */ | ||
2 | /* order: unpatched, patched */ | ||
3 | |||
4 | /* ihp_120-1.63-EU.hex */ | ||
5 | {"14488347a171480c63c94bc7b885225d", "c4c514656277d7bf81c9951cf56bcdbc"}, | ||
6 | /* ihp_120-1.63-K.hex */ | ||
7 | {"3401fe8845e569156abfaddf05ca7771", "3db4a3dbb30e1464ecf0415f27366215"}, | ||
8 | /* ihp_120-1.63-US.hex */ | ||
9 | {"d9078209105c186cee5246055fdb99c9", "c8531d1b614a1ca514631fc94e2ced21"}, | ||
10 | /* ihp_120-1.65-EU.hex */ | ||
11 | {"c9e71aac4a498f1e2f0e684c2d554ea1", "e41a9c06b7233d62bee044a8942e6b57"}, | ||
12 | /* ihp_120-1.65-K.hex */ | ||
13 | {"360c0c565266f84e9bca610c596f3207", "928120696964d3f71bf81fbfbf4819c4"}, | ||
14 | /* ihp_120-1.65-US.hex */ | ||
15 | {"b9e516d4b8a0265605f46f254897bfb0", "b341f2360a981f7ce21b24c312152cbf"}, | ||
diff --git a/tools/fwpatcher/main.c b/tools/fwpatcher/main.c index 0d0cc1956f..c16696a01c 100644 --- a/tools/fwpatcher/main.c +++ b/tools/fwpatcher/main.c | |||
@@ -39,9 +39,19 @@ | |||
39 | 39 | ||
40 | #define CTL_NUM 4 | 40 | #define CTL_NUM 4 |
41 | 41 | ||
42 | /* include precalculated checksums */ | 42 | struct sumpairs { |
43 | static char *checksums[] = { | 43 | char *unpatched; |
44 | #include "checksums.h" | 44 | char *patched; |
45 | }; | ||
46 | |||
47 | /* precalculated checksums for H110/H115 */ | ||
48 | static struct sumpairs h100pairs[] = { | ||
49 | #include "h100sums.h" | ||
50 | }; | ||
51 | |||
52 | /* precalculated checksums for H120/H140 */ | ||
53 | static struct sumpairs h120pairs[] = { | ||
54 | #include "h120sums.h" | ||
45 | }; | 55 | }; |
46 | 56 | ||
47 | HICON rbicon; | 57 | HICON rbicon; |
@@ -156,6 +166,17 @@ int mkboot(TCHAR *infile, TCHAR *outfile, unsigned char *bldata, int bllen) | |||
156 | 166 | ||
157 | /* end mkboot.c excerpt */ | 167 | /* end mkboot.c excerpt */ |
158 | 168 | ||
169 | int intable(char *md5, struct sumpairs *table, int len) | ||
170 | { | ||
171 | int i; | ||
172 | for (i = 0; i < len; i++) { | ||
173 | if (strncmp(md5, table[i].unpatched, 32) == 0) { | ||
174 | return i; | ||
175 | } | ||
176 | } | ||
177 | return -1; | ||
178 | } | ||
179 | |||
159 | int FileMD5(TCHAR *name, char *md5) | 180 | int FileMD5(TCHAR *name, char *md5) |
160 | { | 181 | { |
161 | int i, read; | 182 | int i, read; |
@@ -182,7 +203,7 @@ int FileMD5(TCHAR *name, char *md5) | |||
182 | return 1; | 203 | return 1; |
183 | } | 204 | } |
184 | 205 | ||
185 | int PatchFirmware() | 206 | int PatchFirmware(int series, int table_entry) |
186 | { | 207 | { |
187 | TCHAR fn[MAX_PATH]; | 208 | TCHAR fn[MAX_PATH]; |
188 | TCHAR name1[MAX_PATH], name2[MAX_PATH], name3[MAX_PATH]; | 209 | TCHAR name1[MAX_PATH], name2[MAX_PATH], name3[MAX_PATH]; |
@@ -192,9 +213,19 @@ int PatchFirmware() | |||
192 | unsigned char md5sum_str[256]; | 213 | unsigned char md5sum_str[256]; |
193 | DWORD blsize; | 214 | DWORD blsize; |
194 | int i; | 215 | int i; |
195 | 216 | struct sumpairs *sums; | |
196 | /* get pointer to bootloader.bin */ | 217 | |
197 | res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADER), TEXT("BIN")); | 218 | /* get pointer to the correct bootloader.bin */ |
219 | switch(series) { | ||
220 | case 100: | ||
221 | res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADERH100), TEXT("BIN")); | ||
222 | sums = &h100pairs[0]; | ||
223 | break; | ||
224 | case 120: | ||
225 | res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADERH120), TEXT("BIN")); | ||
226 | sums = &h120pairs[0]; | ||
227 | break; | ||
228 | } | ||
198 | resload = LoadResource(NULL, res); | 229 | resload = LoadResource(NULL, res); |
199 | bootloader = (unsigned char *)LockResource(resload); | 230 | bootloader = (unsigned char *)LockResource(resload); |
200 | blsize = SizeofResource(NULL, res); | 231 | blsize = SizeofResource(NULL, res); |
@@ -229,26 +260,24 @@ int PatchFirmware() | |||
229 | TEXT("Error"), MB_ICONERROR); | 260 | TEXT("Error"), MB_ICONERROR); |
230 | goto error; | 261 | goto error; |
231 | } | 262 | } |
232 | for (i = 0; i < sizeof(checksums)/sizeof(char *); ++i) { | 263 | if (strncmp(sums[table_entry].patched, md5sum_str, 32) == 0) { |
233 | if (strncmp(checksums[i], md5sum_str, 32) == 0) { | 264 | /* delete temp files */ |
234 | /* delete temp files */ | 265 | DeleteFile(name1); |
235 | DeleteFile(name1); | 266 | DeleteFile(name2); |
236 | DeleteFile(name2); | 267 | /* all is fine, rename the patched file to original name of the firmware */ |
237 | /* all is fine, rename the patched file to original name of the firmware */ | 268 | if (DeleteFile(fn) && MoveFile(name3, fn)) { |
238 | if (DeleteFile(fn) && MoveFile(name3, fn)) { | 269 | return 1; |
239 | return 1; | 270 | } |
240 | } | 271 | else { |
241 | else { | 272 | DeleteFile(name3); /* Deleting a perfectly good firmware here really */ |
242 | DeleteFile(name3); /* Deleting a perfectly good firmware here really */ | 273 | MessageBox(NULL, |
243 | MessageBox(NULL, | 274 | TEXT("Couldn't modify existing file.\n") |
244 | TEXT("Couldn't modify existing file.\n") | 275 | TEXT("Check if file is write protected, then try again."), |
245 | TEXT("Check if file is write protected, then try again."), | 276 | TEXT("Error"), MB_ICONERROR); |
246 | TEXT("Error"), MB_ICONERROR); | 277 | return 0; |
247 | return 0; | ||
248 | } | ||
249 | } | 278 | } |
250 | } | 279 | } |
251 | MessageBox(NULL, | 280 | MessageBox(NULL, |
252 | TEXT("Checksum doesn't match known good patched firmware.\n") | 281 | TEXT("Checksum doesn't match known good patched firmware.\n") |
253 | TEXT("Download another firmware image, then try again."), | 282 | TEXT("Download another firmware image, then try again."), |
254 | TEXT("Error"), MB_ICONERROR); | 283 | TEXT("Error"), MB_ICONERROR); |
@@ -286,8 +315,10 @@ int FileDialog(TCHAR *fn) | |||
286 | 315 | ||
287 | LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) | 316 | LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) |
288 | { | 317 | { |
289 | int i; | 318 | int i, series, table_entry; |
319 | unsigned char md5sum_str[256]; | ||
290 | switch (msg) { | 320 | switch (msg) { |
321 | TCHAR fn[MAX_PATH]; | ||
291 | case WM_CREATE: | 322 | case WM_CREATE: |
292 | /* text label */ | 323 | /* text label */ |
293 | controls[LABEL_FILENAME] = | 324 | controls[LABEL_FILENAME] = |
@@ -332,9 +363,31 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) | |||
332 | } | 363 | } |
333 | /* user pressed patch button */ | 364 | /* user pressed patch button */ |
334 | if (((HWND)lParam == controls[BUTTON_PATCH])) { | 365 | if (((HWND)lParam == controls[BUTTON_PATCH])) { |
335 | if (PatchFirmware()) | 366 | GetWindowText(controls[EDIT_FILENAME], fn, MAX_PATH); |
336 | MessageBox(NULL, TEXT("Firmware patched successfully"), | 367 | if (!FileMD5(fn, md5sum_str)) { |
337 | TEXT("Success"), MB_OK); | 368 | MessageBox(NULL, TEXT("Couldn't open firmware"), TEXT("Fail"), MB_OK); |
369 | } | ||
370 | else { | ||
371 | /* Check firmware against md5sums in h120sums and h100sums */ | ||
372 | series = 0; | ||
373 | table_entry = intable(md5sum_str, &h120pairs[0], | ||
374 | sizeof(h120pairs)/sizeof(struct sumpairs)); | ||
375 | if (table_entry >= 0) { | ||
376 | series = 120; | ||
377 | } | ||
378 | else { | ||
379 | table_entry = intable(md5sum_str, &h100pairs[0], | ||
380 | sizeof(h100pairs)/sizeof(struct sumpairs)); | ||
381 | if (table_entry >= 0) | ||
382 | series = 100; | ||
383 | } | ||
384 | if (series == 0) { | ||
385 | MessageBox(NULL, TEXT("Unrecognised firmware"), TEXT("Fail"), MB_OK); | ||
386 | } | ||
387 | else if (PatchFirmware(series, table_entry)) | ||
388 | MessageBox(NULL, TEXT("Firmware patched successfully"), | ||
389 | TEXT("Success"), MB_OK); | ||
390 | } | ||
338 | } | 391 | } |
339 | break; | 392 | break; |
340 | case WM_USER: | 393 | case WM_USER: |
diff --git a/tools/fwpatcher/resource.h b/tools/fwpatcher/resource.h index 9847eee88c..c255bff0b4 100644 --- a/tools/fwpatcher/resource.h +++ b/tools/fwpatcher/resource.h | |||
@@ -1,3 +1,4 @@ | |||
1 | #define IDI_RBICON 101 | 1 | #define IDI_RBICON 101 |
2 | #define IDI_BOOTLOADER 102 | 2 | #define IDI_BOOTLOADERH100 102 |
3 | #define IDI_BOOTLOADERH120 103 | ||
3 | 4 | ||
diff --git a/tools/fwpatcher/resource.rc b/tools/fwpatcher/resource.rc index f1196df3cd..a1dcb4835f 100644 --- a/tools/fwpatcher/resource.rc +++ b/tools/fwpatcher/resource.rc | |||
@@ -1,4 +1,5 @@ | |||
1 | #include "resource.h" | 1 | #include "resource.h" |
2 | 2 | ||
3 | IDI_RBICON ICON "rockbox.ico" | 3 | IDI_RBICON ICON "rockbox.ico" |
4 | IDI_BOOTLOADER BIN "bootloader.bin" | 4 | IDI_BOOTLOADERH100 BIN "bootloader-h100.bin" |
5 | IDI_BOOTLOADERH120 BIN "bootloader-h120.bin" | ||