diff --git a/Makefile b/Makefile index 301a070..938efcc 100755 --- a/Makefile +++ b/Makefile @@ -15,12 +15,12 @@ clean: #.c.o: # $(CC) -o $@ $(LIBS) $^ qcio.o -balong-usbdload: balong-usbdload.o parts.o +balong-usbdload: balong-usbdload.o parts.o patcher.o @gcc $^ -o $@ $(LIBS) ptable-injector: ptable-injector.o parts.o @gcc $^ -o $@ $(LIBS) -loader-patch: loader-patch.o +loader-patch: loader-patch.o patcher.o @gcc $^ -o $@ $(LIBS) \ No newline at end of file diff --git a/balong-usbdload.c b/balong-usbdload.c index a94e3ad..b41ed60 100644 --- a/balong-usbdload.c +++ b/balong-usbdload.c @@ -22,6 +22,7 @@ #endif #include "parts.h" +#include "patcher.h" #ifndef WIN32 @@ -213,7 +214,7 @@ void main(int argc, char* argv[]) { unsigned int i,res,opt,datasize,pktcount,adr; int bl; // текущий блок unsigned char c; -int fbflag=0, tflag=0, mflag=0; +int fbflag=0, tflag=0, mflag=0, bflag=0; int koff; // смещение до ANDROID-заголовка char ptfile[100]; @@ -248,7 +249,7 @@ DWORD bytes_written, bytes_read; bzero(fileflag,sizeof(fileflag)); -while ((opt = getopt(argc, argv, "hp:ft:ms:")) != -1) { +while ((opt = getopt(argc, argv, "hp:ft:ms:b")) != -1) { switch (opt) { case 'h': @@ -257,6 +258,7 @@ printf("\n Утилита предназначена для аварийной U Допустимы следующие ключи:\n\n\ -p - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0\n\ -f - грузить usbloader только до fastboot (без запуска линукса)\n\ +-b - аналогично -f, дополнительно отключить проверку дефектных блоков при стирании\n\ -t - взять таблицу разделов из указанного файла\n\ -m - показать таблицу разделов загрузчика и завершить работу\n\ -s n - установить файловый флаг для раздела n (ключ можно указать несколько раз)\n\ @@ -271,6 +273,11 @@ printf("\n Утилита предназначена для аварийной U fbflag=1; break; + case 'b': + fbflag=1; + bflag=1; + break; + case 'm': mflag=1; break; @@ -398,6 +405,15 @@ for(bl=0;bl<2;bl++) { show_map(*ptable); return; } + + // Патч erase-процедуры + if (bflag) { + res=perasebad(blk[bl].pbuf, blk[bl].size); + if (res == 0) { + printf("\n! Не найдена сигнатура isbad - загрузка невозможна\n"); + return; + } + } } diff --git a/loader-patch.c b/loader-patch.c index b6ae2cb..f2d8036 100644 --- a/loader-patch.c +++ b/loader-patch.c @@ -3,36 +3,7 @@ #include #include #include - -// Структура, описывающая сигнатуру и положение патча -struct defpatch { - const char* sig; // сигнатрура - uint32_t sigsize; // длина сигнатуры - int32_t poffset; // смещение до точки патча от конца сигнатуры -}; - - - -//*********************************************************************** -//* Поиск сигнатуры и наложение патча -//*********************************************************************** -uint32_t patch(struct defpatch fp, uint8_t* buf, uint32_t fsize) { - -// накладываемый патч - mov r0,#0 -const char nop0[4]={0, 0, 0xa0, 0xe3}; -uint32_t i; - -for(i=8;i<(fsize-60);i+=4) { - if (memcmp(buf+i,fp.sig, fp.sigsize) == 0) { - // найдена сигнатура - накладываем патч и уходим - memcpy(buf+i+fp.sigsize+fp.poffset,nop0,4); - return i; - } -} -// сигнатрура не найдена -return 0; -} - +#include "patcher.h" //####################################################################################################### @@ -47,29 +18,6 @@ uint8_t outfilename[100]; int oflag=0,bflag=0; uint32_t res; -// Описатели патчей - -const char sigburn_v7r11[]={ - 0x00, 0x00, 0x50, 0xE3, 0x70, 0x80, 0xBD, 0x08, 0x00, 0x30, 0xA0, 0xE3, - 0x4E, 0x26, 0x04, 0xE3, 0xE0, 0x3F, 0x44, 0xE3, 0x55, 0x22, 0x44, 0xE3, - 0x4C, 0x01, 0x9F, 0xE5, 0x4E, 0xC6, 0x04, 0xE3, 0x48, 0x41, 0x9F, 0xE5, - 0x02, 0x10, 0xA0, 0xE1, 0x4C, 0xC4, 0x44, 0xE3, 0x5C, 0x23, 0x83, 0xE5, - 0x00, 0x00, 0x8F, 0xE0, 0x40, 0xC3, 0x83, 0xE5}; - -const char sigburn_v7r2[]={ - 0x00, 0x30, 0xA0, 0xE3, 0x9A, 0x3F, 0x07, 0xEE, 0xFF, 0x2F, 0x0F, 0xE3, - 0xE1, 0x2F, 0x44, 0xE3, 0x07, 0x30, 0x02, 0xE5, 0x9A, 0x3F, 0x07, 0xEE, - 0x00, 0x40, 0xA0, 0xE3, 0xE0, 0x4F, 0x44, 0xE3, 0x4E, 0x36, 0x04, 0xE3, - 0x4C, 0x34, 0x44, 0xE3, 0x30, 0x33, 0x84, 0xE5}; - -// 00 30 A0 E3 9A 3F 07 EE FF 2F 0F E3 07 30 02 E5 9A 3F 07 EE 00 40 A0 E3 4E 36 04 E3 30 33 84 E5 - -const char sigbad[]={0x04, 0x10, 0x8D, 0xE2, 0x04, 0x00, 0xA0, 0xE1}; - -struct defpatch patch_v7r11={sigburn_v7r11, sizeof(sigburn_v7r11), 4}; -struct defpatch patch_v7r2={sigburn_v7r2, sizeof(sigburn_v7r2), 16}; -struct defpatch patch_erasebad={sigbad, sizeof(sigbad), 0}; - // Разбор командной строки @@ -124,16 +72,16 @@ buf=malloc(fsize); fread(buf,1,fsize,in); fclose(in); -res=patch(patch_v7r2, buf, fsize); +res=pv7r2(buf, fsize); if (res != 0) printf("\n* Найдена сигнатура типа V7R2 по смещению %08x",res); else { - res=patch(patch_v7r11, buf, fsize); + res=pv7r11(buf, fsize); if (res != 0) printf("\n* Найдена сигнатура типа V7R11 по смещению %08x",res); else printf("\n! Сигнатура eraseall-патча не найдена"); } if (bflag) { - res=patch(patch_erasebad, buf, fsize); + res=perasebad(buf, fsize); if (res != 0) printf("\n* Найдена сигнатура isbad по смещению %08x",res); else printf("\n! Сигнатура isbad не найдена"); } diff --git a/patcher.c b/patcher.c new file mode 100644 index 0000000..9a8febc --- /dev/null +++ b/patcher.c @@ -0,0 +1,57 @@ +#include +#include +#include "patcher.h" + +//*********************************************************************** +//* Поиск сигнатуры и наложение патча +//*********************************************************************** +uint32_t patch(struct defpatch fp, uint8_t* buf, uint32_t fsize) { + +// накладываемый патч - mov r0,#0 +const char nop0[4]={0, 0, 0xa0, 0xe3}; +uint32_t i; + +for(i=8;i<(fsize-60);i+=4) { + if (memcmp(buf+i,fp.sig, fp.sigsize) == 0) { + // найдена сигнатура - накладываем патч и уходим + memcpy(buf+i+fp.sigsize+fp.poffset,nop0,4); + return i; + } +} +// сигнатрура не найдена +return 0; +} + +//********************************************** +// Описатели патчей +//********************************************** + +const char sigburn_v7r11[]={ + 0x00, 0x00, 0x50, 0xE3, 0x70, 0x80, 0xBD, 0x08, 0x00, 0x30, 0xA0, 0xE3, + 0x4E, 0x26, 0x04, 0xE3, 0xE0, 0x3F, 0x44, 0xE3, 0x55, 0x22, 0x44, 0xE3, + 0x4C, 0x01, 0x9F, 0xE5, 0x4E, 0xC6, 0x04, 0xE3, 0x48, 0x41, 0x9F, 0xE5, + 0x02, 0x10, 0xA0, 0xE1, 0x4C, 0xC4, 0x44, 0xE3, 0x5C, 0x23, 0x83, 0xE5, + 0x00, 0x00, 0x8F, 0xE0, 0x40, 0xC3, 0x83, 0xE5}; + +const char sigburn_v7r2[]={ + 0x00, 0x30, 0xA0, 0xE3, 0x9A, 0x3F, 0x07, 0xEE, 0xFF, 0x2F, 0x0F, 0xE3, + 0xE1, 0x2F, 0x44, 0xE3, 0x07, 0x30, 0x02, 0xE5, 0x9A, 0x3F, 0x07, 0xEE, + 0x00, 0x40, 0xA0, 0xE3, 0xE0, 0x4F, 0x44, 0xE3, 0x4E, 0x36, 0x04, 0xE3, + 0x4C, 0x34, 0x44, 0xE3, 0x30, 0x33, 0x84, 0xE5}; + + +const char sigbad[]={0x04, 0x10, 0x8D, 0xE2, 0x04, 0x00, 0xA0, 0xE1}; + +struct defpatch patch_v7r11={sigburn_v7r11, sizeof(sigburn_v7r11), 4}; +struct defpatch patch_v7r2={sigburn_v7r2, sizeof(sigburn_v7r2), 16}; +struct defpatch patch_erasebad={sigbad, sizeof(sigbad), 0}; + + +//**************************************************** +//* Процедуры патча под разные чипсеты и задачи +//**************************************************** + +uint32_t pv7r2 (uint8_t* buf, uint32_t fsize) { return patch(patch_v7r2, buf, fsize); } +uint32_t pv7r11 (uint8_t* buf, uint32_t fsize) { return patch(patch_v7r11, buf, fsize); } +uint32_t perasebad (uint8_t* buf, uint32_t fsize) { return patch(patch_erasebad, buf, fsize); } + diff --git a/patcher.h b/patcher.h new file mode 100644 index 0000000..f633e89 --- /dev/null +++ b/patcher.h @@ -0,0 +1,23 @@ + +// Структура, описывающая сигнатуру и положение патча +struct defpatch { + const char* sig; // сигнатрура + uint32_t sigsize; // длина сигнатуры + int32_t poffset; // смещение до точки патча от конца сигнатуры +}; + + + +//*********************************************************************** +//* Поиск сигнатуры и наложение патча +//*********************************************************************** +uint32_t patch(struct defpatch fp, uint8_t* buf, uint32_t fsize); + +//**************************************************** +//* Процедуры патча под разные чипсеты и задачи +//**************************************************** + +uint32_t pv7r2 (uint8_t* buf, uint32_t fsize); +uint32_t pv7r11 (uint8_t* buf, uint32_t fsize); +uint32_t perasebad (uint8_t* buf, uint32_t fsize); +