Перейти к содержанию
Old Phone Forum
  • Вход

    Вы сейчас не залогинены на форуме.

    Для возможности комментариев, загрузки файлов, подписок на ответы - вам надо войти.

Портирование патчей на Agere-модели


Рекомендуемые сообщения

Итак, в окне компилятора мы имеем следующий текст:

 

.equ uhActivateVibrator 0x205703EA

.equ GSMStartTimer 0x2062F40C

 

0x203F8CDA:

ldr r0,=0x217D0000+1

bx r0

;.hex 1E230818C25E1C23C15E

 

0x217D0000:

ldr r0,[sp]

cmp r0,#0xAD

blt exit

cmp r0,#0xF4

bgt exit

push {r1-r3}

MOV R0, 1

BL uhActivateVibrator

LDR R2, =stop+1

MOV R1, 15

LDR R0, =0x0000081D

MOV R3, #0x0

BL GSMStartTimer

pop {r1-r3}

exit:

LDR R0, =0x000033E0

mov r4,r2

mov r3,#0x1E

add r0,r1,r0

ldsh r2,[r0,r3]

ldr r3,=0x203F8CE4+1

bx r3

stop:

push {r0,lr}

mov r0,0

BL uhActivateVibrator

pop {r0,pc}

 

Процесс переноса(портирования) патча обычо заключается в подмене адресов. Начинаем с подмены адресов функций, которые объявлены через .equ:

 

1) uhActivateVibrator

Нам известно название функции. Первым делом нужно попытаться найти функцию по названию в Символах. Для этого переходим на вкладку Символы (в окне с прошивкой U300), вставляем название функции (uhActivateVibrator) в самое верхнее текстовое поле (где справа значок лупы) и жмём на эту самую лупу или на Enter. Когда программа находит функцию, она выделяет строку с ней, но в нашем случае этого не произошло. Можете попробовать поискать функцию в символах U600 и увидите, что там эта функция найдётся. В символах U300 этой функции нет, значит придётся её искать.

 

Самый первый и лёгкий способ поиска функции - по HEX коду её начала. Такой способ проходит только когда прошивки сильно похожи между собой. Итак, мы нашли функцию uhActivateVibrator в символах U600. Строка с этой функцией выделилась, кликаем по ней 2 раза, чтобы программа перешла в прошивке на это место. Переходим на вкладку Код и смотрим, как выглядит функция:

 

1 столбик - это адрес расположения команды

2 столбик - это HEX код команды

3 столбик - это непосредственно команда

4 столбик - это операнды для команды

5 столбик - это комментарии

 

По HEX коду в разных прошивках обычно совпадают только те команды, которые не содержат в себе адреса или смещения. Команды, которые в операндах содержат адрес (переходы, вызовы функций BL и др.) или смещение (например, LDR R0,[R1,смещение]) имеют различный HEX код. Дальше мы это учтём, а сейчас нам нужно скопировать HEX-код начала нашей функции до команды BL. Почему до команды BL? ну просто это оптимальный вариант, и такой последовательности байт хватит, чтобы найти функцию в U300. Чтобы выделить, запоминаем HEX-код той команды, до которой нам нужно выделить. В нашем случае это команда BL UHVibrator, которая имеет код 52F41CFA. Запомните визуально этот код и перейдите на вкладку Hex. Теперь нам нужно выделить байты до 52F41CFA, т.е. 70B5041C394D07D001202860 (выделяем мышкой). Теперь нажимаем Ctrl + C, чтобы скопировать.

 

Итак, мы скопировали в буфер обмена HEX-последовательность, содержащию коды команды начала функции uhActivateVibrator до вызова BL. Теперь переходим в окно с прошивкой U300, переходим в нём на вкладку Поиск и вставляем из буфера при помощи Ctrl + V в текстовое поле нашу последовательность. Пытаемся найти такую последовательность, нажам на Enter. Как видите, результатов поиска нет, потому что в этой последовательности есть коды команды с адресами, которые имеют другой код в прошивке U300.

 

При поиске в программе BinEdit те символы, которые могут быть любыми, можно заменить знаком ?. Переходим в окно с прошивкой U600, переходим на вкладку Код и и ищем команды, которые могли помешать нашему поиску. Очевидно, что это команда LDR R5, =0x30007F78, потому что она содержит адрес. Смотрим код этой команды слева: 394D, переходим в окно с прошивкой U300 и смотрим на нашу последовательность. Находим глазами код "мешающей" команды 394D, стираем это в последовательности, а вместо него ставим ????, т.к. там могут быть любые символы. Получается, что теперь мы будем искать 70B5041C????07D001202860, но поиск этой последовательности тоже ничего не даёт.

 

Переходим в окно с прошивкой U600 и дальше смотрим, какая команда нам может ещё мешать. Очевидно, что это BEQ loc_20570402, т.к. она тоже содержит адрес. Опять смотрим на её код 07D0, переходим в окно с U300 и заменяем 07D0 в нашей последовательности вопросами. Получается, что мы будем искать 70B5041C????????01202860. Жмём Enter и Вуаля! Появились результаты поиска.

 

Жмём на Плюсик слева, раскроется список найденных адресов, он у нас один. Жмём по нему 2 раза левой кнопкой. Программа BinEdit не понятно почему имеет такую особенность переходить на на сам адрес, а на адрес - 0x10. Наш адрес - это 2029672E, а программа перешла на 2029671E. В окне с кодом кликнем 2 рзаа левой кнопкой слева на адрес 2029672E, чтобы перейти уже конкретно на него. Теперь можно визуально сравнить как выглядят функции в U600 и U300. Визально они немного не похожи, но будьте уверены, чтобы мы нашли uhActivateVibrator в U300, просто по каким-то причинам она немного отличается.

 

Пример получился сложным, обычно в начале функции побольше команд без адресов, и поиск не составляет особого труда. Итак, адрес функции uhActivateVibrator в U300 - 2029672E (функции в основном начинаются с команды PUSH). Переходим в окно компилятора и заменяем вверху адрес для функции uhActivateVibrator с 0x205703EA на 0x2029672E.

 

Как переваришь, оптисывайся, продолжим.

  • Like 5
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 71
  • Создана
  • Последний ответ

Топ авторов темы

...Программа BinEdit не понятно почему имеет такую особенность переходить на на сам адрес, а на адрес - 0x10...

dаs, в BinEdit в настройках надо поставить "Смещать начало показа кода на.. => 0 байт" и всё будет ок :(

Инструкция -- просто супер!!! продолжай в том же духе! :67:

  • Like 1

Тормозит Gravity Defiended? Тебе

сюда. Любишь музыку, но не влазит новый альбом? Тебе сюда.

Хочешь смотреть качественное видео на мобильном? Тебе

СЮДА!

Кризис?! Нету денег на хорошие наушники? Тебе СЮДА!

Ссылка на комментарий
Поделиться на другие сайты

При поиске в программе BinEdit те символы, которые могут быть любыми, можно заменить знаком ?. Переходим в окно с прошивкой U600, переходим на вкладку Код и и ищем команды, которые могли помешать нашему поиску. Очевидно, что это команда LDR R5, =0x30007F78, потому что она содержит адрес. Смотрим код этой команды слева: 394D, переходим в окно с прошивкой U300 и смотрим на нашу последовательность. Находим глазами код "мешающей" команды 394D, стираем это в последовательности, а вместо него ставим ????, т.к. там могут быть любые символы. Получается, что теперь мы будем искать 70B5041C????07D001202860, но поиск этой последовательности тоже ничего не даёт.

 

Переходим в окно с прошивкой U600 и дальше смотрим, какая команда нам может ещё мешать. Очевидно, что это BEQ loc_20570402, т.к. она тоже содержит адрес. Опять смотрим на её код 07D0, переходим в окно с U300 и заменяем 07D0 в нашей последовательности вопросами. Получается, что мы будем искать 70B5041C????????01202860. Жмём Enter и Вуаля! Появились результаты поиска.

 

На вкладке Код есть кнопка для копирования, там можн скопировать данные как Hex код, так и как уже готовую сигнатуру для поиска. Ещё в строке поиска есть кнопка "T" которая может расставить ? в соответсвии с командами THUMB и "A" для команд ARM

  • Like 6

Одна из последних версий binedit здесь.

AlexeyK.gif

Ссылка на комментарий
Поделиться на другие сайты

ZhekSooN,

AlexeyK,

спасибо, вот и я чему-нибудь здесь научусь. Но всё-таки эффективнее самому формировать сигнатуру, ибо автоматически сформированная сигнатура нашлась очень много раз.

Ссылка на комментарий
Поделиться на другие сайты

Прошу прощения что надолго пропадаю. Просто не всегда блага цивилизации оказываються под рукой. Попробывал повторил, вроде получилось. Вторую функцию нашел уже в файле sym. Заменил сохранил. Но чует мое сердце это далеко не все:ak: А потому я требую продолжения банкета! :be:

Изменено пользователем leonne
Ссылка на комментарий
Поделиться на другие сайты

leonne,

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

Ссылка на комментарий
Поделиться на другие сайты

Понятно. А вот такой вопрос. Найденые функции как я понимаю надо доболять в фаил sym? А как? Я пробывал но новую запись делать не хочет, редактирует уже существующие!

Ссылка на комментарий
Поделиться на другие сайты

leonne, да простым текстовым редактором дополни, только не путай адресацию... все по порядку :(

  • Like 1
Ссылка на комментарий
Поделиться на другие сайты

Пока суть да дело я тут ковыряюсь по-тихоньку. В общем пошел тем же самым путем что при поиске функций. Нашел кк я думаю адреса соответствующие прошивке но не все не могу понять что за адрес 0x000033E0 и 0x0000081D. На них ссылаються команды LDR в патче, также не могу найти соотствующий картинке под номером 0x1E для пошивки u300 прога которой искал картинки в прошивке U300 для u600 не прокатывает. А остальное вроде понял результат своих творений прикладываю.MainMenuVib.rar Я думаю это адреса смешений. А чем можно картинки в прошивке поглядеть?

Изменено пользователем leonne
  • Like 1
Ссылка на комментарий
Поделиться на другие сайты

что за адрес 0x000033E0 и 0x0000081D

это не адреса, это константы(числа). Возникли очень сильные проблемы с сессией, поэтому до её окончания отвечать нет возможности, жди ответа и продолжения ориентировочно с 1 февраля :)

Ссылка на комментарий
Поделиться на другие сайты

leonne,

в панели инструментов компилятора есть кнопка Компилировать, нужно нажать на чёрную стрелочку рядом и выбрать Компилировать в sre (только этот вариант и никакой более), указываем путь и получаем sre-патч. Если sre не нравится, просто меняем расширение файла с sre на s3 :)

Ссылка на комментарий
Поделиться на другие сайты

Конвертировал в фаил sre, переименовал, сравнил. При конвертировании в sre, фаил такой же, как и при конвертровании s3. Разницы нет.

Ссылка на комментарий
Поделиться на другие сайты

leonne,

у меня компиляция в S3 работает криво :)

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Привет всем. Обьясните кто нить что за адреса 0x4??????? и 0x3???????. Как их искать не очень понятно. Что такое константы и где их брать? Еще есть какие то короткие адреса типа #0x1E. Тож не понятно сначала думал что картинки, но эт оказалось не так. В общем вопросов море, а ответов нет.

Ссылка на комментарий
Поделиться на другие сайты

leonne,

всё, сёдня сдал последний экзамен, сёдня-завтра продолжим тут :idea:

  • Like 1
Ссылка на комментарий
Поделиться на другие сайты

leonne,

Сначала отвечу на твои вопросы.

 

не могу понять что за адрес 0x000033E0 и 0x0000081D

как я говорил, это не адреса, это числа в шестнадцатиричной системе. Если число начинается с 0x, То он ов шестнадцатиричной системе, если без 0x, то в десятичной.

 

А чем можно картинки в прошивке поглядеть?

ниже прикреплю read_pict для U600XEGG2.

 

что за адреса 0x4??????? и 0x3???????

Это адреса в какой-то неведомой области памяти, там обычно лежат адреса функций, например, адрес функции выделения динамической памяти и др. Позже расскажу, как ими пользуются.

 

Дальше отпишу ночью...

  • Like 2
Ссылка на комментарий
Поделиться на другие сайты

ага, с зачетом тебя! :) Прогу для картинок я уже нашел в архиве от нее и сделал вывод что это 0x1E не адрес картинки.

Ссылка на комментарий
Поделиться на другие сайты

Наконец я вошёл в колею, продолжаем..

 

Итак, мы нашли адрес функции uhActivateVibrator в прошивке U300 - Это 0x205703EA и заменили адрес функции в компиляторе в первой строке, начинающейся с .equ.

 

Аналогично найдём адрес функции GSMStartTimer, перейдём по её адресу: 0x2062F40C в U600 и видим, что у нас есть достаточно большой кусок без адресов и констант до команды BL. Смотрим на код команды BL (FFF766FF), запоминаем его, открываем вкладку Hex, выделяем и копируем в буфер код до FFF766FF, т.е. 10B582B0141C00220092221C. Ищем такой код в прошивке U300 и находим единственный вариант - 0x2057D54C, это и есть адрес функции GSMStartTimer в U300. Это тот самый лёгкий вариант поиска, о котором я говорил, т.е. когда мы имеем большой кусок в начале функции без адресов, BL, констант и др.

 

Заменяем адрес функции GSMStartTimer в компиляторе и получаем уже следующий текст:

 

.equ uhActivateVibrator 0x2029672E
.equ GSMStartTimer 0x2057D54C

 0x203F8CDA:
   ldr r0,=0x217D0000+1
   bx r0
   ;.hex 1E230818C25E1C23C15E

 0x217D0000:
   ldr r0,[sp]
   cmp r0,#0xAD
   blt exit
   cmp r0,#0xF4
   bgt exit
   push {r1-r3}
   MOV	R0, 1	
   BL	uhActivateVibrator	
   LDR	R2, =stop+1	
   MOV	R1, 15	
   LDR	R0, =0x0000081D	
   MOV	R3, #0x0	
   BL	GSMStartTimer	
   pop {r1-r3}
 exit:
   LDR	R0, =0x000033E0
   mov r4,r2
   mov r3,#0x1E
   add r0,r1,r0
   ldsh r2,[r0,r3]
   ldr r3,=0x203F8CE4+1
   bx r3
 stop:
   push {r0,lr}
   mov r0,0
   BL	uhActivateVibrator
   pop {r0,pc}

 

leonne молодец, он до этого догадался сам и самостоятельно уже нашёл эот адрес :epsna:

 

Теперь самое время поговорить об основном принципе написания патчей. Редко бывает, что патч состоит просто из замены какого-то адреса, команды и т.п. Патчи в основном состоят из нескольких или одной пар: место врезки и код врезки.

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

 

Как вы наверное уже поняли, место врезки - это адрес, по которому нужно выполнить код и по которому мы вставляется переход на новый участок памяти, а код врезки - это как раз тот код, который выполняется в свободном участке. В нашем случае мы имеем одну такую пару, где 0x203F8CDA - Это адрес места врезки, а 0x217D0000 - это адрес кода врезки.

 

Переход на новый адрес осуществляется парой команд:

ldr [регистр],=[адрес свободного места] + 1

bx [регистр]

 

Причём надо следить, чтобы на месте врезки регистр, через который мы осуществляем переход, не был занят какой-либо информацией. Перейдём в прошивке U600 по адресу врезки: 0x203F8CDA.Мы видим, что по этому адрес находится команда LDR R0, =0x000033E0, т.е. в регистр R0 записывается число 33E0, значит регистр R0 не занят, и мы можем его использовать для перехода.

 

Найдём эквивалент адреса врезки в U300: мы видим, что до команды BL мы имеем внушительный кусок кода, но первая команда у нас содержит число 0x000033E0, а в U300 уже может быть другое число в этом месте, и, соответственно, код этой команды там будет отличаться, поэтому нам нужно перейти на одну команду ниже, кликнув 2 раза по адресу 203F8CDC. Теперь копируеи кусок кода во вкладке Hex до кода команды BL - 141C1E230818C25E1C23C15E281C231C, ищем такой код в U300 И находим единственный вариант - 0x2036AF2A, но не стоит забывать, что в U600 мы сместились на одну команду вниз, поэтому в программе с открытой прошивкой U300 нам нужно переместиться на одну команду вверх от найденного адреса 0x2036AF2A. Для этого кликнем по этому адресу 2 раза в результатах поиска, чтобы перейти по нему, и нажмём стрелку вверх на внешнем скроллбаре (который правее).По аналогии с U600 мы видим, что команда LDR находится по адресу 0x2036AF28, поэтому в код патча в компиляторе мы уже можем менять адрес 0x203F8CDA на 0x2036AF28. Заметим, что бывают например такая ситуация: пусть в U300 по адресу 0x2036AF28 было бы LDR R1, =0x000033E0 вместо LDR R0, =0x000033E0. В этом случае переход на новый адрес нужно делать не через R0, а через регистр R1. В этом случае мы бы поменяли регистр в коде патча с R0 на R1.

 

Теперь возникает вопрос, а как же найти свободный регион в прошивке? Я в своих патчах использую память языковых ресурсов, которые редко используются - это языковые ресурсы начиная с языка Latviesu. При этом я себе составляю что-то вроде карты уже занятых патчами регионов, чтобы патчи не конфликтовали.

 

Рассмотрим, как найти начальный такой адрес. Для начала в окне BinEdit с открытой прошивкой U600 перейдём на вкладку символы, найдём функцию ker_get_name, перейдём по её адресу, кликнув на неё 2 раза, и мы увидим сразу после команды PUSH команду BL kit_get_menu?. Нам самом деле здесь должно быть BL kit_get_name, просто я перепутал название одного символа))

 

Перейдём на функцию kit_get_menu?, кликнув по ней 2 раза. Здесь мы видим один из редких случае, когда функция начинается не с команды PUSH. Обратите внимание на команду LDR R3, =ker_tab_menu, вот адрес ker_tab_menu нам и нужно найти в U300. Повезло, что в символах, что я выкладывал, уже найдена функция ker_get_name.

Переходим по ней, затес по адресу 2061F6B8. Тут есть единственный адрес, который может быть ker_tab_menu (он должен начинаться с 0x20) - Это 0x20F2A618. Заметим, что тут код не так уж похож на U600.

 

Итак, можем добавить в наш символьный файл строку:

 

0x20F2A618 T ker_tab_menu

 

открыв его при помощи блокнота, чтобы потом уже не искать этот адрес.

 

Перейдём в прошивке U300 по этому адресу и откроем вкладку Hex. Это таблица языковых ресурсов меню телефона. Мы видим тут список таких составляющих: 4 байта - перевёрный в Little Endian адрес и 4 байта - такое же перевёрнутой число. Например, рассмотрим первые 8 байт:

38A9F120 08090000

 

Тут адрес 0x20F1A938 - это адрес таблицы языковых ресурсов для языка English, а число 0x980 - это количество элементов этой таблицы в Hex.

 

Далее мы видим четыре нуля, а затем опять 8 байт уже для русского языка. И так далее, составляющие таблицы расположены в том порядке, в котором расположены языки в меню выбора языка в телефоне (Меню - Настройки - Телефон - Язык).

 

Итак, нам нужно попасть на таблицу ресурсов для языка Latviesu. Он 4-й в списке, поэтому берём 4-й адрес в таблице - это 0x20F21598 и меняем в коде патча адрес 0x217D0000 на 0x20F21598. Также не забываем менять адрес в команды LDR выше на месте врезки. При портировании следующего патча с использованием свободной памяти я расскажу, как выбрать следующий свободный адрес.

 

Итак, мы уже имееи в результате:

 

.equ uhActivateVibrator 0x2029672E
.equ GSMStartTimer 0x2057D54C

 0x203F8CDA:
   ldr r0,=0x20F21598+1
   bx r0
   ;.hex 1E230818C25E1C23C15E

 0x20F21598:
   ldr r0,[sp]
   cmp r0,#0xAD
   blt exit
   cmp r0,#0xF4
   bgt exit
   push {r1-r3}
   MOV	R0, 1	
   BL	uhActivateVibrator	
   LDR	R2, =stop+1	
   MOV	R1, 15	
   LDR	R0, =0x0000081D	
   MOV	R3, #0x0	
   BL	GSMStartTimer	
   pop {r1-r3}
 exit:
   LDR	R0, =0x000033E0
   mov r4,r2
   mov r3,#0x1E
   add r0,r1,r0
   ldsh r2,[r0,r3]
   ldr r3,=0x203F8CE4+1
   bx r3
 stop:
   push {r0,lr}
   mov r0,0
   BL	uhActivateVibrator
   pop {r0,pc}

 

 

leonne, как переваришь, отпиши, в следующий раз мы уже закончим портировать этот патч. :49:

  • Like 6
Ссылка на комментарий
Поделиться на другие сайты

das писал:

Переходим по ней, затес по адресу 2061F6B8. Тут есть единственный адрес, который может быть ker_tab_menu (он должен начинаться с 0x20) - Это 0x20F2A618. Заметим, что тут код не так уж похож на U600.

Итак, можем добавить в наш символьный файл строку:

0x20F2A618 T ker_tab_menu

... Чет у меня выходят немного другие результаты. :)

У мну получилось что адрес 0x20F2A618

соответствует функции ker_tab_mesg.

Для функции ker_tab_menu нашел такой адрес 0x20F19F58. Я в поисках опирался на схожесть структур кода в прошивках. Проверь пожалуйста. А с остальым вроде разобрался.

Ссылка на комментарий
Поделиться на другие сайты

leonne,

Я сам немного запутался, где у меня ker_tab_menu, а где ker_tab_mesg, но здесь это не важно - нам без разницы, чью память использовать - память строк меню или память строк сообщений.

 

При портировании патча нужно понимать, для чего предназначена каждая строка кода и что она делает, поэтому пройдёмся по строкам кода патча (врезки) и посмотрим, что нам нужно изменять, а что нет:

 

Смысл патча таков: мы делаем врезку в том месте, которое выполняется при прорисовке картинки (в функцию вывода картинки на экран) и проверяем, если это иконка меню, то делаем краткую вибру.

 

ldr r0,[sp] - в R0 загружаем значение по адресу sp, где хранится номер картинки, которая рисуется в данным момент.

cmp r0,#0xAD - сравниваем номер картинки с 0xAD, где 0xAD - это номер первой в таблице иконки меню в программе read_pict. Напомню, что на предыдущей странице мы нашли, что номера картинок-иконок меню в U300 - это номера с 0x8B по 0xD2. Соответственно, номер первой картинки - 0x8B, поэтому заменяем 0xAD на 0x8B.

blt exit - если номер рисуемой картинки меньше номера первой (результат предыдущего сравнения), то просто выходим.

cmp r0,#0xF4 - сравниваем с номером последней картинки. Здесь 0xF4 соответственно меняем на 0xD2.

bgt exit - если больше последнего номера - тоже выходим.

 

Далее пойдёт кусок, который сделает короткую вибру.

 

 push {r1-r3}
MOV	R0, 1	
BL	uhActivateVibrator	
LDR	R2, =stop+1	
MOV	R1, 15	
LDR	R0, =0x0000081D	
MOV	R3, #0x0	
BL	GSMStartTimer	
pop {r1-r3}

 

Смысл здесь в том, что сначала вызывается функция uhActivateVibrator с параметром в R0 1, что включает вибрацию. Затем при помощи функции GSMStartTimer телефон ждёт столько тактов, сколько мы передадим в R1 (в нашем случае 15, соответственно, увеличивая это значение, можно увеличивать длину вибры), и после этого вызывает функцию, адрес котором передаётся в R2 (в нашем это адрес метки stop, где вибра останавливается). Вот так и получается короткая вибра. Перед вызовом функции таймера в R0 передаётся число - это что-то вроде ID таймера, вот это число для каждой прошивки своё. Здесь этот ID (да и вообще способ генерации вибры) я взял из функции входа в бесшумный режим, которая называется EnterSilentMode. Поэтому, чтобы найти, что передавать в R0 для U300, нам нужно найти функцию EnterSilentMode.

 

Переходим в U600 на вкладку Символы, находим строку с EnterSilentMode, переходим на эту функцию двойным кликом. Здесь нам нужно выбрать оптимальный кусок кода для поиска. Мне попался на глаза кусок с адреса 0x205BBF14 до 0x205BBF1C. Поэтому переходим на адрес 205BBF14 двойным кликом по нему, запоминаем код команды по адресу 205BBF1C (3C49), переходим на вкладку Hex и копируем кусок кода до 3C49 (0068042188430430).

В окне BinEdit с прошивкой U300 пытаемся найти этот код. Как видим, получается 2 варианта. Чтобы выбрать правильный, я поступаю так: перехожу назад на прошивку U600, ищу этот код и смотрю результаты. Здесь тоже 2 варианта, но правильный - первый по порядку (тот адрес, с которого мы как раз копировали этот код), поэтому в U300 смело считаем правильным первый по порядку вариант - т.е. адрес 0x205189A8. Но это ещё не адрес функции, переходим по адресу, открываем вкладку Код, поднимаемся вверх крайним скроллбаром до команды PUSH и видим, что адрес функции EnterSilentMode в U300 - это 0x2051899C. Смело можем добавить эту функцию в sym-файл.

 

В окне с U600 возьмите мышкой внутренный скроллбар и тащите его медленно, пока не увидите вызов функции GSMStartTimer. Убедитесь, что ID я дествительно взял отсюда, и теперь найдите этот вызов в U300. Как мы видим, 0x0000081D нам нужно заменить на 0x0000081E.

 

Теперь остался последний шаг - возврат из врезки, т.е. то, что идёт после метки exit. Во-первых, разместив переход на свободный участок в U600 по адресу 0x203F8CDA, мы затёрли стандартные команды, которые должны были выполниться. Если просто вернуться на том место, откуда был переход, то телефон будет зависать. Теперь здесь нам нужно восстановить те команды, которые мы затёрли.

Код команд перехода вида:

 0x203F8CDA:
ldr r0,=0x20F21598+1
bx r0

может занимать 8 или 10 байт. Это зависит от адреса, по которому располагается переход (в нашем случае 0x203F8CDA). Если этот адрес кратен 4, то код займёт 8 байт, иначе 10. Чтобы проверить кратность адреса 4-м, копируем в буфер адрес без 0x (в нашем случае 203F8CDA), открываем стандартный калькулятор, выбираем Вид - Инженерный, выбираем Hex и сочетанием Ctrl + V вставляем адрес в поле калькулятора. Затем переходим на Dec и делим число на 4. Если получается целое число, без 5-ти десятых, значит этот адрес кратен 4-м, иначе нет. В нашем случае получилось число 135258934.5, значит наш адрес не кратен 4-м и код перехода займёт 10 байт.

Знать, сколько байт займёт переход, важно для того, чтобы знать, сколько команд нужно востановить с места перехода. Перейдём в прошивке U600 по адресу, с которого был переход (0x203F8CDA). Для этого ниже вкладов Hex и Код поставим галочку справа от слова Адрес, вставим в поле 203F8CDA и нажмём Enter. А теперь посмотрите на команды, которые идут в коде патча после метки exit. Это повторение 5-ти команд из места перехода (т.к. одна команда (кроме команд BL и некоторых других) занимает 2 байта.

Поэтому теперь перейдём по адресу, с которого мы делаем переход в U300 ( 0x2036AF28). Кстати в предыдущем посте в окончательном варианте кода я забыл поменять адрес места врезки с 0x203F8CDA на 0x2036AF28.

Итак, нетрудно заметить, что 5 команд по этим адресам не отличаются друг от друга, поэтому мы можем их оставить такими же. Внимание, если бы в U600 у нас адрес был бы кратен 4-м, то это совсем не значит, что в U300 это тоже так. Если оставить это без внимания, мы можем затереть лишнюю команду и всё пойдёт на перекосяк. Поэтому, в U300 нам следовало бы проверить, кратен ли адрес 4-м, и если нет, то добавить ещё одну команду в дублирование затёртых команд и адрес возврата сместить на 2 вниз (читаем далее).

 

И последнее, что нам осталось - это вернуться обратно. Это осуществляется переходом:

 ldr r3,=0x203F8CE4+1
bx r3

 

Смотрим на прошивку U600 и видим, что возврат осуществляется на команду MOV R3, #0x1C, причём через регистр R3. Это не просто так, тут тоже нужно следить за тем, чтобы адрес перехода не затёр регистр с важной информацией, которая далее будет использоваться. Т.к. по адресу возврата в R3 записывается число 0x1C, то мы смело можем возвращаться через него. Теперь откроем прошивку U300 и видим, что команда MOV R3, #0x1C расположена по адресу 0x2036AF32, поэтому в коде патча меняем 203F8CE4 на 2036AF32.

 

Небольшой бонус: посмотрите на место перехода в прошивке U600, открыв окно с ней. Видите BL ker_PutPackedBitmap? А теперь откройте окно с прошивкой U300, на аналогичном месте стоит команда BL off_2040C820. Это означает, что адрес функции ker_PutPackedBitmap в U300 - 0x2040C820, можем записать это в sym. И вообще в процессе портирования патчей нужно замечать такие моменты и добавлять функции в sym-файл, чтобы потом ей вдруг не пришлось портировать отдельно.

 

Итак, вот окончательный код патча:

 

.equ uhActivateVibrator 0x2029672E
.equ GSMStartTimer 0x2057D54C

 0x203F8CDA:
   ldr r0,=0x20F21598+1
   bx r0
   ;.hex 1E230818C25E1C23C15E

 0x20F21598:
   ldr r0,[sp]
   cmp r0,#0x8B
   blt exit
   cmp r0,#0xF4
   bgt exit
   push {r1-r3}
   MOV	R0, 1	
   BL	uhActivateVibrator	
   LDR	R2, =stop+1	
   MOV	R1, 15	
   LDR	R0, =0x0000081E	
   MOV	R3, #0x0	
   BL	GSMStartTimer	
   pop {r1-r3}
 exit:
   LDR	R0, =0x000033E0
   mov r4,r2
   mov r3,#0x1E
   add r0,r1,r0
   ldsh r2,[r0,r3]
   ldr r3,=0x2036AF32+1
   bx r3
 stop:
   push {r0,lr}
   mov r0,0
   BL	uhActivateVibrator
   pop {r0,pc}

 

leonne, компилируй и проверяй :ak: Если всё будет нормально, выбирай следующий патч.

 

Об отмене: в исходниках патчей обычно принято оставлять по комментариями данные отмены. При компилировании в sre компилятор не делает отмены автоматически, поэтому приходится делать её вручную. Данные отмены в нашем случае - это ;.hex 1E230818C25E1C23C15E

; - это знак комментария, т.е. текст далее в этой строке не будет учтён при компиляции.

.hex - это команда вставки блока кода без изменений.

 

1E230818C25E1C23C15E - это по идее 10 байт кода, которые затирает переход, с места врезки в U600 (но здесь это не так, я забыл поменять данные отмены, когда делал 1.1 версию патча). Этот кусок кода нужно заменить на 10 байт кода из прошивки U300 с адреса врезки (0x2036AF28) - это F848141C1E230818C25E.

 

Чтобы создать патч отмены, создаём новый проект компилятора (как новый патч), вставляем туда:

 

 0x2036AF28:
 .hex F848141C1E230818C25E

и компилируем.

Данные по адресу 0x20F21598 восстанавливать не обязательно, т.к. тут мы затёрли всего лишь текстовые ресурсы.

  • Like 7
Ссылка на комментарий
Поделиться на другие сайты

Все ок все робит. 8) Большой Пасиб. Патч готов выкладываю в ветку патчей. Предлагаю портировать патч MissedCall1.5. И на его примере разобраться с адресами 0x3??????? и 0x4???????. И еще такой есть вопрос что означает выражение #0x14 это ссылки на рессурс? Где их брать?

Ссылка на комментарий
Поделиться на другие сайты

leonne,

Перед тем, как портировать Missed Call, нужно:

1) Портировать патч трассировки и научиться им пользоваться.

2) Портировать патч ATComm и слить дамп оперативки.

 

Это нам всё равно в будущем пригодится, поэтому будем делать это сейчас. Начнём с патча Trace. Вот его код для U600XEGG2:

 

.equ GSMsprintf 0x2062ECF8
.equ TB 0x300DCDF8
.equ ATSendReplyByEG 0x204B733E
.equ GSMstrlen 0x2062D270
.equ GSMstrcpy 0x2062D260
.equ GSMstrcat 0x2062D1FC
.equ p_GSMMalloc 0x040000B8
.equ p_GSMFree 0x040000BC


    0x217D0EC0:
     myTrace:
        push {r0-r7,lr}
	sub sp,8

		;Добавим к маске адрес вызова:
			;Выделим память:
			bl GSMstrlen
			add r0,4
			ldr r1,=p_GSMMalloc
			ldr r1,[r1]
			bl call_by_R1
			mov r6,r0			

		adr r1,="%X: "	;Это для вывода LR (адреса вызова)
		bl GSMstrcpy

		mov r0,r6
		ldr r1,[sp+8]
		bl GSMstrcat

		;Подготовим строку:
		ldr r0,=TB
		mov r1,r6
		ldr r2,[sp+40]	;r2=LR
		ldr r3,[sp+12]	;r3=R1
		ldr r4,[sp+16]	;r4=R2
		str r4,[sp]		;[sp]=R2
		ldr r4,[sp+20]	;r4=R3
		str r4,[sp+4]	;[sp+4]=R3
		bl GSMsprintf

		;Выведем в порт:
		mov r1,0
		ldr r0,=TB
		bl ATSendReplyByEG

			;Освободим память:
			ldr r1,=p_GSMFree
			ldr r1,[r1]
			mov r0,r6
			bl call_by_R1

	add sp,8
	pop {r0-r7,pc}
	.data

call_by_R1:
	bx r1

 

Открываем 2 прошивки, создаём новое окно компилятора в U300XEGJ1, вставляем туда этот код и начинаем портировать.

 

Для начала надо портировать функции, что в .equ. Итак, поехали (не забываем добавлять функции в символы):

 

1) .equ GSMsprintf 0x2062ECF8

Функцию найдём по коду 0FB400B58DB010A90C910190104802900F990C9A01A8 - получаем 0x205891A4

 

2) .equ TB 0x300DCDF8

Этот адрес уже есть в Сиимволах - 0x300D3A20

 

3) .equ ATSendReplyByEG 0x204B733E

Эту функцию находим по коду 30B5FFB0FFB083B0051C0C1C - получаем 0x20556D2A

 

4) .equ GSMstrlen 0x2062D270

Эту функцию находим по коду 002800D17047002100E0013102780130002A (несмотря на то, что в этом коде присутствуют команды с адресами, по нему находятся такие типовые функции, как работа со строками, числами и т.д.). Получаем 0x2057CA18

 

5) .equ GSMstrcpy 0x2062D260

Тут можно заметить, что эта функция лежит выше предыдущей функции GSMstrlen на 0x10 (16 в десятичной). Поэтому переходим по адресу функции GSMstrlen в U300 (0x2057CA18) и удостоверимся, так ли это здесь. Для этого внизу по середине, где выбрано число 4, выберем из раскрывающегося списка 16 и нажмём "-" слева. Тем самым мы сместимся на 16 байт вверх в прошивке (эту функция вообще очень удобная для перемещения по прошивке). Теперь перейдём по адресу функции GSMstrcpy в U600 (0x2062D260) и визуально сравним, как выглядит код прошивок U600 и U300 в этом месте. Видим, что одинаково, значит в U300 функция GSMstrcpy тоже на 0x10 выше от функции GSMstrlen, .т.е. лежит по адресу 0x2057CA08

 

6) .equ GSMstrcat 0x2062D1FC

Эту функцию найдём по коду 021C1378101C002B03D001321378002BFBD10B78013113700132002BF9D1704710B40 (такой длинный для того, чтобы отсечь другие варианты). Повторяюсь, что для других функцию такой метод поиска вряд ли пройдёт. Получаем 0x2057C9A4

 

7) .equ p_GSMMalloc 0x040000B8

Этот адрес не похож на другие адреса в оперативной памяти. Это адрес в какой-то специально области, где хранятся различные адреса (как правило, адреса различных функций). В этом случае по этом указателю хранится адрес функции выделения динамической памяти. Сейчас я расскажу, как искать такие адреса (собственно, также ищутся и другие обычные адреса в оперативной памяти).

Открываем окно с прошивкой U600? вставляем в поле поиска 040000B8 (адрес без 0x). Теперь нажмём на панели выше строки поиска красную букву А с лупой (ссылки на адрес). Программа найдёт места, где используется этот адрес. Открываем плюсик рядом с Ссылки на данные, переходим кликом по первому адресу (201B247C). Теперь надо выбрать блок кода без адресов, пригодный для поиска. Как видим, подходит довольно большой блок с 201B2486 до 201B249E. Переходим по адресу 201B2486, копируем на вкладке Hex блок 0021017010BC08BC1847704730B583B0041C0125AD02281C и находим его в U300. Получили 0x201B2162. В прошивке U600 теперь поднимемся выше до тех пор, пока не увидим p_GSMMalloc, и затем постепенно поднимаемся вверх в прошивке U300, пока не увидим команду, где использовался адрес p_GSMMalloc в U600 (в нашем случае это LDR R1..). Итак, мы видим, что в U300 адрес такой же - 0x040000B8.

 

:ab: .equ p_GSMFree 0x040000BC

Это адрес функции освобождения динамической памяти. Тут ищем аналогично предыдущему. Поиском блока 70BC08BC184710B5011CB4203A4A48438018A82212588A42 мы находим, что и этот адрес остаётся таким же.

 

Итак, основная работа сделана. Далее нам осталось изменить адрес размещения кода (0x217D0EC0), т.к. в самом коде изменять ничего не надо (здесь нету врезок).

Код нам нужно разместить по "свободному" адресу, поэтому опять прибегнем к памяти из под языковых ресурсов. Итак, предыдущий патч (MainMenuVib) мы расположили по адресу 0x20F0CFB8. Откроем s3 файл этого патча при помощи блокнота и увидим, что код патча занимает регион с 0x20F0CFB8 по 0x20F0D018. На случай модификации патча MainMenuVib оставим ещё место про запас после адреса 0x20F0D018, и этот патч можно расположить где-то по адресу 0x20F0D500. Теперь в символы нужно добавить функцию MyTrace по адресу 0x20F0D500, т.к. в будущем она нам пригодится.

 

Вот окончательный код патча:

 

.equ GSMsprintf 0x205891A4
.equ TB 0x300D3A20
.equ ATSendReplyByEG 0x20556D2A
.equ GSMstrlen 0x2057CA18
.equ GSMstrcpy 0x2057CA08
.equ GSMstrcat 0x2057C9A4
.equ p_GSMMalloc 0x040000B8
.equ p_GSMFree 0x040000BC


    0x20F0D500:
     myTrace:
        push {r0-r7,lr}
	sub sp,8

		;??????? ? ????? ????? ??????:
			;??????? ??????:
			bl GSMstrlen
			add r0,4
			ldr r1,=p_GSMMalloc
			ldr r1,[r1]
			bl call_by_R1
			mov r6,r0			

		adr r1,="%X: "	;??? ??? ?????? LR (?????? ??????)
		bl GSMstrcpy

		mov r0,r6
		ldr r1,[sp+8]
		bl GSMstrcat

		;?????????? ??????:
		ldr r0,=TB
		mov r1,r6
		ldr r2,[sp+40]	;r2=LR
		ldr r3,[sp+12]	;r3=R1
		ldr r4,[sp+16]	;r4=R2
		str r4,[sp]		;[sp]=R2
		ldr r4,[sp+20]	;r4=R3
		str r4,[sp+4]	;[sp+4]=R3
		bl GSMsprintf

		;??????? ? ????:
		mov r1,0
		ldr r0,=TB
		bl ATSendReplyByEG

			;????????? ??????:
			ldr r1,=p_GSMFree
			ldr r1,[r1]
			mov r0,r6
			bl call_by_R1

	add sp,8
	pop {r0-r7,pc}
	.data

call_by_R1:
	bx r1

 

leonne, отпишись, как разберёшься, тогда продолжим.

  • Like 7
Ссылка на комментарий
Поделиться на другие сайты

Я думаю с патчем и поиском этих адресов все ок. Я вроде как все нашел. ток вот вопрос, а что делает патч трассировки и для чего используеться? Название мне ни о чем не говорит.

Разобрался кажеться. :) Патч добавляет

функцию myTrace, которой изначально нет в телефоне. Ток вот вопрос. А стоит ли его выкладывать так как сам по себе патч ни чего не меняет и нужен для патча ATComm. может его просто приклеить к этому патчу?

Изменено пользователем leonne
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Здрасте. Пытаюсь открыть BinEdit-ом прошивку E840XEHB1, на полпути программа выдает сообщение такого рода - "Не удалось определить тип прошивки". В чем проблема?

 

Все получилось при второй попытке. А есть SYM-файл для E840XEHB1 и для D830XEGA1?

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти



×
×
  • Создать...