Портирование патчей.

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 фуллфлеша.

  1. Добавим маппинг для c35, мапим с адреса 0x800000 в адрес 0xC00000 (начало фуллфлеша c35) длинной 0x400000 (размер фуллфлеша c35):
    "Add mapping": From -> 0x800000; To -> 0xC00000; Size -> 0x400000

  2. Настроим организацию памяти. Выставим начало ПЗУ 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

  3. Выберем устройство. Как известно в мобильных телефонах Siemens по x55 серию включительно используется микроконтроллер семейства E-Gold основанные на микропроцессоре c166. E-Gold'a в списке нет, по этому оставим по умолчанию c165
    "Choose the device name": C165

  4. Выберем загружаемую информацию. Снимем флажок "Memory layout", т.к. организация памяти E-Gold отличается от C166, да и лишние сегменты нам ни к чему.
    "Loaded information type": "I/O ports"; "Interrupts".

  5. После некоторой паузы мы увидим следующее:

  6. Теперь удалим все сегменты, созданные IDA, кроме RAM и ROM. Есть практика разбивать адресное пространство на сегменты и страницы в зависимости от того, для чего используется конкретная область, но для нашей задачи это принесет больше неудобств, чем преимуществ (при разбивке на сегменты упростится указание адресации в коде, но усложнятся переходы по коду. Необходимо будет в месте с адресом помнить тип сегмента. Без разбивки нужно помнить только адрес. Невозможно будет указать некоторые адреса в коде, что не помешает указать их в комментариях).
    View -> OpenSubview -> Segments

  7. Расширим сегмент RAM до 0xC00000 (начало фуллфлеша с35 в адресном пространстве телефона)


    Отвечаем "Yes"

  8. Дважды кликнем на сегменте ROM и видим следующую картину:

    не правда ли не совсем то, что мы ожидали?

Отвлечемся еще немного. Мы имеем загруженный фуллфлеш в IDA. Чтобы IDA начала дисассемблировать нужно указать ей entrypoint (точка входа) и постепенно открывать то что нужно, либо указать сразу всю область которую нужно открыть. Каждый способ имеет как плюсы, так и минусы. Первый не откроет и десятой части кода, но будет открывать только код. Второй же откроет всю указанную область, но при этом данные, которые идут вперемешку с кодом, представит как код. Мы воспользуемся вторым т.к. он вполне подходит для нашей текущей задачи, а в последствии Вы сможете отличать код от данных беглым взглядом.

  1. Нажимаем "G" (Jump to address...) и вводим адрес 0xС00000 (начало фуллфлеша в адресном пространстве c35) и переходим на начало фуллфлеша:

  2. Нажимаем Ctrl+Shift+PageDown и выделяем весь сегмент ROM, нажимаем "C" (code) для преобразования выделенной области в код и нажимаем "Force"

    идем курить (вредно для здоровья) и пить кофе (не менее вредно) - будет некий тормоз, затем анализ кода.

  3. Ждем зеленого сигнала:

  4. Сохраняем 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

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


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

  1. C166S V1 Core, Instruction Set and Subsystem User's GuideInfinion)
  2. FAQ начинающего прошивкокопателя С166bbsc)
  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г.


Обновлено: 29.06.2007
Copyright by BoBa!®