Портирование патчей
© BoBa!®, оригинал находится здесь
"Перед данной статьей не стоит задача научить Вас писать патчи. Для этого нужно обладать некой долей авантюризма, знанием и опытом ассемблера, знанием аппаратного устройства микроконтроллера телефона. И прививание всего этого выходит за рамки статьи. Но должна помочь Вам сделать первый шаг к этому и портировать патч для Вашего редкого телефона или новой прошивки, не прибегая к помощи вечно занятых гуру."
Как теперь уже многим известно, Siemens предоставил возможность менять программное обеспеченье (firmware - прошивка) своих мобильных телефонов в домашних условиях. Как следствие, появились программы, способные прочитать и записать полный образ памяти телефона (fullflash - фуллфлеш) – флешеры. Понадобилось некоторое время на изучение структур фуллфлеша. Ожидание было вознаграждено – появились программы, позволяющие изменять мелодии, картинки и шрифты в фуллфлеше. Телефоны Siemens становились все более индивидуальными. Для примера: в Siemens C35i только одна мелодия определяется пользователем, но теперь Вы можете изменить все 21 встроенные мелодии. И в этой, как казалось, бочке меда, появилась ложка дегтя – Siemens в 35-й серии на прошивках старше 18 ввел проверку контрольной суммы (CRC) фуллфлеша. (Телефон после включения в фоновом режиме пробегает по всему фуллфлешу и рассчитывает контрольную сумму для него. Если CRC не совпадает с ранее указанной, телефон выключается, рисуя черный прямоугольник. Сделано это было, по видимости, для усложнения жизни патчерам.) Огорчение длилось недолго – DarkBear написал программу, пересчитывающую CRC в фуллфлеше. Позже – патч. Что тут началось: Netmonitor(сервисное меню), русский ввод для 35-й серий (в оригинале Siemens не баловал нас этим), выбор диапазона, редактирование langpack’a (текстовые ресурсы телефона), коррекция сенсоров батареи (калибровка аккумулятора). Это и было эпохой становления эры патчанья Сименсов. Которую начали два великих человека – DarkBear и Skylord. К сожалению, патчи для 35-й серии на этом закончились. Но для 45-й серии начали появляться как грибы после дождя. На данный момент имеется огромное количество патчей, как полезных, так и не очень, для большинства моделей телефонов Siemens. Для систематизации и упорядочивания патчей Kibab написал Интернет-базу патчей. К сожалению, база заполняется пользователями, а не авторами патчей, и охватывает не все патчи и даже не все модели телефонов.
Так что же такое «патч»? «Патч» в переводе с английского языка – заплатка. Патч – это некое изменение фуллфлеша. Патчи можно разделить на две группы. Первая – это патчи, изменяющие данные, такие как мелодии, картинки, текстовые ресурсы и т.д. и т.п. Вторая – это изменение непосредственно самого кода прошивки для исправления ошибок и добавление нового функционала телефону. Мы не будем рассматривать первую группу, т.к. существуют прекрасные инструменты для изучения и редактирования данных в фуллфлеше: Smelter, ffmod, SPC, Siemens Language Editor, Siemens CE. А вот на второй остановимся поподробнее. Перед данной статьей не стоит задача научить Вас писать патчи. Для этого нужно обладать некой долей авантюризма, знанием и опытом ассемблера, знанием аппаратного устройства микроконтроллера телефона. И прививание всего этого выходит за рамки статьи. Но должна помочь Вам сделать первый шаг к этому и портировать патч для Вашего редкого телефона или новой прошивки, не прибегая к помощи вечно занятых гуру.
Пожалуй, приступим. По сложности портирования, патчи можно разделить на три группы:
- Непосредственное изменение кода. Обычно это патчи в несколько байт, не использующие свободное место в фуллфлеше. Как правило, это изменение условного перехода на безусловный, или отключение вызова той или иной функции, или изменение какого-либо параметра. Обычно легки в портировании.
- Врезка своего кода в ту или иную функцию. Эти патчи используют свободное место в фуллфлеше. Могут быть от нескольких байтов до нескольких килобайтов. Основная сложность при портировании – в нахождении всех используемых патчем функций.
- Патчи, использующие значения в ОЗУ телефона. Сложность при портировании состоит в поиске заветного адреса в ОЗУ.
Все патчи относятся к той или иной группе или к нескольким сразу. Разобьем нашу статью на части соответственно этим группам и приступим непосредственно к портированию.
Дальнейшие примеры будут на основе x35 серии. Но все это применимо ко всей E-Gold серии телефонов (по x55 включительно), что же касается ARM телефонов (x65 и выше), то общий смысл остается, меняется лишь ассемблер.
Для портирования патчей нам понадобятся следующие программы: IDA (дизассемблер, в примерах используется версия 4.8.0.847) и PatSearch (поиск сигнатур).
Сначала научимся загружать фуллфлеш в IDA (о том, как слить фуллфлеш с телефона, читайте здесь). Пусть это будет фуллфлеш c35 1804 (число 1804 обозначает версию прошивки. 18 - непосредственно версия, 04 - языковой пакет, в данном случае русский).
1. Запустим IDA:
2. Откроем файл с нашим фуллфлешем (c35):
"Select file to disassemble": File -> OpenFile
3. Выберем процессор и параметры загрузки фуллфлеша:
"Load a new file": Processor type -> Siemens C166: c166 ->Set; LoadFile ->Binary file; Options -> Load as code segment
Нажимаем "Processor options"
4. Добавим маппинги к нашему фуллфлешу:
"C166 options": Add mapping
Здесь нам придется немного отвлечься, чтобы понять примерную карту памяти телефона. Более подробное описание карты памяти можно найти в трудах mamaich (см. список литературы). Общее адресное пространство процессора C166 равно 16Mb. Содержимое фуллфлеша отображается в конец адресного пространства телефона. Таким образом получается, что для 4Mb фуллфлеша x35 серии фуллфлеш начинается с адреса 0xC00000 (0x1000000 (общий размер адресного пространства) - 0x400000 (размер фуллфлеша x35 серии) = 0xC00000). Но это еще не все. В x35 и x45 серии есть еще дополнительные маппинги (зеркала - отображения одной и той же информации по разным адресам в адресном пространстве) фуллфлеша в адресном пространстве. Так в x35 и c45(?) с адреса 0x800000 отображается весь фуллфлеш. В me/s45 и sl45 с адреса 0x800000 отображаются первые 2 Mb фуллфлеша.
5. Добавим маппинг для c35, мапим с адреса 0x800000 в адрес 0xC00000 (начало фуллфлеша c35) длинной 0x400000 (размер фуллфлеша c35):
"Add mapping": From -> 0x800000; To -> 0xC00000; Size -> 0x400000
6. Настроим организацию памяти. Выставим начало ПЗУ 0xC00000 (начало фуллфлеша в адресном пространстве c35), размер ПЗУ 0x400000 (размер фуллфлеша c35); начало ОЗУ 0x000000 (начало адресного пространства телефона), размер ОЗУ 0xC00000 (начало фуллфлеша в адресном пространстве c35). Адрес загрузки фуллфлеша 0xC00000 (начало фуллфлеша в адресном пространстве c35). Таким образом у нас получится две области в адресном пространстве телефона - ПЗУ в конце адресного пространства и размером с фуллфлеш, и все остальное ОЗУ. Это не совсем соответствует действительности, но вполне удовлетворяет требованиям нашей задачи.
"Disassembly memory organization": RAM -> Create RAM section; RAM start address 0x0; RAM size 0xC00000; ROM -> Create ROM Section; ROM start address 0xC00000; ROM Size 0x400000; Input File -> Loading address 0xC00000
7. Выберем устройство. Как известно, в мобильных телефонах Siemens по x55 серию включительно используется микроконтроллер семейства E-Gold, основанный на микропроцессореc166. E-Gold'a в списке нет, поэтому оставим по умолчанию c165. "Choose the device name": C165
8. Выберем загружаемую информацию. Снимем флажок "Memory layout", т.к. организация памяти E-Gold отличается от C166, да и лишние сегменты нам ни к чему.
"Loaded information type": "I/O ports"; "Interrupts".
9. После некоторой паузы мы увидим следующее:
10. Теперь удалим все сегменты, созданные IDA, кроме RAM и ROM. Есть практика разбивать адресное пространство на сегменты и страницы в зависимости от того, для чего используется конкретная область, но для нашей задачи это принесет больше неудобств, чем преимуществ (при разбивке на сегменты упростится указание адресации в коде, но усложнятся переходы по коду. Необходимо будет вместе с адресом помнить тип сегмента. Без разбивки нужно помнить только адрес. Невозможно будет указать некоторые адреса в коде, что не помешает указать их в комментариях).
View -> OpenSubview -> Segments
11. Расширим сегмент RAM до 0xC00000 (начало фуллфлеша с35 в адресном пространстве телефона)
Отвечаем "Yes"
12. Дважды кликнем на сегменте ROM и видим следующую картину:
Не правда ли, не совсем то, что мы ожидали?
Отвлечемся еще немного. Мы имеем загруженный фуллфлеш в IDA. Чтобы IDA начала дисассемблировать, нужно указать ей entrypoint (точка входа) и постепенно открывать то, что нужно, либо указать сразу всю область, которую нужно открыть. Каждый способ имеет как плюсы, так и минусы. Первый не откроет и десятой части кода, но будет открывать только код. Второй же откроет всю указанную область, но при этом данные, которые идут вперемешку с кодом, представит как код. Мы воспользуемся вторым, т.к. он вполне подходит для нашей текущей задачи, а впоследствии Вы сможете отличать код от данных беглым взглядом.
13. Нажимаем "G" (Jump to address...) и вводим адрес 0xС00000 (начало фуллфлеша в адресном пространстве c35) и переходим на начало фуллфлеша:
14. Нажимаем Ctrl+Shift+PageDown и выделяем весь сегмент ROM, нажимаем "C" (code) для преобразования выделенной области в код и нажимаем "Force"
идем курить (вредно для здоровья) и пить кофе (не менее вредно) - будет некий тормоз, затем анализ кода.
15. Ждем зеленого сигнала:
16. Сохраняем idb.
Ну вот, мы имеем idb для с35 1804. Точно так же можно загрузить любой фуллфлеш, изменяются лишь адреса загрузки, параметры сегментов RAM, ROM и маппинги (см. выше).
Теперь, когда мы научились загружать фуллфлеш телефона в IDA, приступим к портированию первого патча. Возьмем для примера патч Indifferent Logo с C35 1804 и попробуем его портировать на S35 2504.
;Patch: Indifferent Logo ;Firmware: C/M35 1804 ;Release: 26.07.04 ;Author: BoBa!®
;Лого в роуминге=================================================== 0x01D7FE: 3D03 CC00
;Лого с любой СИМкой=============================================== 0x01D7E4: 3D10 CC00
|
Приступим:
1. Загрузим фуллфлеш C35 1804 в IDA.
2. Включим вывод кодов операции: Option -> General ->Disassembly -> Display disassembly line parts -> Number of opcode bytes -> 4
3. Перейдем по адресу патча "Лого в роуминге". Напомню, что адрес в патче - это адрес в фуллфлеше, IDA же работает с адресным пространством телефона, а значит к адресу патча необходимо добавить адрес загрузки фуллфлеша (для C35 это 0xC00000). Нажимаем "G" (Jump to address) и вводим C1D7FE. И видим команду условного перехода, которую мы патчим:
ROM:00C1D7D4 F0 C0 mov r12, r0 ROM:00C1D7D6 66 FC FF 3F and r12, #3FFFh ROM:00C1D7DA F2 FD 02 FE mov r13, DPP1 ROM:00C1D7DE DA D5 A6 D1 calls 0D5h, sub_D5D1A6 ROM:00C1D7E2 48 40 cmp r4, #0 ROM:00C1D7E4 3D 10 jmpr cc_NZ, loc_C1D806 ROM:00C1D7E6 DA C1 BE D1 calls 0C1h, sub_C1D1BE ROM:00C1D7EA F0 E4 mov r14, r4 ROM:00C1D7EC F0 F5 mov r15, r5 ROM:00C1D7EE F0 C0 mov r12, r0 ROM:00C1D7F0 66 FC FF 3F and r12, #3FFFh ROM:00C1D7F4 F2 FD 02 FE mov r13, DPP1 ROM:00C1D7F8 DA D5 A6 D1 calls 0D5h, sub_D5D1A6 ROM:00C1D7FC 48 40 cmp r4, #0 | ROM:00C1D7FE 3D 03 jmpr cc_NZ, loc_C1D806 | ROM:00C1D800 E6 F4 20 4E mov r4, #4E20h ROM:00C1D804 0D 02 jmpr cc_UC, loc_C1D80A ROM:00C1D806 ; -------------------------------------------------------- ROM:00C1D806 loc_C1D806: ; CODE XREF: sub_C1D6E4+100j ROM:00C1D806 ; sub_C1D6E4+11Aj ROM:00C1D806 E6 F4 FF FF mov r4, #0FFFFh ROM:00C1D80A loc_C1D80A: ; CODE XREF: sub_C1D6E4+Ej ROM:00C1D80A ; sub_C1D6E4+78j ... ROM:00C1D80A 08 04 add r0, #4 ROM:00C1D80C DB 00 rets |
4. Выделяем произвольный кусок кода вокруг нашего патча и копируем в буфер обмена:
ROM:00C1D7D4 F0 C0 mov r12, r0 ROM:00C1D7D6 66 FC FF 3F and r12, #3FFFh ROM:00C1D7DA F2 FD 02 FE mov r13, DPP1 ROM:00C1D7DE DA D5 A6 D1 calls 0D5h, sub_D5D1A6 ROM:00C1D7E2 48 40 cmp r4, #0 ROM:00C1D7E4 3D 10 jmpr cc_NZ, loc_C1D806 ROM:00C1D7E6 DA C1 BE D1 calls 0C1h, sub_C1D1BE ROM:00C1D7EA F0 E4 mov r14, r4 ROM:00C1D7EC F0 F5 mov r15, r5 ROM:00C1D7EE F0 C0 mov r12, r0 | ROM:00C1D7F0 66 FC FF 3F and r12, #3FFFh ROM:00C1D7F4 F2 FD 02 FE mov r13, DPP1 ROM:00C1D7F8 DA D5 A6 D1 calls 0D5h, sub_D5D1A6 ROM:00C1D7FC 48 40 cmp r4, #0 ROM:00C1D7FE 3D 03 jmpr cc_NZ, loc_C1D806 ROM:00C1D800 E6 F4 20 4E mov r4, #4E20h ROM:00C1D804 0D 02 jmpr cc_UC, loc_C1D80A ROM:00C1D806 ; -------------------------------------------------------- ROM:00C1D806 loc_C1D806: ; CODE XREF: sub_C1D6E4+100j ROM:00C1D806 ; sub_C1D6E4+11Aj ROM:00C1D806 E6 F4 FF FF mov r4, #0FFFFh | ROM:00C1D80A loc_C1D80A: ; CODE XREF: sub_C1D6E4+Ej ROM:00C1D80A ; sub_C1D6E4+78j ... ROM:00C1D80A 08 04 add r0, #4 ROM:00C1D80C DB 00 rets |
5. Вставляем в PATSearch:
Нажимаем "GO".
6. Выбираем фуллфлеш S35 2504:
7. Получаем адрес C1DF9C
8. Загружаем в IDA фуллфлеш S35 2504
9. Переходим по адресу C1DF9C, и видим абсолютно такой же кусок кода, в том числе и нашу команду условного перехода, которую мы патчим:
ROM:C1DF80 F0 C0 mov r12, r0 ROM:C1DF82 66 FC FF 3F and r12, #3FFFh ROM:C1DF86 F2 FD 02 FE mov r13, DPP1 ROM:C1DF8A DA E3 FE 4D calls 0E3h, loc_E34DFE ROM:C1DF8E 48 40 cmp r4, #0 ROM:C1DF90 3D 0D jmpr cc_NZ, loc_C1DFAC ROM:C1DF92 DA C1 38 D9 calls 0C1h, loc_C1D938 ROM:C1DF96 F0 E4 mov r14, r4 ROM:C1DF98 F0 F5 mov r15, r5 ROM:C1DF9A F0 C0 mov r12, r0 ROM:C1DF9C 66 FC FF 3F and r12, #3FFFh ROM:C1DFA0 F2 FD 02 FE mov r13, DPP1 ROM:C1DFA4 DA D9 EA 37 calls 0D9h, loc_D937EA ROM:C1DFA8 48 40 cmp r4, #0 | ROM:C1DFAA 3D 03 jmpr cc_NZ, loc_C1DFB2 | ROM:C1DFAC loc_C1DFAC: ; CODE XREF: ROM:C1DF72j ROM:C1DFAC ; ROM:C1DF90j ROM:C1DFAC E6 F4 20 4E mov r4, #4E20h ROM:C1DFB0 0D 02 jmpr cc_UC, loc_C1DFB6
ROM:C1DFB2 ; ------------------------------------------------------ ROM:C1DFB2 loc_C1DFB2: ; CODE XREF: ROM:C1DF58j ROM:C1DFB2 ; ROM:C1DF7Ej ... ROM:C1DFB2 E6 F4 FF FF mov r4, #0FFFFh ROM:C1DFB6 loc_C1DFB6: ; CODE XREF: ROM:C1DE6Cj ROM:C1DFB6 ; ROM:C1DED6j ... ROM:C1DFB6 08 04 add r0, #4 ROM:C1DFB8 DB 00 rets |
Таким образом мы нашли адрес патча для S35 2504, и в результате получаем:
;Patch: Indifferent Logo ;Firmware: S35 2504 ;Release: 14.01.06 ;Author: BoBa!®
;Лого в роуминге=================================================== 0x01DFAA: 3D03 CC00 |
Вот и все...
Д/З №1 патч "Лого с любой СИМкой" попробуйте адаптировать самостоятельно.
Как правило, портирование патчей внутри модели и даже серии не составляет труда. Все гораздо сложнее при портировании между двумя разными сериями в силу смены версии компилятора, которым компилируется прошивка, и изменения параметров оптимизации этой компиляции (быть может и усложнения жизни нам). К примеру, приведенный выше код на c45 v50 выглядит следующим образом:
ROM:C45290 DA CA 92 1E calls 0CAh, sub_CA1E92 ROM:C45294 DA DA 8E 91 calls 0DAh, sub_DA918E ROM:C45298 48 40 cmp r4, #0 ROM:C4529A 3D 0A jmpr cc_NZ, loc_C452B0 ROM:C4529C DA C4 54 4A calls 0C4h, sub_C44A54 ROM:C452A0 DA CA 74 C0 calls 0CAh, sub_CAC074 ROM:C452A4 F2 FD 02 FE mov r13, DPP1 ROM:C452A8 DA D7 B2 19 calls 0D7h, sub_D719B2 ROM:C452AC 48 40 cmp r4, #0 ROM:C452AE 3D 05 jmpr cc_NZ, loc_C452BA ROM:C452B0 loc_C452B0: ; CODE XREF: sub_C451B0+A6j ROM:C452B0 ; sub_C451B0+D2j ... ROM:C452B0 DA CC 68 A8 calls 0CCh, sub_CCA868 ROM:C452B4 E6 F4 20 4E mov r4, #4E20h ROM:C452B8 0D 04 jmpr cc_UC, loc_C452C2 ROM:C452BA ; ---------------------------------------------------------- ROM:C452BA loc_C452BA: ; CODE XREF: sub_C451B0+Cj ROM:C452BA ; sub_C451B0+42j ... ROM:C452BA DA CC 68 A8 calls 0CCh, sub_CCA868 ROM:C452BE E6 F4 FF FF mov r4, #0FFFFh ROM:C452C2 loc_C452C2: ; CODE XREF: sub_C451B0+108j ROM:C452C2 08 04 add r0, #4 ROM:C452C4 DB 00 rets |
Как видно, код отличается. Отличается настолько, что его трудно, если не невозможно, искать при помощи PATSearch. Этот код был найден по паттерну команды mov r4, #4E20h (E6 F4 20 4E), который встречается в фуллфлеше c45 v50 один раз, что дает нам возможность говорить с большой долей вероятности, что это искомый кусок. Мы покажем, что это именно он. Для начала рассмотрим подпрограммы, вызываемые с адресов C4529C и C452A0:
ROM:C44A54 sub_C44A54: ; CODE XREF: sub_C3730A+4P ROM:C44A54 ; sub_C37338+D5AP ... ROM:C44A54 DA CC 5E A8 calls 0CCh, sub_CCA85E ROM:C44A58 E6 FC 9C 3A mov r12, #3A9Ch ROM:C44A5C E6 FD 0C 00 mov r13, #0Ch ROM:C44A60 88 C0 mov [-r0], r12 ROM:C44A62 88 D0 mov [-r0], r13 ROM:C44A64 DA CC 68 A8 calls 0CCh, sub_CCA868 ROM:C44A68 FA CB 4C EA jmps 0CBh, loc_CBEA4C
ROM:CBEA4C loc_CBEA4C: ; CODE XREF: sub_C1253A+18J ROM:CBEA4C ; sub_C12C0A+1AJ ... ROM:CBEA4C 98 D0 mov r13, [r0+] ROM:CBEA4E 98 C0 mov r12, [r0+] ROM:CBEA50 F0 4C mov r4, r12 ROM:CBEA52 F0 5D mov r5, r13 ROM:CBEA54 DB 00 rets |
Вызовы с адресов C44A54 и C44A64 - это вызовы AcquireGbsLock и FreeGbsLock соответственно (управление семафором) и нас мало интересуют, т.к. не влияют на рассматриваемую функцию. Получается, что подпрограмма, вызываемая с адреса C4529C, соответствует подпрограмме, вызываемой с адреса C1D7E6 в C35 1804:
ROM:00C1D1BE sub_C1D1BE: ; CODE XREF: sub_C12296+ABEP ROM:00C1D1BE ; sub_C1D6E4+102P ... ROM:00C1D1BE E6 F4 3A 26 mov r4, #263Ah ROM:00C1D1C2 E6 F5 40 00 mov r5, #40h ; '@' ROM:00C1D1C6 DB 00 rets |
вызов с C452A0:
ROM:CAC074 sub_CAC074: ; CODE XREF: sub_C451B0+C4P ROM:CAC074 ; sub_C451B0+F0P ... ROM:CAC074 F0 E4 mov r14, r4 ROM:CAC076 F0 F5 mov r15, r5 ROM:CAC078 FA CA 80 1E jmps 0CAh, loc_CA1E80
ROM:CA1E80 loc_CA1E80: ; CODE XREF: ROM:CA8B92J ROM:CA1E80 ; sub_CA9A9C+4J ... ROM:CA1E80 F0 C0 mov r12, r0 ROM:CA1E82 66 FC FF 3F and r12, #3FFFh ROM:CA1E86 DB 00 rets |
соответствует:
ROM:00C1D7EA F0 E4 mov r14, r4 ROM:00C1D7EC F0 F5 mov r15, r5 ROM:00C1D7EE F0 C0 mov r12, r0 ROM:00C1D7F0 66 FC FF 3F and r12, #3FFFh |
Теперь рассмотрим вызов с адреса C452A8:
ROM:D719B2 sub_D719B2: ; CODE XREF: sub_C37124+10P ROM:D719B2 ; sub_C37146+70P ... ROM:D719B2 E0 21 mov r1, #2 ROM:D719B4 DC 4D extp r13, #1 ROM:D719B6 99 4C movb rl2, [r12+] ROM:D719B8 DC 4F extp r15, #1 ROM:D719BA 99 6E movb rl3, [r14+] ROM:D719BC 41 46 cmpb rl2, rl3 ROM:D719BE 3D 12 jmpr cc_NZ, loc_D719E4 ROM:D719C0 DC 4D extp r13, #1 ROM:D719C2 99 4C movb rl2, [r12+] ROM:D719C4 66 F2 0F 00 and r2, #0Fh ROM:D719C8 DC 4F extp r15, #1 ROM:D719CA 99 6E movb rl3, [r14+] ROM:D719CC 66 F3 0F 00 and r3, #0Fh ROM:D719D0 40 23 cmp r2, r3 ROM:D719D2 3D 08 jmpr cc_NZ, loc_D719E4 ROM:D719D4 E0 11 mov r1, #1 ROM:D719D6 DC 4D extp r13, #1 ROM:D719D8 A9 4C movb rl2, [r12] ROM:D719DA DC 4F extp r15, #1 ROM:D719DC A9 6E movb rl3, [r14] ROM:D719DE 41 46 cmpb rl2, rl3 ROM:D719E0 3D 01 jmpr cc_NZ, loc_D719E4 ROM:D719E2 E0 01 mov r1, #0 ROM:D719E4 loc_D719E4: ; CODE XREF: sub_D719B2+Cj ROM:D719E4 ; sub_D719B2+20j ... ROM:D719E4 F0 41 mov r4, r1 ROM:D719E6 DB 00 rets |
и вызов с адреса C1D7F8 в C35 1804:
ROM:00D5D1A6 sub_D5D1A6: ; CODE XREF: sub_C120BA+72P ROM:00D5D1A6 ; sub_C120BA+8EP ... ROM:00D5D1A6 88 80 mov [-r0], r8 ROM:00D5D1A8 E0 28 mov r8, #2 ROM:00D5D1AA F6 FD 00 FE mov DPP0, r13 ROM:00D5D1AE ; assume dpp0: 0 (page 0x0) ROM:00D5D1AE CC 00 nop ROM:00D5D1B0 99 2C movb rl1, [r12+] ROM:00D5D1B2 F6 FF 00 FE mov DPP0, r15 ROM:00D5D1B6 CC 00 nop ROM:00D5D1B8 99 4E movb rl2, [r14+] ROM:00D5D1BA 41 24 cmpb rl1, rl2 ROM:00D5D1BC 3D 18 jmpr cc_NZ, loc_D5D1EE ROM:00D5D1BE F6 FD 00 FE mov DPP0, r13 ROM:00D5D1C2 CC 00 nop ROM:00D5D1C4 99 2C movb rl1, [r12+] ROM:00D5D1C6 C0 21 movbz r1, rl1 ROM:00D5D1C8 66 F1 0F 00 and r1, #0Fh ROM:00D5D1CC F6 FF 00 FE mov DPP0, r15 ROM:00D5D1D0 CC 00 nop ROM:00D5D1D2 99 4E movb rl2, [r14+] ROM:00D5D1D4 C0 42 movbz r2, rl2 ROM:00D5D1D6 66 F2 0F 00 and r2, #0Fh ROM:00D5D1DA 40 12 cmp r1, r2 ROM:00D5D1DC 3D 08 jmpr cc_NZ, loc_D5D1EE ROM:00D5D1DE E0 18 mov r8, #1 ROM:00D5D1E0 DC 4D extp r13, #1 ROM:00D5D1E2 A9 2C movb rl1, [r12] ROM:00D5D1E4 DC 4F extp r15, #1 ROM:00D5D1E6 A9 4E movb rl2, [r14] ROM:00D5D1E8 41 24 cmpb rl1, rl2 ROM:00D5D1EA 3D 01 jmpr cc_NZ, loc_D5D1EE ROM:00D5D1EC E0 08 mov r8, #0 ROM:00D5D1EE loc_D5D1EE: ; CODE XREF: sub_D5D1A6+16j ROM:00D5D1EE ; sub_D5D1A6+36j ... ROM:00D5D1EE F0 48 mov r4, r8 ROM:00D5D1F0 98 80 mov r8, [r0+] ROM:00D5D1F2 DB 00 rets |
На первый взгляд код различается, но, взяв спецификацию на c166 микропроцессор и внимательно изучив его методы адресации, мы твердо можем сказать, что это все тот же код. Осталось понять, что вызовы с адресов C452B0 и C452BA - это все те же вызовы AcquireGbsLock и FreeGbsLock соответственно. Убедившись, что найденный код - именно то, что мы искали, получаем результат:
;Patch: Indifferent Logo ;Firmware: C45 50 ;Release: 15.01.06 ;Author: BoBa!®
;Лого в роуминге=================================================== 0x0452AE: 3D03 CC00 |
Продолжение следует...
Список использованной и рекомендованной к прочтению литературы:
- C166S V1 Core, Instruction Set and Subsystem User's Guide (© Infinion)
- FAQ начинающего прошивкокопателя С166 (© bbsc)
- Исследование Siemens SL45(i) (© mamaich)
- Как самому стать патчером? (Siemens x65-x75) (©1nvisible)
- Копаем ФуллФлэш (© AlexSid)
- Погружение в IDA + ARM и Siemens X65 или как стать патчером (allsiemens.com)
Хотелось бы выразить благодарность всем причастным к появлению этой статьи на свет:
DarkBear за личный пример
Skylord за точку входа (в обоих смыслах)
Unlock за пинки
Sinclair, avkiev, Rst7 за поддержку и терпение
jagr за неоценимый литературный вклад ;)
|