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

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

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

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


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

В этой теме можете задать вопросы по поводу переноса патчей с одной Agere-модели на другие.

Agere-модели Samsung: C120 C130 C140 C160 C170 C200 C200N C210 C230 C240 C250 C260 C300 C400 C520

D100 D410 D520 D800 D830 D840 E210 E300 E310 E400 E530 E570 E600 E610 E620 E710 E720 E770 E790 E810 E840 E850 E860 E870 E880 E900 E910 E950 J600 L310 L320 M300 P100 P300 P310 P400 P710 P730 P900 S100 S200 S300 S300M U100 U300 U600 V200 X120 X140 X150 X160 X200 X210 X300 X400 X430 X450 X461 X480 X481 X510 X520 X530 X610 X630 X660 X680 X800 X810 X820 X830

 

Для других (Swift и Sysol) моделей есть другая подобная тема: http://OldPh.one/index.php?showtopic=19494

 

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

Для начала обязательно прочитайте статью от Artyomcool'а (чтобы увидеть статью, нажмите на кнопку Оффтоп):

 

Перед Вами – статья ознакомительного содержания. В ней будут изложены основные команды THUMB -режима процессора и основные особенности THUMB -программирования.

 

Подразумевается, что вы знакомы с процессом прошивки, со строением прошивки и азами программирования ( Pascal / Delphi , Basic , C / C ++/ C #, Java – любой из этих или других схожих языков). Если вы не знакомы с программированием – это не повод отказываться от патчмэйкинга. Все еще впереди. Я буду стараться излагать известные мне факты наиболее простым и доступным языком, так что даже ребенок сможет научиться писать несложные патчи.

 

Как известно, в THUMB -режиме (далее – тумбе) на одну команду приходится всего два байта. Существует только две команды-исключения: BL и BLX . Но об этом позже.

 

Основой всего программирования можно назвать следующие: регистры, оперативная память (далее – опера), стек и команды.

 

Регистр – область данных, размером в процессорное слово (объем данных, обрабатываемый процессором за один раз). В нашем случае – слово имеет в себе 32 бита (4 байта). Поэтому и в регистре помещается 4 байта данных. Данные принято обозначать в HEX формате. Приемлема и десятичная запись. Перед записью в HEX принято ставить знак “0 x ”, тогда как перед десятичным числом ничего не ставится. Вот примеры (справа – HEX , слева – десятичное значение):

 

0 x 5=5

 

0 xA =10

 

0 x 10=16

 

0 x 20=32

 

0xFFFF= 65535

 

Регистры можно условно разделить на три группы:

Младшие регистры – регистры, полностью доступные как в тумбе, так и в ARM . Их всего 8. Обозначаются: R 0, R 1, R 2, …, R 7.

Старшие регистры – регистры, полностью доступные только в ARM . Их всего 5. Обозначаются: R 8… R 12.

Регистры специального назначения. О них сейчас пойдет отдельный разговор.

 

SP ( R 13) – регистр стека. Всегда установлен на верхушку стека. Подробнее о стеке будет сказано ниже.

 

LR ( R 14) – регистр возврата. Чаще всего используется для возврата из функций. Об этом тоже ниже.

 

PC ( R 15) – регистр позиции кода. В нем находится адрес следующей команды (т.о. если поместить в него адрес, то процессор продолжит свою работу именно с этого нового адреса).

 

CPSR – регистр состояния, или флаговый регистр. В нем содержится много системной информации, такой как режим выполнения ( ARM или тумба) и флаги переходов (об этом – опять же ниже).

 

 

 

О стеке. Стек – это кусочек оперативной памяти. Единственная особенность – указатель на этот кусок содержится в SP . Когда мы «передвигаем» указатель стека, мы можем выделять себе определенное количество памяти. Она может понадобиться для размещения локальных переменных, создания небольших локальных буферов и т.п. Чтобы получить доступ к определенной переменной, нам нужен не только указатель стека, но и смещение. К примеру, если в стеке две переменных, то одна находится по адресу [ sp ], другая в [ sp +4].Почему +4, а не +1? Как было сказано выше, размер процессорного слова 4 байта, и поэтому даже под 1 байт информации выделяется аж 4 байта. Квадратные скобки – это обозначения данных (используется для зрительного выделения, чтобы ярко видеть, что мы берем именно значение по адресу в скобках, а не сам адрес). Чтобы передвигать стек нужны команды:

 

Add и Sub . Первая – это прибавить к регистру определенное значение. Вторая – отнять. Имеется несколько вариантов работы с ними:

 

Add SP , N – прибавить к указателю стека N байт ( N кратно 4).

 

Sub SP , N – отнять от указателя стека N байт ( N кратно 4).

 

Add Rx , Ry , N – Rx = Ry + N , N в пределах от 0 до 255 (0 xff ).

 

Sub Rx , Ry , N – Rx = Ry - N , N в пределах от 0 до 255 (0 xff ).

 

Если Rx = Ry можно писать упрощенно:

 

Add Rx, N или Sub Rx, N.

 

Следующий вариант, когда от значения одного регистра надо прибавить (отнять) значение другого:

 

Add Rx, Ry, Rz – Rx=Ry+Rz.

 

Sub Rx, Ry, Rz – Rx=Ry-Rz.

 

Допускается такая запись:

 

Add Rx,Ry – Rx=Rx+Ry.

 

Sub Rx,Ry – Rx=Rx-Ry.

 

Стоит отметить, что эти команды работают только с младшими регистрами (а также с SP , об этом уже было сказано).

 

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

 

1. Прямое помещение данных:

 

1.1 Mov Rx , N – поместить в Rx N . 0

 

1.2 Mov Rx , Ry – поместить в Rx значение Ry . Что характерно, данного варианта для младших регистров просто не существует. Хотя бы один из регистров должен быть старшим (или специальным). Для младших регистров существует подмена: Add rx , ry ,0. Компилятор BinEdit выполняет подмену автоматически, поэтому мы можем смело писать mov r 0, r 1.

 

2. Чтение данных:

 

2.1 Ldr Rx , [ Ry + N ] – прочесть 4 байта по адресу Ry + N и поместить их в Rx . Ry и N кратны 4.

 

2.2 Ldrh Rx , [ Ry + N ] – прочесть 2 байта по адресу Ry + N и поместить их в Rx . Ry и N кратны 2.

 

2.3 Ldrb Rx , [ Ry + N ] – прочесть 1 байт по адресу Ry + N и поместить его в Rx .

 

Стоит отметить, что если Ry = PC , то PC можно опустить, а вместо PC + N написать непосредственно адрес чтения: Ldr Rx , 0 x 123556. В Rx будет помещено значение по адресу 0 x 123456. Если же написать Ldr Rx , =0 x 123456, то в Rx будет помещено именно 0 x 123456, а не данные по этому адресу. При этом данные 0 x 123456 будут размещены автоматически.

 

Возможно также чтение по сумме регистров, как например в случае Ldr ( h , b ) Rx , [ Ry + Rz ].

 

Регистры Rx , Ry , Rz – из младшего ряда. В случае Ldr Rx , [ Ry + N ], и только в этом, Ry может быть равен SP и PC . В случае Ldr ( h , b ) Rx , [ Ry + N ] Ry может быть равен PC .

 

Хочется попутно сказать о команде Str ( Strh , Strb ). Эти команды сохраняют регистры по указанному адресу. Принцип работы как и у Ldr(h,B).

 

Для перемножения регистров можно использовать команду Mul Rx , Ry . Результат будет записан в Rx . Rx и Ry – младшие регистры.

 

Рассмотрим несколько простых примеров комбинирования данных команд.

 

Задача. Написать функцию, эмулирующею работу формулы a = b * x * x * x + c * y *( y -0 x 100)+ d * z +5000, при чем вернуть результат функция должна в R 0, а данные ей будут переданы следующим образом:

 

R 0= x ;

 

R 1= y ;

 

R2=z;

 

R3=StructAdr.

 

StructAdr – это адрес некой структуры, содержащей в себе параметры b , c и d , причем:

 

[ StructAdr ]= b;

 

[structAdr+4]=c;

 

[structAdr+8]=d;

 

Будем считать, что каждая из переменных занимает 4 байта.

 

;Подсчитаем x * x * x и сохраним результат в R 0:

 

Mov R 7, R 0 ; Сохраним R 0 в R 7

 

Mul R 0, R 0 ; Умножим R 0 на само себя

 

Mul R 0, R 7 ; Умножим R 0 на

 

; Подсчитаем y *( y -0 x 100) и сохраним результат в R 1:

 

Sub R 7, R 1, 0 xFF ; Так как команда Sub имеет ограничение (вычитаемое должно быть

 

Sub R 7, 0 x 1 ; Меньше 256 (0 x 100)), мы вынуждены вычитать дважды.

 

; Теперь в R7 y-0x100

 

Mul R 1, R 7 ;Ну и умножили

 

; Надо считать b , c и d . В R 3 поместим d , в R 4 – c и в R 5 – b .

 

Ldr R5, [R3] ;R5=b

 

Ldr R4, [R3+4] ;R4=c

 

Ldr R3, [R3+8] ;R3=d

 

; Поместим в R 6 5000 с помощью Ldr :

 

Ldr R6, =5000

 

; Вычисляем окончательно:

 

Mul R0, R5 ;R0=b*x*x*x

 

Mul R1, R4 ;R1=c*y*(y-0x100)

 

Mul R2, R3 ;R2=d*z

 

Add R0, R1 ;R0= b*x*x*x+ c*y*(y-0x100)

 

Add R0, R2 ;R0= b*x*x*x+ c*y*(y-0x100)+ d*z

 

Add R0, R6 ;R0= b*x*x*x+c*y*(y-0x100)+d*z+5000

 

 

Целиком кусок кода выглядит так:

 

 

Mov R 7, R 0

 

Mul R0, R0

 

Mul R0, R7

 

Sub R 7, R 1, 0 xFF

 

Sub R 7, 0 x 1

 

Mul R 1, R 7

 

Ldr R5, [R3]

 

Ldr R4, [R3+4]

 

Ldr R3, [R3+8]

 

Ldr R6, =5000

 

Mul R0, R5

 

Mul R1, R4

 

Mul R2, R3

 

Add R0, R1

 

Add R0, R2

 

Add R0, R6

 

. data

 

Как вы, наверное, заметили, символом “;” отделяются комментарии.

 

В конечном варианте была употреблена директива “. data ”, о которой ранее ничего не говорилось. Эта директива указывает на начало области данных – начиная с этого адреса будут размещаться данные, использованные в коде. В данном случае это нужно только для размещения данных «5000».

 

Данный код имеет два минуса:

 

1. Данный код нельзя вызвать несколько раз – его можно лишь воткнуть непосредственно в код – т.е. данный код не является функцией, хотя выполняет строго определенную задачу.

 

2. Код изменяет ВСЕ регистры, а нам нужно только изменение в R 0.

 

Для разрешения обеих недоработок нам не хватает команд – команд сохранения регистров в стеке. Строго говоря, можно было бы сохранить регистры по одному, предварительно выделив место в стеке, это будет выглядеть вот так:

 

Sub SP ,32 ;Выделим место под 8 регистров

 

Stmia ! SP { R 0- R 7} ;Сохраняем регистры

 

;{….}

 

Ldmia ! SP { R 0- R 7} ;Загружаем регистры

 

Add SP,32 ; Восстанавливаем стек

 

Нам встретились две новых команды:

 

Stmia ! Rx {…} – сохранить указанные регистры по адресу в Rx .

 

Ldmia ! Rx {…} – загрузить указанные регистры по адресу в Rx .

 

Регистры можно указывать через запятую или через тире (последнее означает: регистры с … по …), либо комбинировать их:

 

{ R 0, R 2, R 6, R 7}

 

{ R 1- R 5}

 

{ R 0, R 2- R 4, R 6- R 7}

 

{ R 0- R 3, R 5, R 7}

 

Регистры обязательно должны следовать в порядке возрастания.

 

Но данный способ здесь не рационален, т.к. существуют команды PUSH и POP :

 

Push {…} – сохраняет указанные регистры в стек, предварительно выделив его. В списке регистров может присутствовать LR (регистр возврата – в него при переходах (точнее вызовах) сохраняется PC , чтобы потом, записав LR в PC , можно было вернуться к предыдущему месту выполнения кода).

 

Pop {…} – загружает регистры из стека и освобождает его. В списке регистров может быть PC .

 

Наша функция должна выглядеть так:

 

Push { R 0- R 7, LR } ;Пока на LR не обращаем внимания.

 

Mov R7, R0

 

Mul R0, R0

 

Mul R0, R7

 

Sub R7, R1, 0xFF

 

Sub R7, 0x1

 

Mul R1, R7

 

Ldr R5, [R3]

 

Ldr R4, [R3+4]

 

Ldr R3, [R3+8]

 

Ldr R6, =5000

 

Mul R0, R5

 

Mul R1, R4

 

Mul R2, R3

 

Add R0, R1

 

Add R0, R2

 

Add R0, R6

 

Pop { R 0- R 7, PC } ;Пока на PC не обращаем внимания.

 

. data

 

Теперь функцию можно вызывать командой BL ( BLX ).

 

BL address – сохранить PC в LR и перейти на указанный адрес.

 

BLX address – сохранить PC в LR и перейти на указанный со сменной режима ( THUMB ARM ).

 

Кардинальным отличием команд BL и BLX является их размер. Вместо двух байт они занимают четыре, даже в THUMB режиме.

 

Механизм работы функций таков:

Сохраняем все используемые регистры.

Делаем все дела.

Загружаем регистры (причем та ячейка стека, в которую мы сохранили LR , восстановится непосредственно в PC ).

 

Все это выглядит вот таким образом:

Сохраняем:

 

Push { R 0- R 7, LR }

R0

R1

R2

R3

R4

R5

R6

R7

LR

 

Загружаем:

 

Pop { R 0- R 7, PC }

R0

R1

R2

R3

R4

R5

R6

R7

PC

 

 

Бывает, что не все восстанавливается в точности, вот пример:

Сохраняем:

 

Push { R 1- R 3, R 7 }

R1

R2

R3

R7

 

Загружаем :

 

Pop {R1,R6,R7,PC}

R1

R6

R7

PC

 

 

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

 

Дело в том, что команда BL – относительна. Бывает, что нужно перейти на абсолютный адрес, записав PC в LR и не изменив других регистров. Вот как это делается:

 

Пишем в коде

 

BL callAdress

 

и ставим метку с соответствующей структурой

 

callAdress:

 

Push {R0,R1} ; Сохраним в стек R0,R1 ([sP]=R0, [sP+4]=R1)

 

Ldr r0,=adressToJump ;R0=adressToJump

 

Str r0,[sP+4] ;[sP+4]=R0=adressToJump

 

Pop { R 0, PC } ; R 0= R 0 (вернем в изначальное состояние) и PC = adressToJump

 

Смысл такой структуры заключается в том, что ни один из регистров не меняется (кроме PC , конечно), и получается, что мы просто «перепрыгнули» на adressToJump .

 

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

 

Безусловные переходы:

 

BL , BLX – о них уже говорилось ранее.;

 

B address – переход на address (то же самое, что PC = address );

 

BX Rx – переход по значению регистра со сменой режима. Режим меняется в зависимости от четности (по значению последнего бита регистра – если последний бит 1, то режим становится THUMB , в противном случае – ARM ). Rx = R 0… PC .

 

Стоит отметить, что из команд безусловных переходов только BX абсолютна. Остальные команды относительны (т.е. если переместить байткод скомпилированной команды по другому адресу, то и ссылаться она будет на другой адрес).

 

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

 

Но прежде чем говорить о командах условных переходов, следует упомянуть о регистре состояния и о его битах сравнений (флагах).

 

Как уже упоминалось, в регистре состояния – CPSR – хранится куча «волшебных» битов. Первые пять битов определяют режим. Режим исполнения – очень длинная тема, которая не входит в рамки данной статьи. Шестой бит – бит THUMB режима. Именно его меняет команда BX , и именно этот бит «говорит» процессору в каком режиме идет исполнение и какой набор команд использовать.

 

Следующие два бита – признак канального процесса или передачи данных и признак прерывания. Их назначение, честно говоря, мне не известно. Назначение следующих 20-ти бит неизвестно, наверное, никому, кроме самих корейцев… Хотя, не факт, что их назначение они сами знают J .

 

А вот последние 4 бита регистра состояния использует любой патчмэйкер (правда, не все они об этом знают J ). Эти биты имеют свои обозначения.

 

V – флаг переполнения;

 

C – флаг переноса;

 

Z – флаг нуля;

 

N – флаг отрицательности.

 

Рассмотрим случаи, когда эти флаги меняются.

 

Mov R 0,0

 

Sub R 0,1

 

Что произойдет? А произойдет следующие. В R 0 запишется число 0 xFFFFFFFF , как будто бы к R 0 изначально приписали единицу слева. А в бит отрицательности (N) запишется 1.

 

Ldr R0,=0xFFFFFFFF

 

Add R0,1

 

Что будет в этом случае? А в этом случае в R 0 попадает 0, как будто мы отбрасываем после операций 33-й бит и в бит переполнения ( V ) попадает 1.

 

Очень интересен случай когда:

 

Mov R 0,5

 

Sub R 0,5

 

В R 0, ясно дело, попадет 0. А вот в бит нуля ( Z ) попадает 1. Это происходит всегда когда мы вычитаем из регистра его же значение (например, при выполнении команды Mov бит нуля не изменяется, а вот команда Sub меняет его всегда).

 

О бите переноса (С) поговорим в следующих статьях.

 

В пору сказать о командах сравнения – Cmp и Cmn .

 

Cmp Rx , Ry – Rx , Ry от R 0 до R 12;

 

Cmn Rx , Ry – Rx , Ry от R 0 до R 12;

 

Сравнение выполняется презабавным образом. Cmp тупо вычитает из Rx Ry , при этом, сам результат вычисления не сохраняется, а вот флаги сравнения ставятся, как будто мы выполнили команду Sub Rx , Ry .

 

Cmn – то же самое, только ее аналогом является Add , а не Sub .

 

Зачем нужно такое сравнение? А вот зачем. Предположим, Rx = Ry . Тогда при выполнении команды Cmp флаг Z будет равен 1 и мы сможем воспользоваться первым условным переходом – Beq .

 

Beq address – переход если равно ( Z =1);

 

Как пользоваться? Вот пример:

 

 

;Функция возвратит в R 0 1, если R 0= R 1. В противном случае, в R 0 вернется 0.

 

Cmp R 0, R 1 ;Сравним

 

Beq Adress 1 ;Если равно, то перейдем на Adress 1

 

Mov R 0,0 ;Если мы здесь, значит предыдущий Beq не сработал, а значит R 0 R 1

 

B Exit ; Ну и выйдем…

 

Adress1:

 

Mov R0,1 ; Засунем в R0 1

 

Exit:

 

BX LR ; Выходим из функции.

 

 

Иногда бывает удобнее переходить «если не равно». Для этого существует команда Bne (переход осуществляется если Z =0)

 

Что делать, когда помимо равно-неравно необходимо узнать, больше или меньше?

 

Пусть R 0 меньше R 1. Тогда при вычитании из R 0 R 1 в N попадет единица. Команды для работы с N :

 

Bmi – переход если отрицательно ( N =1);

 

Bpl – переход если неотрицательно ( N =0);

 

Пусть, если R 0> R 1, тогда вернем 1, если меньше, то -1 (0 xFFFFFFFF ), а если равны – 0.

 

Cmp R0,R1

 

Beq address1

 

Bmi address2

 

Mov R0,1

 

BX LR

 

adress1:

 

Mov R0,0

 

BX LR

 

Adress2:

 

Mov R 0,0 ;Можно конечно использовать

 

Sub R 0,1 ; Ldr R 0,=0 xFFFFFFFF , но это займет больше байт

 

BX LR

 

 

Таким же образом можно применять следующие команды:

 

 

BVS - если переполнение разрядов ( V =1)

 

BVC - если нет переполнения разрядов ( V =0)

 

 

BCS - если больше без учёта знака (если осуществлялся перенос) (с=1)

 

BCC - если меньше без учета знака (если не осуществлялся перенос) (с=0)

 

 

BHI - если больше без учета знака (c=1, z=0)

 

BLS - если равно или меньше без учёта знака (c=0, z=1)

 

 

BGE - если больше или равно ((N=1 & V=1) или (N=0 & V=0))

 

BL T - если меньше ((N=0 & V=1) или (N=1 & V=0))

 

 

BLE - меньше или равно (Z=1 и ((V=0 & N=1) или (V=1 & N=0))

 

BGT - строго больше (Z=0 и ((V=0 & N=1) или (V=1 & N=0))

 

 

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

 

Вот команды с которыми мы познакомились:

 

Add - прибавление

 

Sub – вычитание

 

Mul – умножение

 

Mov – поместить

 

Ldr – считать

 

Str – записать

 

Ldmia – групповое чтение

 

Stmia – групповая запись

 

Push – сохранение в стек

 

Pop – загрузка из стека

 

B – безусловный переход

 

BX – переход со сменой режима

 

BL – вызов

 

BLX – вызов со сменой режима

 

Cmp – сравнение по –

 

Cmn – сравнение по +

 

Условные переходы:

 

Beq – если равно

 

Bne – если не равно

 

Bmi – переход если отрицательно

 

Bpl – переход если неотрицательно

 

BVS - если переполнение разрядов

 

BVC - если нет переполнения разрядов

 

BCS - если больше без учёта знака

 

BCC - если меньше без учета знака

 

BHI - если больше без учета знака

 

BLS - если равно или меньше без учёта знака

 

BGE - если больше или равно

 

BL T - если меньше

 

BLE - меньше или равно

 

BGT - строго больше

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

  • 4 месяца спустя...
  • Ответов 71
  • Создана
  • Последний ответ

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

Ясно, что для каждого соятояния работы телефона (деж. режим, любое меню, java и т.д.) существует сценарий обработки системных событий (это следует из наличия в прошивке таблицы с указанием строк scen_*, а так же адресов самих сценариев). Интересно, сценарий - это замена МСС в Сисолах, или "карта диспечеризации сообщений", тоесть сопосавление событиям обработчиков ? Самое главное, что указывается в сценариях: адреса обработчиков (не похоже) или индексы КОЛБЕКОВ, и если да то в какой позиции от начала ?

P.S. JavaScript толком не учил, возможно неправильно трактую понятие "сценарий"...

Изменено пользователем Neutral

X-630(похищен злодеями) -> B100

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

Neutral,

в сценариях на самом деле есть очень много - не только обработка клавиш.

Формат команды в сценарии такой:

 

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

Например, функция обработки клавиши - это 08F0. Далее идут параметры для неё:

2 байта - код события или кнопки

2 байта - номер сценария в таблице сценариев, который нужно запустить

2 байта - номер колбека, который нужно запустить.

 

Например, в сценарии рабочего стола для U600, который называется scen_back_norm, есть такая запись:

08F0 5800 14C0 4C0A

 

Здесь 58 - Это код кнопки ОК, 14C0 - тут номер сценария заменяется на такой вот код, с этим пока ещё не разобрались. Но в принципе сюда можно подставить номер сценария, который нужно запустить. Ну а 4C0A, т.е. A4C (т.к. записано всё в LittleEndian) - это номер колбека mmi_AccessCustomerBRMenuOrWapBR_CB - запуска самсунговского магазина.

Вот заменой номера этого колбека на номер колбека mmi_Java_Ams_Main и делается патч, который назначает на эту кнопку меню Java-приложения.

 

ARSik накопал некоторую информацию по остальным функциям в сценариях:

 

Сценарий содержит записи по 2 байта.
Записи, начинающиеся с F указывают какое действие должен выполнить обработчик. После этой записи идет несколько параметров.

Действия:

F000 - очистка экрана (kit_ClearScreen, 2 параметра)

F001 - выводит текст (kit_DisplayText, 3 параметра)
параметры:
 1 - ?
 2 - ?
 3 - ?

F002 - ?что-то связанное с выводом из буфера времени? (kit_DisplayFrmt, 4 параметра)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?

F003 - ? (kit_DisplayBloc, 5 параметров)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?
 5 - ?

F004 - ? (kit_ManageInput, 5 параметров)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?
 5 - ?

F005 - создание меню (kit_ScrollMenu, 5 параметров)
параметры:
 1 - ?
 2 - количество пунктов меню
 3 - номер строки меню, с которой начинает заполнятся меню
 4 - ?
 5 - ?

F006 - ?устанавливает таймер? (kit_DefineTimer, 3 параметра)
параметры:
 1 - ?
 2 - ?
 3 - ?

F007 - запускает таймер cb_MMI_KIT_SCREEN_TIMER (kit_ScreenTimer, 3 параметра)
параметры:
 1 - задержка
 2 - ?
 3 - callback выполняемый по таймеру (или после таймера)

F008 - зарегестрировать обработчик клавиши (kit_RunScenario, 3 параметра)
параметры:
 1 - код обрабатываемой кнопки (возможна такая запись XYYY, где X - количество кнопок, YYY - код первой кнопки)
 2 - ?
 3 - вызываемый callback

F009 - ? (kit_SetKeyboard, 1 параметр)
параметры:
 1 - ?

F00A - ? (kit_DefScenario, 3 параметра)
параметры:
 1 - ?
 2 - ?
 3 - ?

F00B - устанавливает подписи софт клавиш (kit_DefSoftKeys, 1 параметр)
параметры:
 1 - старший байт: левая софт клавиша, младший байт: правая софт клавиша

F00C - запускает сценарий (kit_LnkScenario, 1 параметр)
параметры:
 1 - номер сценария

F00D - ? (kit_IncallTimer, 1 параметр)
параметры:
 1 - ?

F00E - ? (kit_DisplayCost, 2 параметра)
параметры:
 1 - ?
 2 - ?

F00F - ? (kit_DisplayPicture, 1 параметр)
параметры:
 1 - ?

F010 - нарисовать картинку (kit_DisplayImage, 3 параметра)
параметры:
 1 - координата X
 2 - координата Y
 3 - номер в таблице изображений

F011 - показать анимацию (kit_PlayAnimation, 3 параметра)
параметры:
 1 - координата X
 2 - координата Y
 3 - номер в таблице анимаций

F012 - ? (kit_CyclicTimer, 3 параметра)
параметры:
 1 - ?
 2 - ?
 3 - ?

F013 - установить шрифт (kit_SetFont, 2 параметра)
параметры:
 1 - ?
 2 - ?

F014 - ? (kit_DrawGdi, 7 параметров)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?
 5 - ?
 6 - ?
 7 - ?

F015 - установить цвет текста (kit_SetTextColor, 1 параметр)
параметры:
 1 - номер цвета в таблице

F016 - ?менеджер скроллинга? (kit_ManScro, 8 параметров)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?
 5 - ?
 6 - ?
 7 - ?
 8 - ?

F017 - ? (kit_ScrollMenus, 6 параметров)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?
 5 - ?
 6 - ?

F018 - ? (kit_SetWindow, 4 параметра)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?

F019 - отобразить заголовок (kit_DisplayTitle, 5 параметров)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - номер строки для заголовка
 5 - ?

F01A - отобразить софт-полосу (kit_DisplaySoftKeys, 2 параметра)
параметры:
 1 - ?
 2 - ?

F01B - ? (0x20526C43, 5 параметров)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?
 5 - ?

F01C - очистка внешнего дисплея (?, 2 параметра)
параметры:
 1 - ?
 2 - ?

F01D - ? (?, 1 параметр)
параметры:
 1 - ?

F01E - ? (?, 3 параметра)
параметры:
 1 - ?
 2 - ?
 3 - ?

F01F - ? (?, 7 параметров)
параметры:
 1 - ?
 2 - ?
 3 - ?
 4 - ?
 5 - ?
 6 - ?
 7 - ?

F020 - ? (?, 1 параметр)
параметры:
 1 - ?

F021 - ? (?, 1 параметров)
параметры:
 1 - ?

F022 - ? (?, 1 параметров)
параметры:
 1 - ?

F023 - ? (?, 1 параметров)
параметры:
 1 - ?

F024 - ? (?, 3 параметра)
параметры:
 1 - ?
 2 - ?
 3 - ?

F025 - конец сценария

 

Найти сам сценарий, зная его название, очень легко. Для этого ищем название сценария, например, scen_back_norm.

В U600XEGG2 эта строка лежит по адресу 0x217977FC

Затем ищем указатель на название, переворачивая побайтно (т.е. ищем код FC777921). От найденного адреса отнимаем 4 байта и видим адрес сценария в перевёрнутом побайтно виде, т.к. таблица сценариев имеет следующий формат:

4 байта - указатель на сценарий

4 байта - указатель на его название.

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

Да, спасибо большое за систематизацию материала !!! Я знаю разницу между LittleEndian и BigEndian. Я просматривал свои сценарии и видишь, подтвердилась теория с колбеками ибо адресов функций-обработчиков я не увидел. Эту же таблицу (scenarios) можно спортировать из колбеков.

---------------------------------#################-------------------------------------

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

Кстати, пытался я найти функции файловой системы по строкам трассировки. Есть ссылка на данные:

20116BFC:20494653 DCB " IFS_OpenFile is Failed... retValue is %d ."	
20116C28:20494653 DCB " IFS_GetLastErr() = %d."	
20116C40:4946535F DCB "IFS_OpenFile is Success..  retValue is %d."	
20116C6C:4946535F DCB "IFS_OpenFile is Success.. retValue is %d."

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

X630XEFG1.rar

Изменено пользователем Neutral

X-630(похищен злодеями) -> B100

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

  • 1 месяц спустя...

Здраствуйте я как бы сазать тот самый начинающий о котором шла речь в заголовке темы. Почитал я посты в том числе и самый первый и понял что ни чего не понял. Ну или почти ни чего. С програмированием сталивался лишь в школе и то эт был язык бейсик. В общем хочу портануть несколько патчей, ну для начала один какой ить по проще. Накочал разных прошивок, патчиков какие хотелось бы портануть, качнул даж IDA, правда пока ни знаю че с ним делать. И теперь вот думаю а какой следующий шаг. Что дальше? Неужели для портирования патча мне жизненно необходимо знание языка? Могу я как нить двинуться с места без него, или прийдеться нырять в глубины програмирования? Подскажите пожалуста как портануть мне их?

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

leonne,

я думаю, хотя бы азы программирования знать обязательно... а также особенность программирования на ассемблере... 8)

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

Хорошо с этим я разобрался много общего с бейсиком а дальше сам по себе язык програмирования мне ни чего не дает. А как дальше быть?

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

leonne,

на какую модель хочешь портировать?

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

leonne,

Рассмотрим портирование с прошивки U600XEGG2.

 

1. Качаешь прошивки U600XEGG2 и прошивку для U300, на которую хочешь портировать. Также качаешь патч, который хочешь портировать.

 

2. Качаешь программу BinEdit, октрываешь BinEdit.exe

 

3. Открываешь s3-файл прошивки U600XEGG2. Программа будет создавать BE-файл этой прошивки, поэтому будет задавать вопросы.

 

Сканировать прошивку - ДА

Подгрузить ещё файл прошивки - Нет

Адрес, длина ОЗУ - просто жмём ОК.

Сохранить данные о прошивке - Да

 

4. Файл - Сохранить как, пишешь название прошивки и сохраняешь уже BIN-файл прошивки. Закрываем BinEdit. В следующий раз уже надо открывать не S3, а BIN файл прошивки, ибо он будет открываться намного быстрее.

 

5. Повторяем пункты 3,4 для прошивки от U300.

 

6. Открываем BinEdit.exe, открываем BIN файл прошивки U600. Затем ещё раз запускаем BinEdit.exe, чтобы появилось второе его окно, и в нём уже открываем BIN-файл прошивки U300.

 

Почитай ТУТ, ТУТ, а затем определись и отпиши, какой патч будешь портировать. Начинать надо с лёгких патчей.

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

Портировать наверно буду патч на вибру при перемещении по меню или патч на увеличение размера памяти под яву какой попроще?

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

leonne,

наверное начнём с вибры в меню, т.к. для портирования JavaHeap нужен дамп оперативной памяти, а чтобы его снять, нужно портировать патч ATComm.

 

Для портирования MainMenuVib нужно знать номера иконок меню в таблице картинок. Для этого я выкладываю программу ARSik'а ReadPict, которую я портировал для тебя для прошивки U300XEGJ1.

 

Открывать программой нужно BIN-файл прошивки, полученный конвертированием S3-файла программой SamsungFirmwareEditor 2.0 с опцией "Часть, только данные".

 

Открываем в этой программе прошивку, находим картинки иконок меню чёрной схемы и смотрим правее внизу на номер картинки в шестнадцатиричном формате.

 

Как только разберёшься с этим, напиши эти номера тут, продолжим дальше.

U300_read_pict.rar

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

das, а на старые агере можно такое попробовать сделать?

  • Like 1

Мудрец стыдится своих недостатков, но он не стыдится их исправлять.

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

если это то о чем я думаю то вот адреса

16B5369 16B5509 16B56D1 16B5821 16B5B79 16B5D31 16B5DE9 16B6039

16B61F9 16B65E9 16B6789 16B6909

Я их в архиве кинул

Поправлюсь это адреса а номера в текстовом файле

Samsung_U300.rar

______.txt

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

leonne,

нет, это иконки меню списком, а я говорил про обычное меню. Они начинаются с номера 8B.

Отпишись, как найдёшь.

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

их 72 штук надо все адреса переписать или достаточно номеров? номера начиная с 139(0x008B) и по 210(0x00D2). Это те?

адреса в файле

А чем отличаеться фаил bin полученый через binedit, от bin полученого через SFE?

______.txt

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

leonne,

пока что сильно занят учёбой, как хоть немного освобожусь, сразу отвечу.

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

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

 

Комментарий модератора dаs
Лучше подожди недельку, щас зачётная неделя идёт. До НГ мы точно уже хоть один патч портируем :ad:
Изменено пользователем dаs
Ссылка на комментарий
Поделиться на другие сайты

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

leonne,

увы, теперь уже после НГ, у меня ещё 29-30 будут занятые в универе.

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

А чем отличаеться фаил bin полученый через binedit, от bin полученого через SFE?

если честно, подробно с этим не разбирался, но BinEdit конвертирует своим алгоритмом для того, чтобы потом открывать BIN-файл им же, а SFE используется для простого конвертирования.

 

Итак, мы остановились на том, что нашли номера картинок-иконок меню чёрной схемы в таблице картинок - это картинки с 0x8B по 0xD2. Для чего нам это нужно было?

Дело в том, что идея патча MainMenuVib вот в чём: в функции прорисовки картинки на экран, которой помимо других параметров передаётся номер картинки в таблице, мы проверяем картинку по номеру, является ли она иконкой меню. Если да, то делаем короткую вибру. Другими словами, мы вибрируем при прорисовке иконки главного меню.

 

Откроем две копии BinEdit, в 1-й - прошивка U600XEGG2, во второй - прошивка U300XEGJ1

Качаем SYM-файл прошивки U600XEGG2. Это символьный файл. В нём хранится список адресов и названий функций прошивки. Очень редко такой файл удаётся найти в архиве с прошивкой, но если удаётся, то патчинг этой прошивки значительно упрощается, иначе приходится собирать такой файл постепенно самому. В процессе портирования каждый собирает себе такой файл для своей прошивки. ВОТ SYM файл U300XEGJ1, который я насобирал, когда портировал патчи на U300. Мы будем потом дополнять этот файл новыми функциями.

 

Начнём портировать патч. Для этого на вкладке Символы программы BinEdit с открытой U600XEGG2 Жмём на жёлтую папочку и выбираем файл U600XEGG2.sym. Если уже был открыт какой-либо символьный файл, BinEdit начнёт задавать вопросы:

 

Заполнять поле комментария именем файла - Да

Удалять дублирующие имена функций - Да

Удалить имя файла из комментария - Да

 

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

Аналогичную процедуру открытия SYM-файла делаем во второй копии программы, только уже с U300XEGJ1.SYM.

 

Теперь в копии, где открыта U300XEGJ1, кликаем на трёхцветный кубик на панели инструментов, тем самым мы запустим Компилятор. На панели инструментов компилятора кликаем на крайнюю слева иконку белого листика - Создать новый файл. Теперь заходим в папку с патчем MainMenuVib от U600, заходим в папку src, октрываем при помощи блокнота файл MainMenuVib.asm, копируем содержимое этого файла, а в компилятора в меню жмём на Правка - Вставить.

 

Когда переваришь информацию, отпишись :gunax:

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

das,

я переварил, но вот вопрос: на е900 нет файла SYM, придется вручную искать названия сцен в прошивке ведь так?

и это ведь несколько усложнит задачу.

и вот еще: как написано тут: http://binedit.sgh.ru/readme2.php,

мне нужно просто указать программе на патч который я хочу перенести, и прошивку этого патча и свою прошивку, чтобы программа сопоставила эквивалентные адреса и создала патч; так это прокатит для е900? или все нужно делать вручную?

сорри, если что не так выразил, я ведь новичок:(

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

LOSTfromAGERE,

изначально ни на одну прошивку из Новых Агере не было sym-файлов, все они делаются вручную.

ВОТ выложил для E900.

Автоматическое портирование для Agere уж точно не прокатит. Оно проходит для сисолов для прошивок с одной и то же модели наверное.

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

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

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

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

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

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

Войти

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

Войти



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