SITE LOGO Пятница, 2024-05-17, 2:00 PM
Приветствую Вас EZIZ DOST! | RSS
Главная страница | Megaleler-Media ve s. | Регистрация | Вход
Меню сайта
Категории каталога
Мои статьи [3]
Наш опрос
ay camahat Brusli vurar ya Vandam?

[ Результаты · Архив опросов ]

Всего ответов: 24
Форма входа
Поиск по каталогу
Друзья сайта
Статистика
Начало » Статьи » Мои статьи

Портирование патчей
Портирование патчей
"Перед данной статьей не стоит задача научить Вас писать патчи. Для этого нужно обладать некой долей авантюризма, знанием и опытом ассемблера, знанием аппаратного устройства микроконтроллера телефона. И прививание всего этого выходит за рамки статьи. Но должна помочь Вам сделать первый шаг к этому и портировать патч для Вашего редкого телефона или новой прошивки, не прибегая к помощи вечно занятых гуру."

Patch – заплатка (англ.)

Как теперь уже многим известно, 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. А вот на второй остановимся поподробнее. Перед данной статьей не стоит задача научить Вас писать патчи. Для этого нужно обладать некой долей авантюризма, знанием и опытом ассемблера, знанием аппаратного устройства микроконтроллера телефона. И прививание всего этого выходит за рамки статьи. Но должна помочь Вам сделать первый шаг к этому и портировать патч для Вашего редкого телефона или новой прошивки, не прибегая к помощи вечно занятых гуру.

Пожалуй, приступим. По сложности портирования, патчи можно разделить на три группы:

1. Непосредственное изменение кода. Обычно это патчи в несколько байт, не использующие свободное место в фуллфлеше. Как правило, это изменение условного перехода на безусловный, или отключение вызова той или иной функции, или изменение какого-либо параметра. Обычно легки в портировании.

2. Врезка своего кода в ту или иную функцию. Эти патчи используют свободное место в фуллфлеше. Могут быть от нескольких байтов до нескольких килобайтов. Основная сложность при портировании – в нахождении всех используемых патчем функций.

3. Патчи, использующие значения в ОЗУ телефона. Сложность при портировании состоит в поиске заветного адреса в ОЗУ.

Все патчи относятся к той или иной группе или к нескольким сразу. Разобьем нашу статью на части соответственно этим группам и приступим непосредственно к портированию.

Дальнейшие примеры будут на основе x35 серии. Но все это применимо ко всей E-Gold серии телефонов (по x55 включительно), что же касается ARM телефонов (x65 и выше), то общий смысл остается, меняется лишь ассемблер.

Часть 1.

Для портирования патчей нам понадобятся следующие программы: IDA (дизассемблер, в примерах используется версия 4.8.0.847) и PatSearch (поиск сигнатур).

Сначала научимся загружать фуллфлеш в IDA (о том, как слить фуллфлеш с телефона, читайте FAQ). Пусть это будет фуллфлеш 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, r0ROM:00C1D7D6 66 FC FF 3F and r12, #3FFFhROM:00C1D7DA F2 FD 02 FE mov r13, DPP1ROM:00C1D7DE DA D5 A6 D1 calls 0D5h, sub_D5D1A6ROM:00C1D7E2 48 40 cmp r4, #0ROM:00C1D7E4 3D 10 jmpr cc_NZ, loc_C1D806ROM:00C1D7E6 DA C1 BE D1 calls 0C1h, sub_C1D1BEROM:00C1D7EA F0 E4 mov r14, r4ROM:00C1D7EC F0 F5 mov r15, r5ROM:00C1D7EE F0 C0 mov r12, r0ROM:00C1D7F0 66 FC FF 3F and r12, #3FFFhROM:00C1D7F4 F2 FD 02 FE mov r13, DPP1ROM:00C1D7F8 DA D5 A6 D1 calls 0D5h, sub_D5D1A6ROM:00C1D7FC 48 40 cmp r4, #0

ROM:00C1D7FE 3D 03 jmpr cc_NZ, loc_C1D806

ROM:00C1D800 E6 F4 20 4E mov r4, #4E20hROM:00C1D804 0D 02 jmpr cc_UC, loc_C1D80AROM:00C1D806 ; --------------------------------------------------------ROM:00C1D806 loc_C1D806: ; CODE XREF: sub_C1D6E4+100jROM:00C1D806 ; sub_C1D6E4+11AjROM:00C1D806 E6 F4 FF FF mov r4, #0FFFFhROM:00C1D80A loc_C1D80A: ; CODE XREF: sub_C1D6E4+EjROM:00C1D80A ; sub_C1D6E4+78j ...ROM:00C1D80A 08 04 add r0, #4ROM:00C1D80C DB 00 rets

4. Выделяем произвольный кусок кода вокруг нашего патча и копируем в буфер обмена:

ROM:00C1D7D4 F0 C0 mov r12, r0ROM:00C1D7D6 66 FC FF 3F and r12, #3FFFhROM:00C1D7DA F2 FD 02 FE mov r13, DPP1ROM:00C1D7DE DA D5 A6 D1 calls 0D5h, sub_D5D1A6ROM:00C1D7E2 48 40 cmp r4, #0ROM:00C1D7E4 3D 10 jmpr cc_NZ, loc_C1D806ROM:00C1D7E6 DA C1 BE D1 calls 0C1h, sub_C1D1BEROM:00C1D7EA F0 E4 mov r14, r4ROM:00C1D7EC F0 F5 mov r15, r5ROM:00C1D7EE F0 C0 mov r12, r0

ROM:00C1D7F0 66 FC FF 3F and r12, #3FFFhROM:00C1D7F4 F2 FD 02 FE mov r13, DPP1ROM:00C1D7F8 DA D5 A6 D1 calls 0D5h, sub_D5D1A6ROM:00C1D7FC 48 40 cmp r4, #0ROM:00C1D7FE 3D 03 jmpr cc_NZ, loc_C1D806ROM:00C1D800 E6 F4 20 4E mov r4, #4E20hROM:00C1D804 0D 02 jmpr cc_UC, loc_C1D80AROM:00C1D806 ; --------------------------------------------------------ROM:00C1D806 loc_C1D806: ; CODE XREF: sub_C1D6E4+100jROM:00C1D806 ; sub_C1D6E4+11AjROM:00C1D806 E6 F4 FF FF mov r4, #0FFFFh

ROM:00C1D80A loc_C1D80A: ; CODE XREF: sub_C1D6E4+EjROM:00C1D80A ; sub_C1D6E4+78j ...ROM:00C1D80A 08 04 add r0, #4ROM:00C1D80C DB 00 rets

5. Вставляем в PATSearch:

Нажимаем "GO".

6. Выбираем фуллфлеш S35 2504:

7. Получаем адрес C1DF9C

8. Загружаем в IDA фуллфлеш S35 2504

9. Переходим по адресу C1DF9C, и видим абсолютно такой же кусок кода, в том числе и нашу команду условного перехода, которую мы патчим:

ROM:C1DF80 F0 C0 mov r12, r0ROM:C1DF82 66 FC FF 3F and r12, #3FFFhROM:C1DF86 F2 FD 02 FE mov r13, DPP1ROM:C1DF8A DA E3 FE 4D calls 0E3h, loc_E34DFEROM:C1DF8E 48 40 cmp r4, #0ROM:C1DF90 3D 0D jmpr cc_NZ, loc_C1DFACROM:C1DF92 DA C1 38 D9 calls 0C1h, loc_C1D938ROM:C1DF96 F0 E4 mov r14, r4ROM:C1DF98 F0 F5 mov r15, r5ROM:C1DF9A F0 C0 mov r12, r0ROM:C1DF9C 66 FC FF 3F and r12, #3FFFhROM:C1DFA0 F2 FD 02 FE mov r13, DPP1ROM:C1DFA4 DA D9 EA 37 calls 0D9h, loc_D937EAROM:C1DFA8 48 40 cmp r4, #0

ROM:C1DFAA 3D 03 jmpr cc_NZ, loc_C1DFB2

ROM:C1DFAC loc_C1DFAC: ; CODE XREF: ROM:C1DF72jROM:C1DFAC ; ROM:C1DF90jROM:C1DFAC E6 F4 20 4E mov r4, #4E20hROM:C1DFB0 0D 02 jmpr cc_UC, loc_C1DFB6
ROM:C1DFB2 ; ------------------------------------------------------ROM:C1DFB2 loc_C1DFB2: ; CODE XREF: ROM:C1DF58jROM:C1DFB2 ; ROM:C1DF7Ej ...ROM:C1DFB2 E6 F4 FF FF mov r4, #0FFFFhROM:C1DFB6 loc_C1DFB6: ; CODE XREF: ROM:C1DE6CjROM:C1DFB6 ; ROM:C1DED6j ...ROM:C1DFB6 08 04 add r0, #4ROM: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_CA1E92ROM:C45294 DA DA 8E 91 calls 0DAh, sub_DA918EROM:C45298 48 40 cmp r4, #0ROM:C4529A 3D 0A jmpr cc_NZ, loc_C452B0ROM:C4529C DA C4 54 4A calls 0C4h, sub_C44A54ROM:C452A0 DA CA 74 C0 calls 0CAh, sub_CAC074ROM:C452A4 F2 FD 02 FE mov r13, DPP1ROM:C452A8 DA D7 B2 19 calls 0D7h, sub_D719B2ROM:C452AC 48 40 cmp r4, #0ROM:C452AE 3D 05 jmpr cc_NZ, loc_C452BAROM:C452B0 loc_C452B0: ; CODE XREF: sub_C451B0+A6jROM:C452B0 ; sub_C451B0+D2j ...ROM:C452B0 DA CC 68 A8 calls 0CCh, sub_CCA868ROM:C452B4 E6 F4 20 4E mov r4, #4E20hROM:C452B8 0D 04 jmpr cc_UC, loc_C452C2ROM:C452BA ; ----------------------------------------------------------ROM:C452BA loc_C452BA: ; CODE XREF: sub_C451B0+CjROM:C452BA ; sub_C451B0+42j ...ROM:C452BA DA CC 68 A8 calls 0CCh, sub_CCA868ROM:C452BE E6 F4 FF FF mov r4, #0FFFFhROM:C452C2 loc_C452C2: ; CODE XREF: sub_C451B0+108jROM:C452C2 08 04 add r0, #4ROM:C452C4 DB 00 rets

Как видно, код отличается. Отличается настолько, что его трудно, если не невозможно, искать при помощи PATSearch. Этот код был найден по паттерну команды mov r4, #4E20h (E6 F4 20 4E), который встречается в фуллфлеше c45 v50 один раз, что дает нам возможность говорить с большой долей вероятности, что это искомый кусок. Мы покажем, что это именно он. Для начала рассмотрим подпрограммы, вызываемые с адресов C4529C и C452A0:

ROM:C44A54 sub_C44A54: ; CODE XREF: sub_C3730A+4PROM:C44A54 ; sub_C37338+D5AP ...ROM:C44A54 DA CC 5E A8 calls 0CCh, sub_CCA85EROM:C44A58 E6 FC 9C 3A mov r12, #3A9ChROM:C44A5C E6 FD 0C 00 mov r13, #0ChROM:C44A60 88 C0 mov [-r0], r12ROM:C44A62 88 D0 mov [-r0], r13ROM:C44A64 DA CC 68 A8 calls 0CCh, sub_CCA868ROM:C44A68 FA CB 4C EA jmps 0CBh, loc_CBEA4C
ROM:CBEA4C loc_CBEA4C: ; CODE XREF: sub_C1253A+18JROM:CBEA4C ; sub_C12C0A+1AJ ...ROM:CBEA4C 98 D0 mov r13, [r0+]ROM:CBEA4E 98 C0 mov r12, [r0+]ROM:CBEA50 F0 4C mov r4, r12ROM:CBEA52 F0 5D mov r5, r13ROM:CBEA54 DB 00 rets

Вызовы с адресов C44A54 и C44A64 - это вызовы AcquireGbsLock и FreeGbsLock соответственно (управление семафором) и нас мало интересуют, т.к. не влияют на рассматриваемую функцию. Получается, что подпрограмма, вызываемая с адреса C4529C, соответствует подпрограмме, вызываемой с адреса C1D7E6 в C35 1804:

ROM:00C1D1BE sub_C1D1BE: ; CODE XREF: sub_C12296+ABEPROM:00C1D1BE ; sub_C1D6E4+102P ...ROM:00C1D1BE E6 F4 3A 26 mov r4, #263AhROM:00C1D1C2 E6 F5 40 00 mov r5, #40h ; '@'ROM:00C1D1C6 DB 00 rets

вызов с C452A0:

ROM:CAC074 sub_CAC074: ; CODE XREF: sub_C451B0+C4PROM:CAC074 ; sub_C451B0+F0P ...ROM:CAC074 F0 E4 mov r14, r4ROM:CAC076 F0 F5 mov r15, r5ROM:CAC078 FA CA 80 1E jmps 0CAh, loc_CA1E80
ROM:CA1E80 loc_CA1E80: ; CODE XREF: ROM:CA8B92JROM:CA1E80 ; sub_CA9A9C+4J ...ROM:CA1E80 F0 C0 mov r12, r0ROM:CA1E82 66 FC FF 3F and r12, #3FFFhROM:CA1E86 DB 00 rets

соответствует:

ROM:00C1D7EA F0 E4 mov r14, r4ROM:00C1D7EC F0 F5 mov r15, r5ROM:00C1D7EE F0 C0 mov r12, r0ROM:00C1D7F0 66 FC FF 3F and r12, #3FFFh

Теперь рассмотрим вызов с адреса C452A8:

ROM:D719B2 sub_D719B2: ; CODE XREF: sub_C37124+10PROM:D719B2 ; sub_C37146+70P ...ROM:D719B2 E0 21 mov r1, #2ROM:D719B4 DC 4D extp r13, #1ROM:D719B6 99 4C movb rl2, [r12+]ROM:D719B8 DC 4F extp r15, #1ROM:D719BA 99 6E movb rl3, [r14+]ROM:D719BC 41 46 cmpb rl2, rl3ROM:D719BE 3D 12 jmpr cc_NZ, loc_D719E4ROM:D719C0 DC 4D extp r13, #1ROM:D719C2 99 4C movb rl2, [r12+]ROM:D719C4 66 F2 0F 00 and r2, #0FhROM:D719C8 DC 4F extp r15, #1ROM:D719CA 99 6E movb rl3, [r14+]ROM:D719CC 66 F3 0F 00 and r3, #0FhROM:D719D0 40 23 cmp r2, r3ROM:D719D2 3D 08 jmpr cc_NZ, loc_D719E4ROM:D719D4 E0 11 mov r1, #1ROM:D719D6 DC 4D extp r13, #1ROM:D719D8 A9 4C movb rl2, [r12]ROM:D719DA DC 4F extp r15, #1ROM:D719DC A9 6E movb rl3, [r14]ROM:D719DE 41 46 cmpb rl2, rl3ROM:D719E0 3D 01 jmpr cc_NZ, loc_D719E4ROM:D719E2 E0 01 mov r1, #0ROM:D719E4 loc_D719E4: ; CODE XREF: sub_D719B2+CjROM:D719E4 ; sub_D719B2+20j ...ROM:D719E4 F0 41 mov r4, r1ROM:D719E6 DB 00 rets

и вызов с адреса C1D7F8 в C35 1804:

ROM:00D5D1A6 sub_D5D1A6: ; CODE XREF: sub_C120BA+72PROM:00D5D1A6 ; sub_C120BA+8EP ...ROM:00D5D1A6 88 80 mov [-r0], r8ROM:00D5D1A8 E0 28 mov r8, #2ROM:00D5D1AA F6 FD 00 FE mov DPP0, r13ROM:00D5D1AE ; assume dpp0: 0 (page 0x0)ROM:00D5D1AE CC 00 nopROM:00D5D1B0 99 2C movb rl1, [r12+]ROM:00D5D1B2 F6 FF 00 FE mov DPP0, r15ROM:00D5D1B6 CC 00 nopROM:00D5D1B8 99 4E movb rl2, [r14+]ROM:00D5D1BA 41 24 cmpb rl1, rl2ROM:00D5D1BC 3D 18 jmpr cc_NZ, loc_D5D1EEROM:00D5D1BE F6 FD 00 FE mov DPP0, r13ROM:00D5D1C2 CC 00 nopROM:00D5D1C4 99 2C movb rl1, [r12+]ROM:00D5D1C6 C0 21 movbz r1, rl1ROM:00D5D1C8 66 F1 0F 00 and r1, #0FhROM:00D5D1CC F6 FF 00 FE mov DPP0, r15ROM:00D5D1D0 CC 00 nopROM:00D5D1D2 99 4E movb rl2, [r14+]ROM:00D5D1D4 C0 42 movbz r2, rl2ROM:00D5D1D6 66 F2 0F 00 and r2, #0FhROM:00D5D1DA 40 12 cmp r1, r2ROM:00D5D1DC 3D 08 jmpr cc_NZ, loc_D5D1EEROM:00D5D1DE E0 18 mov r8, #1ROM:00D5D1E0 DC 4D extp r13, #1ROM:00D5D1E2 A9 2C movb rl1, [r12]ROM:00D5D1E4 DC 4F extp r15, #1ROM:00D5D1E6 A9 4E movb rl2, [r14]ROM:00D5D1E8 41 24 cmpb rl1, rl2ROM:00D5D1EA 3D 01 jmpr cc_NZ, loc_D5D1EEROM:00D5D1EC E0 08 mov r8, #0ROM:00D5D1EE loc_D5D1EE: ; CODE XREF: sub_D5D1A6+16jROM:00D5D1EE ; sub_D5D1A6+36j ...ROM:00D5D1EE F0 48 mov r4, r8ROM: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

Продолжение следует...

--------------------------------------------------------------------------------

Список использованной и рекомендованной к прочтению литературы:

1. C166S V1 Core, Instruction Set and Subsystem User's Guide (©Infinion)
2. FAQ начинающего прошивкокопателя С166 (©bbsc)
3. Исследование Siemens SL45(i) (©mamaich)
4. Как самому стать патчером? (Siemens x65-x75) (©1nvisible)
5. Копаем ФуллФлэш (©AlexSid)
6. Погружение в IDA + ARM и Siemens X65 или как стать патчером (allsiemens.com)

--------------------------------------------------------------------------------

Хотелось бы выразить благодарность всем причастным к появлению этой статьи на свет:

DarkBear за личный пример
Skylord за точку входа (в обоих смыслах)
Unlock за пинки
Sinclair, avkiev, Rst7 за поддержку и терпение
jagr за неоценимый литературный вклад ;)

©BoBa!®
январь 2006г.

--------------------------------------------------------------------------------

Категория: Мои статьи | Добавил: azerbaycan2006 (2006-07-25)
Просмотров: 1622 | Комментарии: 2 | Рейтинг: 0.0 |

Всего комментариев: 1
1. Арахнида 2008-12-01, 0:04 AM
Статья на самом деле весьма полезна.
Но просьба автору оформи её получше, читать не удобно(

Имя *:
Email *:
Код *:
Copyright MyCorp © 2006