Jump to content
Old Phone Forum
  • Login

    You are currently not logged in to the forum.

    To comment, upload files, subscribe to answers - you need to login.

EvgeniyZ

Задаем вопросы по теме "Портирование патчей, для начинающих"

Recommended Posts

Портирую патч, но вот в патче изменяется такой код:

 

....................................................

10C31468: 02F66202 BLX off_10A33930

10C3146C: F662 STR R6, [R6, #0x2C]

10C3146E: 02F66202 BLX off_10A33934

10C31472: F662 STR R6, [R6, #0x2C]

10C31474: 02F66202 BLX off_10A3393C

10C31478: F662 STR R6, [R6, #0x2C]

10C3147A: 02F66202 BLX off_10A33940

10C3147E: F662 STR R6, [R6, #0x2C]

10C31480: 02F66202 BLX off_10A33948

10C31484: F662 STR R6, [R6, #0x2C]

10C31486: 02F66202 BLX off_10A3394C

10C3148A: F662 STR R6, [R6, #0x2C]

10C3148C: 02F66202 BLX off_10A33954

10C31490: F662 STR R6, [R6, #0x2C]

10C31492: 02F66202 BLX off_10A33958

10C31496: F662 STR R6, [R6, #0x2C]

10C31498: 02F66202 BLX off_10A33960

....................................................

 

Как такой код найти в другой прошивке и как узнать с какого именно адреса применять патч

(Т.к. патч с определенного адреса начинает изменять этот код, а код перед этим адресом такой же)?

По кокому принципу определяется нужный адрес в блоках с одинаковым кодом?

(Прошивка X700XEEK6 портирую на X700XEFA1 патч CallerId_2)

  • Like 1

Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites

Если бинэдит не находит сам эквивалент адреса в другой прошивке то искать надо следовательно вручную по мсс функициям, так вот объясните пожалуйсто как это выглядит. я не понял... и в каких случаях надо искать по коду.

Share this post


Link to post
Share on other sites

sleeping-man,

Это ты мне ответил? Или просто задал вопрос?!


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites

Share this post


Link to post
Share on other sites
Портирую патч, но вот в патче изменяется такой код:

 

....................................................

10C31468: 02F66202 BLX off_10A33930

10C3146C: F662 STR R6, [R6, #0x2C]

10C3146E: 02F66202 BLX off_10A33934

 

 

 

Ну ты насмешил. :lol: Что ты смотришь это место как код . Этоже просто картинка ..На которой расположен новый код для патча. Для этого можешь использовать любую неиспользуемую картинку в прошивки :) . Могу помочь , Используй картинки фон под датой Они в Х700 не используются . Я для Х700 как раз на них патчи и распологал :idea:


SAMSUNG -Е100 -> E730 - > Nokia N73

Если у вас беда ,то мы идем к вам …… SGH.ru

Share this post


Link to post
Share on other sites

Sergeyl,

Спасибо за ответ! Но зачем смеяться, я же только учусь! Лучше бы рассказал, как определить по коду картинка это или что-то другое!


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites
Но зачем смеяться, я же только учусь!

 

Я не хотел тебя обидеть. Извени если что. :lol:

 

Лучше бы рассказал, как определить по коду картинка это или что-то другое!

 

 

Да у тебя что карты ресурсов нет. :lol: А так лучше пиши в личку или стучи в Асю . Если буду свободен отвечу на вопросы :shock:


SAMSUNG -Е100 -> E730 - > Nokia N73

Если у вас беда ,то мы идем к вам …… SGH.ru

Share this post


Link to post
Share on other sites

Мне нужно переписать вот этот код:

004F      LDR R7, =0x10C3151D R7 = значение по адресу (PC + 0)=[0xEED91770]= 0x10C3151D

3847      BX R7 переход по адресу в R7.

Как я понимаю регистру R7 присваивается значение регистра PC, а потом осуществляется переход по

этому адресу.

Но мне нужно регистру R7 присвоить значение адреса 0x101119E68. Я так понимаю мне нужна команда

ассемблера, чтобы было: R7 = значение по адресу (PC - ?)=[0x????????]= 0x101119E68.

Как эта команда называется (если она есть)?


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites

Подскажите пожалуйста зчто отвечает адрес в прошивке X100XEDG1 - 00096DB0!

И как найти экваволент этого адреса в пошивке X460CBEB1 !


Mot C350=>X100=>X100=>X460+X640

Share this post


Link to post
Share on other sites
Как я понимаю регистру R7 присваивается значение регистра PC, а потом осуществляется переход по  этому адресу.
правильно понимаешь, команда та же LDR, обрати внимание на адрес EED91770 - там непосредственно адрес 10C3151D. Так вот команда LDR - просто грузит в регистр его значение.... но со смещением кратным 4-м байтам, поймать можно перебором

004F - обращение к тек.адрес + 4 байта

014F - обращение к тек.адрес + 8 байт

024F - обращение к тек.адрес + 12 байт

и т.д. меняя первый байт пока не поймаешь :lol:

я думаю очевидно, что и свой адрес 0x101119E68, ты должен размещать кратно 4 байтам. Попробуй в BinEdite в редакторе патче поэксперементировать, правя адрес в коде и глядя на мнемонику команды... BinEdit подскажет!

Есть еще вариант, по идее удобнее... использовать встроенный компилятор BinEdit, он код сам рисует... но это совсем отдельная история

Но мне нужно регистру R7 присвоить значение адреса 0x101119E68
ты опечатался? адрес и емкость регистров 4 байта!

 

Ustin, как я делаю. я гружу прошивку с символьной информацией, для g1 - она неполная, а вот WK - для х100 - там SYM оригинальный, и ищу аналогичный код сначала там, разбираюсь чего он собственно выполняет и по аналогии делаю для своей прошивки (е630) если на твой тел. нет никакой символьной инфы... подбирай прошивки максимально схожие, можно попробовать перегнать символы на свою... а там уже сопоставляй. Принцип - ищешь аналогичную функцию которую затрагивает патч (если есть символы - по названию) и аналогично воспроизводишь.

вот кстати есть для твоего тела оригинальный сум http://firmware.javer.sgh.ru/?frm=X460XEEB1&t=4


Ковыряю e630 :)

Share this post


Link to post
Share on other sites

Хацкер, Ну для начала сум файлы у меня есть для обоих из этих прошивок!

А вот прошивка на которую надо перевести адрес X460CBEB1!


Mot C350=>X100=>X100=>X460+X640

Share this post


Link to post
Share on other sites

Ustin, тебе итак крупно повезло! А ты еще перебираешь ;-)

Довольствуйся тем что есть ведь эти прошивки на 99,9% одинаковые. Можешь попробовать перегнать символы на свою - вся инфа в хелпах


Ковыряю e630 :)

Share this post


Link to post
Share on other sites

А в том и то и прикол что символьная информация есть и на эту прошивку!


Mot C350=>X100=>X100=>X460+X640

Share this post


Link to post
Share on other sites

Хацкер,

Спасибо, я понял с адресами! А вот что делать, если:

Например, В патче "Батарейка на 16 делений" (в прочем и в других патчах это встречается):

есть, например, код 102B4FBC: 0F4D LDR R5, =gv_InCharge,

как я понимаю в регистр R5 загружается адрес переменной(?) и для другой прошивки можно найти

эквивалентную переменную(?) при портировании патча,

а вот как быть если

102B4FD4: 0B48 LDR R0, =0x000081AF

Почему это значение 0x000081AF и для другой прошивки это же будет значение?


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites

EvgeniyZ, для другой прошивки, скорее всего, надо искать эквивалентный адрес. смотри, где этот адрес еще используется...


E630XEDK2 + Nokia N72+1Gb

Всё, что нас не убивает, то нас делает сильней! (Е. Летов)

Share this post


Link to post
Share on other sites

CTAPbIY,

В том то и дело, что это не совсем адрес в прошивке (как я понимаю), а адрес хранения какой-то переменной (может я и не прав), но, например, в другом патче есть, например, адрес 0х18....., но такого адреса нет, прошивка закончилась давно! Вот я и хочу узнать, как именно найти этот эквивалентный адрес! А то вот в этом вся загвоздка, уже все патчи просмотрел, но портировать из-за этого не получается, т.к. не совсем понимаю, что с этими адесами! Объясните, пожалуйста, популярно для начинающего!!!


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites

Если это даже адрес за пределами прошивки, он всяко разно используется не однократно. ищи где еще он используется, потом ищи эквивалент и т.д...


E630XEDK2 + Nokia N72+1Gb

Всё, что нас не убивает, то нас делает сильней! (Е. Летов)

Share this post


Link to post
Share on other sites
Если это даже адрес за пределами прошивки, он всяко разно используется не однократно. ищи где еще он используется, потом ищи эквивалент и т.д...

По подробнее можно, как искать?

  • Like 1

Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites
но такого адреса нет, прошивка закончилась давно! Вот я и хочу узнать, как именно найти этот эквивалентный адрес!

Когда я начинал ... я тоже был обескуражен тем - что прошивка закончилась и как искать не понятно. Это область оперативки, соответственно в прошивке ее не будет. Но логично предположить что к этой глобальной переменной идет обращение из кода самой прошивки - так?! Значит надо найти в прошивке где идет обращение к ней. Т.е. зная адрес этой гл. переменной (gv_InCharge) надо поискать где она еще используется помимо патча... т.е. найти функцию в которой она используется - а потом... правильно! найти такую же функцию и у себя - и уже в своем коде ты увидишь новый свой адрес для той же переменной!

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


Ковыряю e630 :)

Share this post


Link to post
Share on other sites

Хацкер,

Спасибо огромное! Теперь буду разбираться!


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites

Хацкер,

Разобрался, но вот возник вопрос: " Как я могу сам найти место в оперативке под свою переменную?" Ведь, как я понимаю, не обязательно переменную прописывать в эквивалентном месте оперативки, что и в исходном патче?! Можно и в другое свободное место прописать!?


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites

EvgeniyZ, Вполне, главное найти место (адрес) который бы не использовался или же использовался, но вместе с твоим кодом не конфликтовал

Здесь надо быть осторожным...

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

На медне ковырял патч на увеличение размера мелодий ММF, мои догадки строятся на том, что там ссылки на стандартный буфер ОП поменяли на другой - большой, т.о. при наличии установленного на телефоне этого патча, можно использовать оперативку от стандартого буфера под мелодии.

 

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

Т.е. к примеру

1.Грузится в регистр R0 адрес переменной - командой LDR

2.Далее грузится значение оперативки по искомому адресу, но уже в регистр R1

3.Т.к. в R0 уже сидит адрес, то можно загрузить еще переменную, адрес которой недалеко.... для этого используется та же команда LDR, только со смещением...

Вот в такуой конструкции автопоиск адресов использования BinEdit'a уже бессилен :( имей ввиду

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

и уж только тогда, когда оптимизатор кода не сможет получить переменную - идет явное указание ее в коде - такая конструкция займет 8 байт (4 - адрес и по 2 на две LDR).


Ковыряю e630 :)

Share this post


Link to post
Share on other sites

Хацкер,

Спасибо, что-то понял, но что-то не совсем, надо разобраться!

Но как определить буфер это или глобальная переменная? Только по объему между адресами этой и следующей сигнатуры?

Глобальные переменные (от 1 до 4-х байт), а как узнать сколько моя байт при портировании патча?


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites
Глобальные переменные (от 1 до 4-х байт), а как узнать сколько моя байт при портировании патча?
по командам загрузки или записи

 

Чтение значения памяти / Запись в память

 

Load Register

LDR – Загрузка в регистр т.н. «слова» (word), т.е. значения из 4-х байт, соответственно команда может адресоваться к адресам кратным 4 байтам (берётся 4 байта)

LDRH – Загрузка в регистр т.н. «полуслова» (half word), т.е. значения из 2-х байт, соответственно команда может адресоваться к адресам кратным 2 байтам (берётся 2 байта)

LDRB – Загрузка в регистр 1 байта, может адресоваться с точностью до байта (берётся 1 байт).

 

Store Register

Соответственно аналогичная группа команд STR, STRH, STRB служит для записи значения из регистра в адрес памяти.

 

Если командами загрузки грузить можно значение как из кода самой прошивки, так и значение опертивки, то писать можно только в оперативку - иначе перезагруз :?:


Ковыряю e630 :)

Share this post


Link to post
Share on other sites

Хацкер,

В патче "Батарейка на 16 делений" написано по адресу: 0x102B4FD6

следующая команда ассемблера: BLX ___rt_udiv, где ___rt_udiv для X700XEEK6 равно: 0x10DBD754,

это, как я понимаю, переход на подпрограмму ___rt_udiv, после компиляции получается код:

00F01EE8.Вот и вопрос: Как мне в компиляторе записать команду BLX ___rt_udiv, чтобы получить

такой же код? (А для прошивки X700XEFA1 я уж по аналогии сделаю)


Siemens M35 -> C45 -> Samsung X100 -> X120 -> E300 -> E710 -> X700 -> E200 -> I710 -> D780 -> I9100

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...