Написал статью для начинающих патчеров
Портирование патча, который ставится в за-main'не
Нам понадобится: 1) IDA Pro Advanced 5.2 2) Main-файл прошивки на которую есть патч(w660_r8bb001) и Main-файл прошивки под которую будем портировать патч(k550_r6bc002) 3) patsearchnt 4) 2 Idc файла (для применения/отката патча в IDA Pro Advanced) 5) babe2raw(именно она, т.к main2raw иногда, конвертирует с корявыми адресами) 6) компилятор от den_po (да, да именно им)
начнём:
1 этап) // Создание исходника
Конвертируем обе прошивки в .raw - формат
Берем патч
начнем с простых адресов, а именно:
Код:f0148a: E069 B047 f014c8: B915F044 0110CE45 f03b78: 2868 8847 f03d20: AB0F0000 2F10CE45 f02eb6: 2068 8847 f03000: AB0F0000 2910CE45 f033b8: 244870B50E18 70B524488047 f0344c: 3E040000 1710CE45 f03458: 174830B50D18 30B517488047 f034b8: 4A040000 0710CE45
Открываем прошивку w660_r8bb001 в IDA Pro Advanced 5.2, переводим в Tumb-режим, ставим 4 в пункте number of opcode bytes и т.д(обьяснять как это делать не буду, не чайники) Применяем патч на прошивку с помошью ApplyPatch.idc (File=>idc file...) и так, берем первый адрес f0148a: E069 B047 к f0148a прибавляем оффсет +44000000(в патче указан именно этот) получаем 44F0148A - переходим по нему, видим это

Теперь нажимаем кнопку "С" - бобежали циферки

Нам нужна всего лишь одна строка ROM:44F0148A B0 47 BLX R6 создаем простой текстовой-файл первой строчкой вписываем include "x.inc" а ниже, копируем нашу строку, только в таком виде:
org 0x44F0148A BLX R6
возьмем второй адрес 44F014C8(+44000000) открываем его и видим это

сразу видно - это адрес:
Код:ROM:44F014C8 01 DCB 1 ROM:44F014C9 10 DCB 0x10 ROM:44F014CA CE DCB 0xCE ; + ROM:44F014CB 45 DCB 0x45 ; E
Нажимаем кнопку "D" 3 раза и получаем это

ROM:44F014C8 01 10 CE 45 DCD unk_45CE1001 переделываем так org 0x44F014C8 DCD 0x45CE1001
Прошу обратить внимание на адрес 44F033B8:
Код:ROM:44F033B8 70 B5 PUSH {R4-R6,LR} ROM:44F033BA 24 48 LDR R0, off_44F0344C ROM:44F033BC 80 47 BLX R0
здесь 3 строки, делаем их так: Код:org 0x44F033B8 PUSH {R4-R6,LR} LDR R0, 0x44F0344C BLX R0
адрес 0x44F0344C делаем так:
Код:org 0x44F0344C off_44F0344C DCD 0x45CE1016+1
так же ищем все остальные адреса и в конце концов у нас получается половина готового исходника:
Код:include "x.inc" ; --------------------------------------------------------------------------- org 0x44F0148A BLX R6 org 0x44F014C8 DCD 0x45CE1001 org 0x44F03B78 BLX R1 org 0x44F03D20 DCD 0x45CE102F org 0x44F02EB6 BLX R1 org 0x44F03000 DCD 0x45CE1029 org 0x44F033B8 PUSH {R4-R6,LR} LDR R0, 0x44F0344C BLX R0 org 0x44F0344C off_44F0344C DCD 0x45CE1016+1 org 0x44F03458 PUSH {R4,R5,LR} LDR R0, 0x44F034B8 BLX R0 org 0x44F034B8 off_44F034B8 DCD 0x45CE1006+1 ; ---------------------------------------------------------------------------
этап 2) // Замэйн Переходим к адресам, которые лежат в "теле патча" Берем первый адрес нашего "тела":
1ce1000: 00000000000000000000000000000000 204EE06915E024480D18FFB5081C0021
1ce1000+44000000=45CE1000 переходим по адресу 45CE1000 и видим такое

нажимаем "С" на всех желтых адресах ниже, до тех пор, пока не пойдут нули... Обратите внимание, Код:ROM:45CE1066 FF DCB 0xFF ROM:45CE1067 FF DCB 0xFF подобные адреса мы не трогаем, пока что... Теперь выделяем весь наш код(от адреса ROM:45CE1000 до ROM:45CE1098) Нажимаем File => Produce file => Create asm file... и сохраняем в удобное место. Теперь открываем его текстовым редактоом и в самый вверх вставляем нашу раннюю заготовку:
Код:include "x.inc" ; --------------------------------------------------------------------------- org 0x44F0148A BLX R6 org 0x44F014C8 DCD 0x45CE1001 org 0x44F03B78 BLX R1 org 0x44F03D20 DCD 0x45CE102F org 0x44F02EB6 BLX R1 org 0x44F03000 DCD 0x45CE1029 org 0x44F033B8 PUSH {R4-R6,LR} LDR R0, 0x44F0344C BLX R0 org 0x44F0344C off_44F0344C DCD 0x45CE1016+1 org 0x44F03458 PUSH {R4,R5,LR} LDR R0, 0x44F034B8 BLX R0 org 0x44F034B8 off_44F034B8 DCD 0x45CE1006+1 ; ---------------------------------------------------------------------------
Этап 3) // Оформление Исходника
удаляем шапку
;Код: ; +-------------------------------------------------------------------------+ ; | This file is generated by The Interactive Disassembler (IDA) | ; | Copyright (c) 2007 by DataRescue sa/nv, <ida@datarescue.com> | ; | Licensed to: Mach EDV Dienstleistungen, Jan Mach, 1 user, adv, 11/2007 | ; +-------------------------------------------------------------------------+ ;
После всех loc_XXXXXXXX ставим ":" т.е loc_45CE1006: и т.д Все # нужно удалить, чтобы сделать быстро, нажимаем Ctrl+H в поле Что: ставим # поле Чем: оставляем пустым, заменяем всё Все ADDS превращаем в ADD Все MOVS превращаем в MOV Все SUBS превращаем в SUB Все ADR превращаем в adr (если таковые есть) Теперь наще DCB 0xFF DCB 0xFF все loc_XXXXXXXX+1, sub_XXXXXXXX+1 меняем на 0xXXXXXXXX+1 пример: 0x453E9488+1 заменяем на выравнивание align 4 Для "красоты" все адреса выносятся перед началом "тела исходника" т.е делаем так: Код:dword_45CE1068 DCD addr1 dword_45CE106C DCD addr2 dword_45CE1070 DCD addr3 off_45CE1074 DCD addr4 off_45CE1078 DCD addr5 off_45CE107C DCD addr6 off_45CE1080 DCD addr7 off_45CE1084 DCD addr8 off_45CE1088 DCD addr9 off_45CE108C DCD addr10 off_45CE1090 DCD addr11 off_45CE1094 DCD addr12 dword_45CE1098 DCD addr13
а это выносим выше "тела исходника" Код:addr1 = 0xFAC addr2 = 0xFAB addr3 = 0x668 addr4 = 0x453E9488+1 addr5 = 0x453D6194+1 addr6 = 0x454A83C8+1 addr7 = 0x454A8440+1 addr8 = 0x44F015B9 addr9 = 0x45CE104A+1 addr10 = 0x454AD595 addr11 = 0x453D45A8+1 addr12 = 0x453D6504+1 addr13 = 0x44A
перед самым началом "тела исходника" пишем org 0x45A6C350 CODE16
где org 0x45A6C350 - это адрес, откуда пойдет "тело" нашего патча
Наш исходник готов
Этап 4) // портирование
Откроем прошивку k550_r6bc002 в другом окне(с помощью IDA Pro Advanced 5.2) так же переведём в tumb-режим, только патч устанавливать не надо.
Берём первый адрес из исходника
0x44F0148A
открываем его в прошивке w660_r8bb001(переоткройте её или откатите установленный патч)
Самый лучший и безошибочный способ нахождения адресов - создание паттерна(паттерн - кусок кода прошивки) Выделяем примерно 26 строк начиная с адреса 0x44F0148A

Копируем этот кусок, открываем patsearchnt, удаляем старый паттерн в окне и вставляем наш, Ставим стартовый адрес начала main'а(0x44140000 SE) нажимаем load ff и указываем main-файл прошивки k550_r6bc002 в .raw формате жмем Convert Теперь, что касается паттерна:
Код:??,69 ??,1C ??,??,??,01 ??,??,??,FA[code]
в нём присутствуют как 2-х байтные, так и 4-x байтные строки 4-x байтные строки мы всегда заменяем на ??,??,??,?? т.е будет так:
[code]??,69 ??,1C ??,??,??,?? ??,??,??,??
ок, разобрались, нажимаем Search - ура, адрес найден - 44DB715A
Что касается вот этого адреса: org 0x44F033B8 PUSH {R4-R6,LR} LDR R0, 0x44F0344C BLX R0 org 0x44F0344C off_44F0344C DCD 0x45CE1016+1
делаем так: находим 0x44F033B8 в прошивке w660_r8bb001 портируем его на k550_r6bc002 получаем 0x44DB9110 находим 0x44F0344C в прошивке w660_r8bb001 портируем его на k550_r6bc002 получаем 0x44DB91A8 находим 0x45CE1016+1 как находим? - ищем 0x45CE1016 в прошивке w660_r8bb001 - это за main'овый адрес, я расчитываю его для своего места и получаю 0x45A6C366 и прибавляю 1 0x45A6C366+1 В патче присутствуют текстовые метки 0x668 с помошью LNGEditor находим id метки в языковом файле w660_r8bb001(0x668) Свернуть теперь ишем такое название в языковом файле k550_r6bc002 и находим 0x114C
и так ищем все остальные адреса, после того, как мы портировали всё, у нас должно получиться так:
Код:include "x.inc" ; --------------------------------------------------------------------------- org 0x44DB715A BLX R6 org 0x44DB98DC BLX R1 org 0x44DB8C42 BLX R1 org 0x44DB7198 DCD 0x45A6C351 org 0x44DB9A84 DCD 0x45A6C37F org 0x44DB8D8C DCD 0x45A6C379 org 0x44DB91B4 PUSH {R4,R5,LR} LDR R0, 0x44DB9214 BLX R0 org 0x44DB9214 off_44DE1494 DCD 0x45A6C356+1 org 0x44DB9110 PUSH {R4-R6,LR} LDR R0, 0x44DB91A8 BLX R0 org 0x44DB91A8 off_44DE1428 DCD 0x45A6C366+1 ; --------------------------------------------------------------------------- addr1 = 0x452817E0+1 addr2 = 0x4526E708+1 addr3 = 0x4533FF9C+1 addr4 = 0x45340014+1 addr5 = 0x44DB7289 addr6 = 0x45344B75 addr7 = 0x4526CB1C+1 addr8 = 0x4526EA78+1 addr9 = 0x45A6C39A+1 addr10 = 0xFAC addr11 = 0xFAB addr12 = 0x114C addr13 = 0x44A ; --------------------------------------------------------------------------- org 0x45A6C350 CODE16 LDR R6, off_45CE1084 ; DATA XREF: ROM:44F014C8o LDR R0, [R4,0x1C] B loc_45CE1032 ; ---------------------------------------------------------------------------
loc_45CE1006: ; CODE XREF: ROM:44F0345Cj LDR R0, dword_45CE1098 ADD R5, R1, R0 PUSH {R0-R7,LR} ADD R0, R1, 0 MOV R1, 0 LDR R7, off_45CE1078 BLX R7 POP {R0-R7,PC} ; ---------------------------------------------------------------------------
loc_45CE1016: ; CODE XREF: ROM:44F033BCj ; DATA XREF: ROM:off_44F0344Co LDR R0, dword_45CE1098 SUB R0, 0xC ADD R6, R1, R0 PUSH {R0-R7,LR} ADD R0, R1, 0 MOV R1, 0 LDR R7, off_45CE1078 BLX R7 POP {R0-R7,PC} ; --------------------------------------------------------------------------- LDR R1, dword_45CE106C ; DATA XREF: ROM:44F03000o LDR R0, [R4] B loc_45CE1032 ; --------------------------------------------------------------------------- LDR R1, dword_45CE106C ; DATA XREF: ROM:44F03D20o LDR R0, [R5]
loc_45CE1032: ; CODE XREF: ROM:45CE1004j ; ROM:45CE102Cj PUSH {R0-R7,LR} ADD R6, R0, 0 LDR R1, dword_45CE1068 LDR R2, off_45CE1088 LDR R7, off_45CE107C BLX R7 LDR R2, dword_45CE1070 LDR R1, dword_45CE1068 ADD R0, R6, 0 LDR R7, off_45CE1080 BLX R7 POP {R0-R7,PC} ; ---------------------------------------------------------------------------
loc_45CE104A: ; DATA XREF: ROM:off_45CE1088o PUSH {R0-R7,LR} LDR R0, off_45CE108C LDR R7, off_45CE1090 BLX R7 CMP R0, 0 BEQ loc_45CE105A LDR R7, off_45CE1094 BLX R7
loc_45CE105A: ; CODE XREF: ROM:45CE1054j LDR R7, off_45CE1074 BLX R7 MOV R1, 0 LDR R7, off_45CE1078 BLX R7 POP {R0-R7,PC} ; --------------------------------------------------------------------------- align 4 dword_45CE1068 DCD addr10 dword_45CE106C DCD addr11 dword_45CE1070 DCD addr12 off_45CE1074 DCD addr1 off_45CE1078 DCD addr2 off_45CE107C DCD addr3 off_45CE1080 DCD addr4 off_45CE1084 DCD addr5 off_45CE1088 DCD addr9 off_45CE108C DCD addr6 off_45CE1090 DCD addr7 off_45CE1094 DCD addr8 dword_45CE1098 DCD addr13 ; ends
Теперь осталось скомпилировать патч
Этап 5) Компилирование патча
Рапаковываем компилятор от den_po в любую папку, у меня это D:\armpc2\ Кладём туда main-файл прошивки k550_r6bc002 в .raw - формате, наш исходник, называем его Untitled1 Открываем Командную строку и вписываем такую команду:
Код:D:\armpc2\make.bat Untitled1.asm K550_R6BC002_MAIN_GENERIC_LI_RED52.raw 44140000 v.info>log.txt нажимаем выполнить и получаем скомпилированный патч.
Не всегда так всё легко, байты могут не совпадать, разные ошибки. По всем вопросам писать в тему Спасибо Arthur Oganyan, за выкладывание материала Автор F.A.Q.: SEVENI |