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
This commit is contained in:
Jens Arnold 2005-07-09 12:01:18 +00:00
parent a75f0e579f
commit e51fc6d8da
7 changed files with 121 additions and 38 deletions

View file

@ -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

View file

@ -1,6 +0,0 @@
"4935d52ad3b720b6a156465201245eab", /* 1.63eu */
"e87c75ea6788d417d9be7b3700cf0557", /* 1.63k */
"d302d3b90bb26f55f01332fd47968647", /* 1.63us */
"ffdf317356cc0a964a2708d6b90f59cb", /* 1.65eu */
"30a33bbfcc37dd4980e36974a5122f02", /* 1.65k */
"35b19d2acafe795c30c42d0208af1af8", /* 1.65us */

View file

@ -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"},

View file

@ -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"},

View file

@ -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:

View file

@ -1,3 +1,4 @@
#define IDI_RBICON 101
#define IDI_BOOTLOADER 102
#define IDI_BOOTLOADERH100 102
#define IDI_BOOTLOADERH120 103

View file

@ -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"