From e51fc6d8da1175701f5958081a05deaa457d23e0 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sat, 9 Jul 2005 12:01:18 +0000 Subject: [PATCH] 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 --- tools/fwpatcher/Makefile | 12 +++- tools/fwpatcher/checksums.h | 6 -- tools/fwpatcher/h100sums.h | 9 +++ tools/fwpatcher/h120sums.h | 15 +++++ tools/fwpatcher/main.c | 111 ++++++++++++++++++++++++++---------- tools/fwpatcher/resource.h | 3 +- tools/fwpatcher/resource.rc | 3 +- 7 files changed, 121 insertions(+), 38 deletions(-) delete mode 100644 tools/fwpatcher/checksums.h create mode 100644 tools/fwpatcher/h100sums.h create mode 100644 tools/fwpatcher/h120sums.h 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 @@ # $Id$ # +#value for crosscompiling on linux PREFIX=i586-mingw32msvc- +#value for compiling on cygwin +#PREFIX= + TARGET = fwpatchernu.exe TARGETU = fwpatcher.exe @@ -16,9 +20,15 @@ WINDRES = $(PREFIX)windres CC = $(PREFIX)gcc UNICODE = -DUNICODE -D_UNICODE + +#values for crosscompiling on linux CFLAGS = -I. -Os -s -fomit-frame-pointer LDFLAGS = -lmingw32 -mwindows -s +#values for compiling on cygwin +#CFLAGS = -I. -Os -s -fomit-frame-pointer -mno-cygwin -DNOCYGWIN +#LDFLAGS = -lmingw32 -mwindows -s -mno-cygwin + OBJS= resource.o iriver.o main.o md5.o OBJSU= resource.o iriveru.o mainu.o md5.o @@ -30,7 +40,7 @@ $(TARGET): $(OBJS) $(TARGETU): $(OBJSU) $(CC) $(LDFLAGS) $(OBJSU) -o $@ -resource.o: resource.rc bootloader.bin rockbox.ico +resource.o: resource.rc bootloader-h100.bin bootloader-h120.bin rockbox.ico $(WINDRES) -v $< $@ 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 @@ -"4935d52ad3b720b6a156465201245eab", /* 1.63eu */ -"e87c75ea6788d417d9be7b3700cf0557", /* 1.63k */ -"d302d3b90bb26f55f01332fd47968647", /* 1.63us */ -"ffdf317356cc0a964a2708d6b90f59cb", /* 1.65eu */ -"30a33bbfcc37dd4980e36974a5122f02", /* 1.65k */ -"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 @@ +/* Checksums of firmwares for ihp_100 */ +/* order: unpatched, patched */ + +/* 1.65-EU */ +{"478dc657b97e77d1b4944ef26c3dcb8e", "b20d9674c449ef6d929ad5fe2ce3132b"}, +/* 1.65-K */ +{"97ba82fb8099bb23ca0c78fc119f8cce", "5851315169e535b7ae69174d888ceec5"}, +/* 1.65-US */ +{"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 @@ +/* Checksums of firmwares for ihp_120 */ +/* order: unpatched, patched */ + +/* ihp_120-1.63-EU.hex */ +{"14488347a171480c63c94bc7b885225d", "c4c514656277d7bf81c9951cf56bcdbc"}, +/* ihp_120-1.63-K.hex */ +{"3401fe8845e569156abfaddf05ca7771", "3db4a3dbb30e1464ecf0415f27366215"}, +/* ihp_120-1.63-US.hex */ +{"d9078209105c186cee5246055fdb99c9", "c8531d1b614a1ca514631fc94e2ced21"}, +/* ihp_120-1.65-EU.hex */ +{"c9e71aac4a498f1e2f0e684c2d554ea1", "e41a9c06b7233d62bee044a8942e6b57"}, +/* ihp_120-1.65-K.hex */ +{"360c0c565266f84e9bca610c596f3207", "928120696964d3f71bf81fbfbf4819c4"}, +/* ihp_120-1.65-US.hex */ +{"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 @@ #define CTL_NUM 4 -/* include precalculated checksums */ -static char *checksums[] = { -#include "checksums.h" +struct sumpairs { + char *unpatched; + char *patched; +}; + +/* precalculated checksums for H110/H115 */ +static struct sumpairs h100pairs[] = { +#include "h100sums.h" +}; + +/* precalculated checksums for H120/H140 */ +static struct sumpairs h120pairs[] = { +#include "h120sums.h" }; HICON rbicon; @@ -156,6 +166,17 @@ int mkboot(TCHAR *infile, TCHAR *outfile, unsigned char *bldata, int bllen) /* end mkboot.c excerpt */ +int intable(char *md5, struct sumpairs *table, int len) +{ + int i; + for (i = 0; i < len; i++) { + if (strncmp(md5, table[i].unpatched, 32) == 0) { + return i; + } + } + return -1; +} + int FileMD5(TCHAR *name, char *md5) { int i, read; @@ -182,7 +203,7 @@ int FileMD5(TCHAR *name, char *md5) return 1; } -int PatchFirmware() +int PatchFirmware(int series, int table_entry) { TCHAR fn[MAX_PATH]; TCHAR name1[MAX_PATH], name2[MAX_PATH], name3[MAX_PATH]; @@ -192,9 +213,19 @@ int PatchFirmware() unsigned char md5sum_str[256]; DWORD blsize; int i; - - /* get pointer to bootloader.bin */ - res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADER), TEXT("BIN")); + struct sumpairs *sums; + + /* get pointer to the correct bootloader.bin */ + switch(series) { + case 100: + res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADERH100), TEXT("BIN")); + sums = &h100pairs[0]; + break; + case 120: + res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADERH120), TEXT("BIN")); + sums = &h120pairs[0]; + break; + } resload = LoadResource(NULL, res); bootloader = (unsigned char *)LockResource(resload); blsize = SizeofResource(NULL, res); @@ -229,26 +260,24 @@ int PatchFirmware() TEXT("Error"), MB_ICONERROR); goto error; } - for (i = 0; i < sizeof(checksums)/sizeof(char *); ++i) { - if (strncmp(checksums[i], md5sum_str, 32) == 0) { - /* delete temp files */ - DeleteFile(name1); - DeleteFile(name2); - /* all is fine, rename the patched file to original name of the firmware */ - if (DeleteFile(fn) && MoveFile(name3, fn)) { - return 1; - } - else { - DeleteFile(name3); /* Deleting a perfectly good firmware here really */ - MessageBox(NULL, - TEXT("Couldn't modify existing file.\n") - TEXT("Check if file is write protected, then try again."), - TEXT("Error"), MB_ICONERROR); - return 0; - } + if (strncmp(sums[table_entry].patched, md5sum_str, 32) == 0) { + /* delete temp files */ + DeleteFile(name1); + DeleteFile(name2); + /* all is fine, rename the patched file to original name of the firmware */ + if (DeleteFile(fn) && MoveFile(name3, fn)) { + return 1; + } + else { + DeleteFile(name3); /* Deleting a perfectly good firmware here really */ + MessageBox(NULL, + TEXT("Couldn't modify existing file.\n") + TEXT("Check if file is write protected, then try again."), + TEXT("Error"), MB_ICONERROR); + return 0; } } - MessageBox(NULL, + MessageBox(NULL, TEXT("Checksum doesn't match known good patched firmware.\n") TEXT("Download another firmware image, then try again."), TEXT("Error"), MB_ICONERROR); @@ -286,8 +315,10 @@ int FileDialog(TCHAR *fn) LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - int i; + int i, series, table_entry; + unsigned char md5sum_str[256]; switch (msg) { + TCHAR fn[MAX_PATH]; case WM_CREATE: /* text label */ controls[LABEL_FILENAME] = @@ -332,9 +363,31 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) } /* user pressed patch button */ if (((HWND)lParam == controls[BUTTON_PATCH])) { - if (PatchFirmware()) - MessageBox(NULL, TEXT("Firmware patched successfully"), - TEXT("Success"), MB_OK); + GetWindowText(controls[EDIT_FILENAME], fn, MAX_PATH); + if (!FileMD5(fn, md5sum_str)) { + MessageBox(NULL, TEXT("Couldn't open firmware"), TEXT("Fail"), MB_OK); + } + else { + /* Check firmware against md5sums in h120sums and h100sums */ + series = 0; + table_entry = intable(md5sum_str, &h120pairs[0], + sizeof(h120pairs)/sizeof(struct sumpairs)); + if (table_entry >= 0) { + series = 120; + } + else { + table_entry = intable(md5sum_str, &h100pairs[0], + sizeof(h100pairs)/sizeof(struct sumpairs)); + if (table_entry >= 0) + series = 100; + } + if (series == 0) { + MessageBox(NULL, TEXT("Unrecognised firmware"), TEXT("Fail"), MB_OK); + } + else if (PatchFirmware(series, table_entry)) + MessageBox(NULL, TEXT("Firmware patched successfully"), + TEXT("Success"), MB_OK); + } } break; 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 @@ #define IDI_RBICON 101 -#define IDI_BOOTLOADER 102 +#define IDI_BOOTLOADERH100 102 +#define IDI_BOOTLOADERH120 103 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 @@ #include "resource.h" IDI_RBICON ICON "rockbox.ico" -IDI_BOOTLOADER BIN "bootloader.bin" +IDI_BOOTLOADERH100 BIN "bootloader-h100.bin" +IDI_BOOTLOADERH120 BIN "bootloader-h120.bin"