Jump to content


Photo

Portowanie zaawansowanych patchy! Portowanie patchy WinHexem


  • Please log in to reply
No replies to this topic

#1 OFFLINE   mc_kibel

mc_kibel

    Proud Member of Sony.yt Community

  • User
  • 26 posts
    • Time Online: 1h 1m

Posted 29 October 2011 - 02:48

Uwaga!
Jest to stary poradnik na temat portowania patchy. Nowy, dokładniejszy, a przede wszystkim profesjonalny sposób portowania znajduje się tutaj: http://www.sonyerics...rzy-uzyciu-asm/


Witam.

Poradnik od początku do końca został napisany przeze mnie. Kopiowanie, rozprzestrzenianie lub jakakolwiek modyfikacja bez mojej wiedzy jest zabroniona. Zaznaczam, że nie odpowiadam za uszkodzenia telefonu spowodowane niedokładnym czytaniem poradnika. Wszystko robisz na własną odpowiedzialność.

Uwaga. Opis portowania PROSTYCH patchy również jest tutaj zawarty i znajduje się na samym dole poradnika. Na początek dobrze jest właśnie zacząć od prostych patchy, aby później przesiąść się na większe.


Rozpisywać się nie będę, tylko od razu do rzeczy: przedstawiam Wam poradnik portowania zaawansowanych patchy.
Pod pojęciem "zaawansowanych patchy" kryje się pojęcie portowania patchy, które używają wolnych miejsc w mainie, czyli takich, które obok offseta mają wartości z zerami:

1bd7940: 00000000000000000000000000000000 142801D2002070471E2801D201207047

Uwaga! Cała procedura będzie przedstawiona na patchu "Podświetlenie od 10 do 100%", portowanego z K770i R8BA024 na K770i R8BC004 [db2020].
Wszystko wykonujemy analogicznie dla innych modeli telefonu.
Zaleca się również portowanie z softu jednego telefonu na inny soft również tego samego telefonu, gdyż mainy są do siebie bardziej podobne co ułatwia portowanie.
Nie oznacza to jednak, że nie można portować np. z K800i na W580i :P Owszem można tylko w niektórych momentach może być ciężko.



Wprowadzenie

Pierwszym krokiem będzie ustalenie bazy naszego firmware oraz platformy.
Będę dodawał tutaj telefony w miarę zdobywania informacji.
Jeśli ktoś będzie znał model telefonu i jego bazę, proszę o napisanie tego w tym temacie, uzupełnię wtedy poradnik.

DB2010
baza w zależności od modelu:
  • dla K510i: 44140000
  • dla K750i/D750i/W800i/W700i: 44020000
  • dla W810i: 44140000
DB2020
  • K770i/k800i/k790i/k810i/w850i : 44140000
  • Inne modele tutaj niewymienione powinny posiadać bazę 44140000.
DB3150 - tutaj portowanie jest troche cięższą sprawą.
  • Wszystkie telefony z softem a2 v1: baza dla całego phone_app: FFFE000, a baza właściwej części maina 10000000 (czyli tyle będziemy dodawać do jump adresów).
Teraz już wiemy (mam nadzieję, że wiemy Posted Image ) jaką baze ma nasz telefon.

Pobieranie / przygotowanie niezbędnych plików

1. Musimy zaopatrzyć się w WinHexa (tak, w WinHexa, żadne inne hex-edytory, gdyż skróty klawiaturowe i dokładny opis będzie właśnie dla niego)
Wpisać w google i pobrać.

2. Teraz oczywiście musimy mieć patcha, którego chcemy przeportować.

3. Pobieramy MAIN, dla którego patch istnieje oraz MAIN, na który chcemy przeportować patcha.

4. Pobieramy program Main2Raw. Przeciągamy pliki .mbn od ściągniętych softów na ten program. W folderze z mainem utworzą się pliki w formacie RAW o takiej samej nazwie jak plik .mbn.

Otwieranie plików
Ehh już jestem zmęczony a to dopiero początek... Posted Image

1. Otwieramy w WinHexie utworzone przez program Main2Raw pliki softu [obydwa].

2. Otwieramy plik .vkp patcha za pomocą notatnika. W moim przypadku jest to:



;K770 SW-R8BA024
;Alows to adjust brightness from 10 before 100%
;? IronMaster
;(p)A1z
+44140000
12d0e7c: 401D0A21 401C0A21
12d2110: 262801D200207047312801D2 00B50149884700BD4179D145
12d213c: 042810D801A1095C8F44C046 00B50149884700BD8D79D145
12d218a: 0522281C 0922281C
1384c78: 242901D22421 0A2901D20A24
1bd7940: 00000000000000000000000000000000 142801D2002070471E2801D201207047
1bd7950: 00000000000000000000000000000000 282801D202207047322801D203207047
1bd7960: 00000000000000000000000000000000 3C2801D204207047462801D205207047
1bd7970: 00000000000000000000000000000000 502801D2062070475A2801D207207047
1bd7980: 00000000000000000000000000000000 642801D2082070470920704708281AD8
1bd7990: 00000000000000000000000000000000 01A1095C8F44C0460A0E12161A1E2226
1bd79a0: 00000000000000000000000000000000 2A000A207047142070471E2070472820
1bd79b0: 00000000000000000000000000000000 7047322070473C207047462070475020
1bd79c0: 00000000000000000000 70475A20704764207047


Gdy patch nie ma bazy

Może się zdarzyć tak, że patch nie ma bazy. Baza jest to linijka z plusem i wartością obok, poprzedzające główną część patcha:

+44140000
12d0e7c: 401D0A21 401C0A21

W przypadku tego patcha jest to baza +44140000. Tak więc gdy bazy nie ma, od offsetu musimy odjąć baze softa naszego telefonu (wymienione we wprowadzeniu). Dla przykładu patch na zmianę położenia progressbara (w850):
;W850 SW-R1KG001
;Changing position progressbar in recording video
;(c) jamesbond22
4513d492: E11D 611C
4513d49a: 50 6E
4513d66c: 51 6F
4513d66e: 08 02
45075752: 50 6E
45075768: C01D 401C


Tak więc bierzemy pierwszy offset z patcha (4513d492), odejmujemy bazę maina w850 (jest to 44140000) i wychodzi nam FFD492. Dopisujemy bazę +44140000 (akurat w tym przypadku jest to taka wartość) linijkę nad patchem i wpisujemy wynik naszego działania zamiast oryginalnego offsetu:

;W850 SW-R1KG001
;Changing position progressbar in recording video
;(c) jamesbond22
+44140000
FFD492: E11D 611C
xxxxxxxx: 50 6E
xxxxxxxx: 51 6F
xxxxxxxx: 08 02
xxxxxxxx: 50 6E
xxxxxxxx: C01D 401C


No i to samo robimy z kolejnymi offsetami. Teraz tylko odejmujemy od nich bazę i zamieniamy. Gdy zrobimy to ze wszystkimi offsetami, przechodzimy do portowania.

Portowanie!

1. Pierwszym krokiem będzie odnalezienie Jump adresów. Jump adresy mogą być w każdym miejcu.
Rozpoznaje się je po co siódmym i co ósmym znaku, a wartością rozpoznawczą wśród db201x i db2020 jest 44 lub 45. W przypadku DB3150 są to 11 lub 12. Długość jump adresu to 8 znaków.
Dla przykładu w tym patchu są to pogrubione wartości [a miejsca po których to rozpoznano są podkreślone] :

;K770 SW-R8BA024
;Alows to adjust brightness from 10 before 100%
;? IronMaster
;(p)A1z
+44140000
12d0e7c: 401D0A21 401C0A21
12d2110: 262801D200207047312801D2 00B50149884700BD4179D145
12d213c: 042810D801A1095C8F44C046 00B50149884700BD8D79D145
12d218a: 0522281C 0922281C
1384c78: 242901D22421 0A2901D20A24
1bd7940: 00000000000000000000000000000000 142801D2002070471E2801D201207047
1bd7950: 00000000000000000000000000000000 282801D202207047322801D203207047
1bd7960: 00000000000000000000000000000000 3C2801D204207047462801D205207047
1bd7970: 00000000000000000000000000000000 502801D2062070475A2801D207207047
1bd7980: 00000000000000000000000000000000 642801D2082070470920704708281AD8
1bd7990: 00000000000000000000000000000000 01A1095C8F44C0460A0E12161A1E2226
1bd79a0: 00000000000000000000000000000000 2A000A207047142070471E2070472820
1bd79b0: 00000000000000000000000000000000 7047322070473C207047462070475020
1bd79c0: 00000000000000000000 70475A20704764207047

2. Kolejnym krokiem będzie ustalenie miejsca, do którego jump adresy się odwołują.

Bierzemy pierwszy pogrubiony jump z patcha: 4179D145.
Takie rzeczy w patchu są poodwracane bajtami (jako, że jest to system heksadecymalny, to jednym bajtem są dwa znaki).
Odczytujemy więc jump adress od końca po dwa znaki: czyli zamiast 41 79 D1 45 będzie to 45 D1 79 41 [porobiłem odstępy i pooznaczałem znaki, żeby rzuciło wam się to lepiej w oczy].
Tak więc dobrze jest mieć otwarty pusty dokument w notatniku, aby można było sobie notować jump adresy i je odwracać.
Bierzemy ten odwrócony jump adres zaznaczamy myszką i kopiujemy [Tym odwróconym jump adresem jest 45D17941 w moim przypadku].

Zamiast odwracać jump adresy ręcznie można użyć programu Bytes Reverser. Odznaczamy w nim opcję "Jump into reversed adress in IDA", wklejamy jump, dajemy REVERSE i kopiujemy wartość z dołu. Program do pobrania w załączniku.

Otwieramy windowsowski kalkulator.Klikamy u góry Widok>Naukowy. Zaznaczamy kropkę przy HEX.
Dajemy edycja>wklej. Klikamy na minus ( - ) i odejmujemy bazę naszego telefonu + 1. Dla K770i jest to 44140001.
Tak więc po wykonaniu działania: 45D17941 - 44140001 = 1BD7940.

Teraz przyglądamy się naszemu patchowi. Jeśli znajdziemy offset o wartości takiej, jakiej jest wynik działania to wykonujemy to co jest do wykonania poniżej. A jeśli nie ma offsetu o wartości takiej jak wynik działania, to przechodzimy do offsetu jakim jest wynik działania [klikamy na dole winhexa na offset i wpisujemy wartość] w mainie dla którego patch istnieje, zaznaczamy kilka miejsc na prawo, wciskamy CTRL+shift+c, w drugim mainie dajemy w WinHexie "search" i "find hex values", Wklejamy skopiowane wartości i wciskamy ENTER, gdy winhex znajdzie wartości to wciskamy F3. Jeśli znajdzie kolejne, to z pierwszego maina kopiujemy więcej wartości i szukamy w drugim mainie, a jeśli nie znajdzie wogóle, to kopiujemy mniej wartości i szukamy w drugim mainie, w każdym razie musimy doprowadzić do takiego stanu, aby wynik poszukiwania == 1; gdy uda nam się to zrobić spisujemy offset z dołu winhexa, dodajemy do niego kalkulatorem 44140001 i odwracamy po dwa znaki.

Jednak w naszym przypadku jest taki offset w patchu. Jest to ta linijka:
1bd7940: 00000000000000000000000000000000 142801D2002070471E2801D201207047
I zaraz się nią zajmiemy. Teraz jednak musimy zlokalizować, gdzie drugi jump adress się odwołuje.

3. Teraz sprawdzamy gdzie odwołuje się drugi jump - jest to 8D79D145. Odwracamy go po dwa znaki i odejmujemy bazę + 1, czyli w naszym przypadku 44140001. Czyli z 8D79D145 powstaje 45d1798d, odejmujemy 44140001 i powstaje 1BD798C. Tak więc robimy sobie notatki przy patchu:

;K770 SW-R8BA024
;Alows to adjust brightness from 10 before 100%
;? IronMaster
;(p)A1z
+44140000
12d0e7c: 401D0A21 401C0A21
12d2110: 262801D200207047312801D2 00B50149884700BD4179D145; jump do offsetu 1bd7940 w patchu
12d213c: 042810D801A1095C8F44C046 00B50149884700BD8D79D145; jump do offsetu 1BD798C w patchu
12d218a: 0522281C 0922281C
1384c78: 242901D22421 0A2901D20A24
1bd7940: 00000000000000000000000000000000 142801D2002070471E2801D201207047
1bd7950: 00000000000000000000000000000000 282801D202207047322801D203207047
1bd7960: 00000000000000000000000000000000 3C2801D204207047462801D205207047
1bd7970: 00000000000000000000000000000000 502801D2062070475A2801D207207047
1bd7980: 00000000000000000000000000000000 642801D2082070470920704708281AD8
1bd7990: 00000000000000000000000000000000 01A1095C8F44C0460A0E12161A1E2226
1bd79a0: 00000000000000000000000000000000 2A000A207047142070471E2070472820
1bd79b0: 00000000000000000000000000000000 7047322070473C207047462070475020
1bd79c0: 00000000000000000000 70475A20704764207047

Teraz pytanie skąd wiemy że 1bd798c odwołuje się do patcha, skoro nie ma takiego offsetu. Tak więc owszem jest, ale głębiej.

Interesuje nas offset + C.

Posted Image

Tak więc jump odwołuje się do offsetu 1bd7980 + C.

4. Musimy teraz przeportować wartości do miejsc z zerami, czyli

+44140000
12d0e7c: 401D0A21 401C0A21
12d2110: 262801D200207047312801D2 00B50149884700BD4179D145; jump do offsetu 1bd7940 w patchu
12d213c: 042810D801A1095C8F44C046 00B50149884700BD8D79D145; jump do offsetu 1BD798C w patchu
12d218a: 0522281C 0922281C
1384c78: 242901D22421 0A2901D20A24

Tak więc kopiujemy pierwszy offset 12d0e7c. W winhexie, mając otwarty main dla którego patch istenieje klikamy na dole offset, wklejamy te 12d0e7c i klikamy ENTER. Kopiujemy kilka wartości na prawo [ctrl+shift+c]. Przechodzimy do drugiego maina, klikamy u góry search>find hex values. Wklejamy wartości, dajemy ENTER. Winhex znajdzie wartości. Klikamy F3. Jak znajdzie kolejne to kopiujemy więcej wartości, a gdy nie znajdzie już więcej to wpisujemy nowy offset zamiast 12d0e7c do patcha. W naszym przypadku będzie to nowy offset 12d2a2c.

Wykonujemy punkt powyżej dla wszystkich offsetów przed zerami, czyli do offsetu 1384c78 włącznie. Jeśli zrobiliśmy wszystko dobrze, to wychodzi nam:

+44140000
12d2a2c: 401D0A21 401C0A21
12d3cb8: 262801D200207047312801D2 00B50149884700BD4179D145
12d3ce4: 042810D801A1095C8F44C046 00B50149884700BD8D79D145
12d3d32: 0522281C 0922281C
138682c: 242901D22421 0A2901D20A24


No więc te miejsca mamy przeportowane.

5. Teraz kolejnym krokiem będzie znalezienie wolnych miejsc w mainie, czyli miejsc z zerami. Mając otwarty main, dla którego chcemy przeportować patcha, zjeżdżamy na sam dół. Wybieramy któryś offset z tych wolnych miejsc.
Mała uwaga: musimy użyć miejsc, których nie używają inne zaawansowane patche, dobrze jest więc przejrzeć patche żeby mieć rozeznanie, które miejsca są użyte. W moim przypadku nowym wolnym miejscem będzie offset 1CBF400.

Tak więc zmieniamy wartość pierwszego offseta obok którego występują zera z 1bd7940 na 1CBF400. Kolejny offset wpisujemy taki, jaki jest offset wyżej + 10 (liczymy kalkulatorem w hexie) tak więc kolejny offset będzie miał 1CBF410. Z kolejnym offsetem robimy to samo, z tą różnicą, że 10 dodajemy do poprzedniego, czyli 1cbf410 + 10.

Tak więc wychodzi nam:

1CBF400: 00000000000000000000000000000000 142801D2002070471E2801D201207047
1CBF410: 00000000000000000000000000000000 282801D202207047322801D203207047
1CBF420: 00000000000000000000000000000000 3C2801D204207047462801D205207047
1CBF430: 00000000000000000000000000000000 502801D2062070475A2801D207207047
1CBF440: 00000000000000000000000000000000 642801D2082070470920704708281AD8
1CBF450: 00000000000000000000000000000000 01A1095C8F44C0460A0E12161A1E2226
1CBF460: 00000000000000000000000000000000 2A000A207047142070471E2070472820
1CBF470: 00000000000000000000000000000000 7047322070473C207047462070475020
1CBF480: 00000000000000000000 70475A20704764207047


6. Łączymy utworzone przez nas części, czyli części z zerami i część do miejsc z zerami. Wychodzi:

;K770 SW-R8BA024
;Alows to adjust brightness from 10 before 100%
;? IronMaster
;(p) mc_kibel
+44140000
12d2a2c: 401D0A21 401C0A21
12d3cb8: 262801D200207047312801D2 00B50149884700BD4179D145
12d3ce4: 042810D801A1095C8F44C046 00B50149884700BD8D79D145
12d3d32: 0522281C 0922281C
138682c: 242901D22421 0A2901D20A24
1CBF400: 00000000000000000000000000000000 142801D2002070471E2801D201207047
1CBF410: 00000000000000000000000000000000 282801D202207047322801D203207047
1CBF420: 00000000000000000000000000000000 3C2801D204207047462801D205207047
1CBF430: 00000000000000000000000000000000 502801D2062070475A2801D207207047
1CBF440: 00000000000000000000000000000000 642801D2082070470920704708281AD8
1CBF450: 00000000000000000000000000000000 01A1095C8F44C0460A0E12161A1E2226
1CBF460: 00000000000000000000000000000000 2A000A207047142070471E2070472820
1CBF470: 00000000000000000000000000000000 7047322070473C207047462070475020
1CBF480: 00000000000000000000 70475A20704764207047

7. Pozostało nam przeportowanie jump adresów, czyli pogrubionych adresów w patchu.

Jako, że w oryginalnym patchu dla k770i r8ba024 wartości te odwoływały się odpowiednio do 1bd7940 i druga do 1BD7980 + C w patchu dla r8ba024, to teraz pierwszy jump będzie odwoływał się do 1CBF400, a drugi do 1CBF440 + C, czyli 1CBF44C.

Trzeba z nich tylko utworzyć jump adresy.

8. Tworzenie jumpów z offsetów.

Mając offset 1CBF400, kopiujemy go do kalkulatora, dodajemy bazę + 1, czyli w moim przypadku 44140001. Wychodzi nam 45DFF401. Odwracamy je teraz po dwa znaki od końca i wychodzi nam: 01F4DF45.

Wklejamy więc 01F4DF45 zamiast 4179D145 w tej linijce:

12d3cb8: 262801D200207047312801D2 00B50149884700BD4179D145

i wychodzi nam:
12d3cb8: 262801D200207047312801D2 00B50149884700BD01F4DF45

Teraz mając drugi offset czyli 1CBF44C, dodajemy do niego 44140001, wychodzi 45DFF44D - odwracamy go po dwa znaki. Wychodzi nam jump 4DF4DF45. Wklejamy go w tej linijce niżej zamiast 8D79D145:

12d3ce4: 042810D801A1095C8F44C046 00B50149884700BD8D79D145

I wychodzi nam:

12d3ce4: 042810D801A1095C8F44C046 00B50149884700BD4DF4DF45


Łączymy wszystko w kupę, zmieniamy wersję oprogramowania w opisie patcha, obok (p) wpisujemy swój nick i powstaje nam przeportowany patch.

;K770 SW-R8BC004
;Alows to adjust brightness from 10 before 100%
;? IronMaster
;(p) mc_kibel
+44140000
12d2a2c: 401D0A21 401C0A21
12d3cb8: 262801D200207047312801D2 00B50149884700BD01F4DF45
12d3ce4: 042810D801A1095C8F44C046 00B50149884700BD4DF4DF45
12d3d32: 0522281C 0922281C
138682c: 242901D22421 0A2901D20A24
1CBF400: 00000000000000000000000000000000 142801D2002070471E2801D201207047
1CBF410: 00000000000000000000000000000000 282801D202207047322801D203207047
1CBF420: 00000000000000000000000000000000 3C2801D204207047462801D205207047
1CBF430: 00000000000000000000000000000000 502801D2062070475A2801D207207047
1CBF440: 00000000000000000000000000000000 642801D2082070470920704708281AD8
1CBF450: 00000000000000000000000000000000 01A1095C8F44C0460A0E12161A1E2226
1CBF460: 00000000000000000000000000000000 2A000A207047142070471E2070472820
1CBF470: 00000000000000000000000000000000 7047322070473C207047462070475020
1CBF480: 00000000000000000000 70475A20704764207047


Portowanie prostych patchy.

Przed zaczęciem, czytamy opisy wyżej: "Wprowadzenie", "Pobieranie / przygotowanie niezbędnych plików" i "Otwieranie plików".

No więc mamy sobie taki o to malutki, prosty patch:


;K770 SW-R8BA024
;Zmienia kolor paska postępu w odtwarzaczu na pomarańczowy.
;? Hussein
;? svinuk
;(p) Zyozya
4507BC00: 04E400FF 0030F6FF

Jako, że patch nie ma bazy, odejmujemy od offseta bazę maina naszego telefonu (w tym przypadku 44140000) i linijkę wyżej dodajemy bazę, poprzedzając ją plusem. Wynik działania 4507BC00-44140000=F3BC00



;K770 SW-R8BA024
;Zmienia kolor paska postępu w odtwarzaczu na pomarańczowy.
;? Hussein
;? svinuk
;(p) Zyozya
+44140000
F3BC00: 04E400FF 0030F6FF


Pokazany patch będzie portowany spod K770i R8ba024 na K770i R8BC004.

No więc zaznaczamy i kopiujemy offset (offset jest to część zaznaczona na pomarańczowo).
W WinHexie przechodzimy do maina, dla którego istnieje patch. Klikamy na dole WinHexa OFFSET i wklejamy nasz offset z patcha ( w tym przypadku będzie to f3bc00 ). Klikamy ENTER. Od miejsca, które wskazał WinHex, zaznaczamy kilka miejsc na prawo. Kopiujemy wartości HEX skrótem klawiaturowym CTRL+SHIFT+C. Przechodzimy do drugiego maina, dla którego chcemy przeportować patcha. Klikamy u góry winhexa SEARCH > Find HEX Values. Wklejamy skopiowaną wartość i wciskamy ENTER. Program powinien znaleźć tą wartość. Naciskamy F3 i jeśli ukaże się kolejna wartość, to przechodzimy do pierwszego maina i kopiujemy więcej wartości. Ogólnie to polecam zaznaczanie czterech do ośmiu wartości (czyli od 8 do 16 znaków). Później ponawiamy szukanie. Musimy doprowadzić do sytuacji, aby ilość wyszukiwań była równa 1.

No i ok, doprowadziliśmy do sytuacji, że ilość wyszukiwań jest równa 1. I co dalej?

Odczytujemy z dołu WinHexa offset. W naszym przypadku jest to F3C8DC. Wstawiamy ją do patcha zamiast oryginalnego offseta. Zmieniamy wersję softa w opisie patcha i obok (p) wpisujemy swój nick. Efekt:


;K770 SW-R8BC004
;Zmienia kolor paska postępu w odtwarzaczu na pomarańczowy.
;? Hussein
;? svinuk
;(p) mc_kibel
+44140000
F3C8DC: 04E400FF 0030F6FF


Attached File  BytesReverser.rar   7.65K   3 downloads

Edited by not found, 19 April 2012 - 21:52.

  • 3
Sony Ericsson X8 || GingerDX v017 Android 2.3.7 || Sense Theme


0 user(s) are reading this topic