Jump to content


Photo

Portowanie funkcji bibliotek dla ElfPacka w IDA


  • Please log in to reply
1 reply 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 - 01:52

Poradnik od początku do końca został napisany przeze mnie i jest moją własnością. Kopiowanie, rozprzestrzenianie lub jakakolwiek modyfikacja jest zabroniona!

Witam Posted Image

Przedstawiam opis portowania funkcji bibliotek elfpacka.
Jest dużo pisania, jednak przeportowanie jednej funkcji biblioteki zajmuje mi teraz około 30 sekund (mając już otwarty main w IDA). Tak więc nie taki diabeł straszny.... Posted Image

Uwaga!
W poradniku są użyte przypisy. Gdy zobaczysz gwiazdki na końcu zdania, to zobacz do przypisów na końcu poradnika


Przygotowanie.

Pobieranie niezbędnych plików


1. Kluczem jest IDA Pro. Program waży w granicach 70-100 MB. Do zdobycia na własną rękę. Po ściągnięciu instalujemy.
2. Main2Raw
3. BytesReverser
4. PatSearchNT

Otwieranie maina w IDA (Disassembling)

1. Otwieramy main w IDA według tego opisu:

Please Login or Register to see this Hidden Content



Portowanie funkcji

1. Uwaga! Na początek zalecam portować ten sam fragment, aby zrozumieć "co i jak". Gdy się uda, można portować inne funkcje Posted Image
Będziemy portować funkcję oznaczoną jako 348 spod k770 r8ba024 do k770 r8bc004.
Jest to ta funkcja:



0D20: 00000000 99294545; 348: void GUIonMessage_SetLineSeparator(GUI_MESSAGE *,int _unk1);

  • Część oznaczona kursywą to jump adress. TYLKO TA CZĘŚĆ BĘDZIE SIĘ ZMIENIAĆ!
  • Część pogrubiona to oznaczenie funkcji (ta część się nie zmienia)
  • Część podkreślona to opis funkcji (ta część się nie zmienia)
  • Część w żaden sposób nie oznaczona (offset i wartość z zerami) NIE BĘDZIE SIĘ ZMIENIAĆ - to bardzo ważne.

2. Main w IDA mamy już otwarty. Odpalamy więc BytesReverser.
3. Przytoczę fragment z pierwszego punktu w tej sekcji:



0D20: 00000000 99294545; 348: void GUIonMessage_SetLineSeparator(GUI_MESSAGE *,int _unk1);


Zaznaczamy część oznaczoną kursywą (jump adress: 99294545) i kopiujemy ją.
4. W polu Bytes To Reverse wklejamy skopiowaną wartość. Opcja "Jump to the reversed adress in IDA" ma być zaznaczona.
Posted Image

5. Klikamy Reverse Them!
6. Po kliknięciu reverse them zostaniemy przeniesieni do IDA i będzie tam zaznaczony na niebiesko ten ROM:
Posted Image

7. Myszką klikamy na rom znajdujący się o jeden wyżej (czyli zamiast 45452999 klikamy na 45452998).
8. Wciskamy Alt+G i robimy tak:
Posted Image

9. Wciskamy na klawiaturze "C". Naszym oczom ukazuje się:
Posted Image

10. Jest to dość mały kod, tak więc będzie ogromna ilość wyników. Dlatego trzeba skonwertować do kodu troche więcej offsetów. Tak więc w tym przypadku klikamy na ROM 454529A2 i klikamy "C". Kod dalej jest mały - tak więc klikamy dalej na ROM 454529AE i wciskamy "C". Kod dalej nie należy do ogromnych w tym przypadku. Klikamy więc na kolejny offset nie skonwertowany do kodu (czyli pierwszy "żółty" ROM pod czerwonymi). Ja pokuszę sie o skonwertowanie do kodu kolejnego romu, 454529C6, 454529D2, 454529DE, 454529EA, 454529FA oraz 45452A08.
Gdy kod na początku jest długi, wystarczy skonwertować tylko kolejne dwa-trzy "żółte" romy znajdujące się pod czerwonymi. Pewnie dziwicie się, że aż tyle offsetów konwertuję - to wszystko dlatego, że kod się powtarza i są to bardzo krótkie "sekwencje" kodu.
Wygląda to tak:
Posted Image

11. Cofamy się do romu, gdzie zaczęliśmy konwertować część maina do kodu. W moim przypadku jest to: 45452998
12. Zaznaczamy wszystkie ROMy, które są czerwone i kopiujemy je skrótem Ctrl+Insert.
W moim przypadku cały kod wygląda tak:
ROM:45452998 00 B5					   PUSH    {LR}
ROM:4545299A C0 68					   LDR	 R0, [R0,#0xC]
ROM:4545299C EE F7 4C F8				 BL	  sub_45440A38
ROM:454529A0 00 BD					   POP	 {PC}
ROM:454529A2			 ; ---------------------------------------------------------------------------
ROM:454529A2 00 00					   LSLS    R0, R0, #0
ROM:454529A4 00 B5					   PUSH    {LR}
ROM:454529A6 C0 68					   LDR	 R0, [R0,#0xC]
ROM:454529A8 EE F7 58 F8				 BL	  sub_45440A5C
ROM:454529AC 00 BD					   POP	 {PC}
ROM:454529AE			 ; ---------------------------------------------------------------------------
ROM:454529AE 00 00					   LSLS    R0, R0, #0
ROM:454529B0 00 B5					   PUSH    {LR}
ROM:454529B2 C0 68					   LDR	 R0, [R0,#0xC]
ROM:454529B4 EE F7 AA F8				 BL	  sub_45440B0C
ROM:454529B8 00 BD					   POP	 {PC}
ROM:454529BA			 ; ---------------------------------------------------------------------------
ROM:454529BA 00 00					   LSLS    R0, R0, #0
ROM:454529BC 00 B5					   PUSH    {LR}
ROM:454529BE C0 68					   LDR	 R0, [R0,#0xC]
ROM:454529C0 EE F7 AE F8				 BL	  sub_45440B20
ROM:454529C4 00 BD					   POP	 {PC}
ROM:454529C6			 ; ---------------------------------------------------------------------------
ROM:454529C6 00 00					   LSLS    R0, R0, #0
ROM:454529C8 00 B5					   PUSH    {LR}
ROM:454529CA C0 68					   LDR	 R0, [R0,#0xC]
ROM:454529CC EE F7 B4 F8				 BL	  sub_45440B38
ROM:454529D0 00 BD					   POP	 {PC}
ROM:454529D2			 ; ---------------------------------------------------------------------------
ROM:454529D2 00 00					   LSLS    R0, R0, #0
ROM:454529D4 00 B5					   PUSH    {LR}
ROM:454529D6 C0 68					   LDR	 R0, [R0,#0xC]
ROM:454529D8 EE F7 B8 F8				 BL	  sub_45440B4C
ROM:454529DC 00 BD					   POP	 {PC}
ROM:454529DE			 ; ---------------------------------------------------------------------------
ROM:454529DE 00 00					   LSLS    R0, R0, #0
ROM:454529E0 00 B5					   PUSH    {LR}
ROM:454529E2 C0 68					   LDR	 R0, [R0,#0xC]
ROM:454529E4 EE F7 BC F8				 BL	  sub_45440B60
ROM:454529E8 00 BD					   POP	 {PC}
ROM:454529EA			 ; ---------------------------------------------------------------------------
ROM:454529EA 00 00					   LSLS    R0, R0, #0
ROM:454529EC 00 B5					   PUSH    {LR}
ROM:454529EE C0 68					   LDR	 R0, [R0,#0xC]
ROM:454529F0 0A 1C					   ADDS    R2, R1, #0
ROM:454529F2 00 21					   MOVS    R1, #0
ROM:454529F4 EE F7 C0 F8				 BL	  sub_45440B78
ROM:454529F8 00 BD					   POP	 {PC}
ROM:454529FA			 ; ---------------------------------------------------------------------------
ROM:454529FA 00 00					   LSLS    R0, R0, #0
ROM:454529FC 00 B5					   PUSH    {LR}
ROM:454529FE C0 68					   LDR	 R0, [R0,#0xC]
ROM:45452A00 00 21					   MOVS    R1, #0
ROM:45452A02 EE F7 D1 F8				 BL	  sub_45440BA8
ROM:45452A06 00 BD					   POP	 {PC}
ROM:45452A08			 ; ---------------------------------------------------------------------------
ROM:45452A08 00 B5					   PUSH    {LR}
ROM:45452A0A 00 23					   MOVS    R3, #0
ROM:45452A0C 01 29					   CMP	 R1, #1
ROM:45452A0E 08 D0					   BEQ	 loc_45452A22
ROM:45452A10 02 29					   CMP	 R1, #2
ROM:45452A12 08 D0					   BEQ	 loc_45452A26
ROM:45452A14 03 29					   CMP	 R1, #3
ROM:45452A16 08 D0					   BEQ	 loc_45452A2A
ROM:45452A18 04 29					   CMP	 R1, #4
ROM:45452A1A 08 D0					   BEQ	 loc_45452A2E
ROM:45452A1C 05 29					   CMP	 R1, #5
ROM:45452A1E 08 D0					   BEQ	 loc_45452A32
ROM:45452A20 08 E0					   B	   loc_45452A34
ROM:45452A22			 ; ---------------------------------------------------------------------------
ROM:45452A22
ROM:45452A22			 loc_45452A22						    ; CODE XREF: ROM:45452A0Ej
ROM:45452A22 01 23					   MOVS    R3, #1
ROM:45452A24 06 E0					   B	   loc_45452A34
ROM:45452A26			 ; ---------------------------------------------------------------------------
ROM:45452A26
ROM:45452A26			 loc_45452A26						    ; CODE XREF: ROM:45452A12j
ROM:45452A26 02 23					   MOVS    R3, #2
ROM:45452A28 04 E0					   B	   loc_45452A34
ROM:45452A2A			 ; ---------------------------------------------------------------------------
ROM:45452A2A
ROM:45452A2A			 loc_45452A2A						    ; CODE XREF: ROM:45452A16j
ROM:45452A2A 06 23					   MOVS    R3, #6
ROM:45452A2C 02 E0					   B	   loc_45452A34
ROM:45452A2E			 ; ---------------------------------------------------------------------------
ROM:45452A2E
ROM:45452A2E			 loc_45452A2E						    ; CODE XREF: ROM:45452A1Aj
ROM:45452A2E 07 23					   MOVS    R3, #7
ROM:45452A30 00 E0					   B	   loc_45452A34
ROM:45452A32			 ; ---------------------------------------------------------------------------
ROM:45452A32
ROM:45452A32			 loc_45452A32						    ; CODE XREF: ROM:45452A1Ej
ROM:45452A32 08 23					   MOVS    R3, #8
ROM:45452A34
ROM:45452A34			 loc_45452A34						    ; CODE XREF: ROM:45452A20j
ROM:45452A34													 ; ROM:45452A24j ...
ROM:45452A34 C0 68					   LDR	 R0, [R0,#0xC]
ROM:45452A36 19 1C					   ADDS    R1, R3, #0
ROM:45452A38 EE F7 D0 F8				 BL	  sub_45440BDC
ROM:45452A3C 00 BD					   POP	 {PC}

13. Uruchamiamy PatSearchNT. Klikamy load FF i wybieramy MAIN, dla którego chcemy przeportować funkcję, oczywiście w formacie RAW. Ja wybieram K770 r8bc004.
14. W PatSearch, w miejscu gdzie widzimy
??,B5
??,68
??,??,??,F8
??,BD
??,00
??,B5
??,68
??,??,??,F8
??,BD
??,00
??,B5
??,68
??,??,??,F8
??,BD
??,00
??,B5
??,68
??,??,??,F8
??,BD
??,00
??,B5
??,68
??,??,??,F8
??,BD
??,00
??,B5
??,68
??,??,??,F8
??,BD
??,00
??,B5
??,68
??,??,??,F8
??,BD
??,00
??,B5
??,68
??,1C
??,21
??,??,??,F8
??,BD
??,00
??,B5
??,68
??,21
??,??,??,F8
??,BD
??,B5
??,23
??,29
??,D0
??,29
??,D0
??,29
??,D0
??,29
??,D0
??,29
??,D0
??,E0
??,23
??,E0
??,23
??,E0
??,23
??,E0
??,23
??,E0
??,23
??,68
??,1C
??,??,??,F8
??,BD


17. Teraz WSZYSTKIE miejsca, gdzie jest 8 znaków (nie licząc przecinków), zamieniamy na ??,??,??,??. Wygląda to teraz tak:
??,B5
??,68
??,??,??,??
??,BD
??,00
??,B5
??,68
??,??,??,??
??,BD
??,00
??,B5
??,68
??,??,??,??
??,BD
??,00
??,B5
??,68
??,??,??,??
??,BD
??,00
??,B5
??,68
??,??,??,??
??,BD
??,00
??,B5
??,68
??,??,??,??
??,BD
??,00
??,B5
??,68
??,??,??,??
??,BD
??,00
??,B5
??,68
??,1C
??,21
??,??,??,??
??,BD
??,00
??,B5
??,68
??,21
??,??,??,??
??,BD
??,B5
??,23
??,29
??,D0
??,29
??,D0
??,29
??,D0
??,29
??,D0
??,29
??,D0
??,E0
??,23
??,E0
??,23
??,E0
??,23
??,E0
??,23
??,E0
??,23
??,68
??,1C
??,??,??,??
??,BD

18. Klikamy SEARCH.
19. W okienku po prawej stronie ukazuje nam się: 45454544
Posted Image

20. Kopiujemy tą wartość (zaznaczona na obrazku).
21. Odpalamy windowsowski kalkulator, wybieramy widok > naukowy, później klikamy widok > szesnastkowy.
22. Wklejamy wynik z PatSearchNT, czyli 45454544. Klikamy na "+", wpisujemy "1" i dajemy ENTER. **
23. Otrzymujemy wynik 45454545, kopiujemy go (to tylko przypadek że widzimy same czwórki i piątki Posted Image )
24. Otwieramy Bytes reverser, odznaczamy ptaszka przy "Jump to the reversed adress in IDA". W pole bytes to reverse wklejamy wynik z kalkulatora i klikamy Reverse Bytes. Kopiujemy wynik z pola Reversed bytes.***
25. Mając tą linijkę z k770 r8ba024:
0D20: 00000000 99294545; 348: void GUIonMessage_SetLineSeparator(GUI_MESSAGE *,int _unk1);

Zmieniamy więc 99294545 na wynik z bytes reversera, czyli zaznaczamy 99294545 i wklejamy 45454545. Mamy więc już przeportowaną jedną funkcję biblioteki Posted Image Wygląda to tak:
0D20: 00000000 45454545; 348: void GUIonMessage_SetLineSeparator(GUI_MESSAGE *,int _unk1)


Tak więc aby wgrać tą funkcję do biblioteki elfpacka, otwieramy patch biblioteki dla naszego telefonu i wklejamy tą linijkę w patchu Posted Image Później wystarczy wgrać bibliotekę do telefonu.

26. Gdy już będziemy zamykać IDA, przy okienku, które wyskoczy robimy tak:
Posted Image

Później przy otwieraniu tego samego maina wybieramy plik IDB, ważący w granicach 100mb
Posted Image
(Screeny od zylka, dzięki bardzo Posted Image )
Dzięki temu nie musimy czekać za każdym razem na otwarcie maina i nie musimy wpisywać wartości w rom size itp.

Info: Tym sposobem w okolicach 10 minut przeportowałem 28 nowych funkcji z biblioteki spod k770 r8ba024 na r8bc004:
;K770 SW-R8BC004
;Update for elfpack library (funcs. 336-353)
;(p) mc_kibel
+45D2FC00
0CD8: 00000000 EDC50845; 336: void VideoPlayerControl(BOOK *VideoPlayerBook, int);
0CDC: 00000000 69BC0845; 337: void Video_ActionBack(BOOK*,void*)
0CE0: 00000000 45D60845; 338: void Video_ExtractFrame(BOOK *VideoPlayerBook)
0CE4: 00000000 21C00845; 339: void Video_ZoomOn(BOOK*,void*)
0CE8: 00000000 E5084C45; 33A: void RightNow_Active(int flag /*0-1*/)
0CEC: 00000000 75BF0845; 33B: void VideoResize_AutomateMode(BOOK*,u16,u16,u16*,u16*)
0CF0: 00000000 0DBF0845; 33C: void VideoResize_AllScreenMode(BOOK*,u16,u16,u16*,u16*)
0CF4: 00000000 F5CF0845; 33D: int Video_GetCurrentSkinID(BOOK*)
0CF8: 00000000 49A30845; 33E: void Video_SetSkin(GUI*,int)
0CFC: 00000000 9DBE0845; 33F: int Video_SetPermit(BOOK*,u16,u16)
0D00: 00000000 39BA0845; 340: int Video_Refresh(BOOK*,GUI*)
0D04: 00000000 E9BC0845; 341: void Video_Play(BOOK*,void*)
0D08: 00000000 21BE0845; 342: void Video_Pause(BOOK*,void*)
0D0C: 00000000 EDBD0845; 343: void Video_Stop(BOOK*,void*)
0D10: 00000000 812A0745; 344: void Audio_Pause(BOOK *)
0D14: 00000000 C5270745; 345: void Audio_Play(BOOK *)
0D18: 00000000 958F4A45; 346: GUI * CreatePercentInputVA(int zero, ...)
0D1C: 00000000 35914A45; 347: int PercentInput_GetPercent(GUI * PercentInput)
0D20: 00000000 45454545; 348: void GUIonMessage_SetLineSeparator(GUI_MESSAGE *,int _unk1)
0D2C: 00000000 694B4545; 34B: void GUIObject_Softkeys_RemoveBackground(void *gui)
0D30: 00000000 693B4545; 34C: void GUIObject_Softkeys_RestoreBackground(void *gui)
0D34: 00000000 11993F45; 34D: void SetTrayIcon(wchar_t iconID, char mode)
0D38: 00000000 D9A64145; 34E: int REQUEST_SETTING_RINGVOLUME_SET(const int *sync, int unk, int null, int vol)
0D3C: 00000000 0DAF4145; 34F: int REQUEST_SETTING_VIBRATOR_SET(const int *sync, int unk, int mode)
0D40: 00000000 C9A84145; 350: int REQUEST_SETTING_RINGTYPESOUNDFILE_SET(const int *sync, int null, wchar_t *path, wchar_t *name)
0D44: 00000000 65AE4145; 351: int REQUEST_SETTING_ANSWERINGMODE_SET(const int *sync, int unk, int mode)
0D48: 00000000 95A74145; 352: int REQUEST_SETTING_INCREASINGRING_SET(const int *sync, int unk, int unk2, int mode)
0D4C: 00000000 0DAF4145; 353: int REQUEST_SETTING_ALLOWEDCALLERS_SET(const int *sync, int unk, int mode)
Tak więc wystarczy przeczytać to kilka razy ze zrozumieniem - ja już to wszystko robię z pamięci i zajmuje to naprawdę chwilkę Posted Image Najwięcej czasu zajmuje otwarcie maina w IDA Posted Image

Przypisy:

* - Jeśli wynik jest równy 10, to dodajemy "1" do znaku wcześniej, a trzeci znak po "0x" zmieniamy na 0.

** - Dla niektórych wyda to się głupie, ale nie wszyscy pojmują system szesnastkowy i przy dodawaniu "1" do "F" "w pamięci" mogą sie pogubić, tak więc lepiej będzie jeśli zrobi to kalkulator - a wszystko będzie w stu procentach dobrze zrobione.

*** - Wprawdzie tutaj wynikiem był 45454545, tak więc po odwróceniu to również będzie 45454545. Jednak opisuje tą procedurę, gdyż w innych przypadkach i tak trzeba ją wykonać.

Zmęczyłem się trochę... No ale myślę, że się przyda. Tak więc pozdrawiam i dziękuję za uwagę Posted Image
  • 2
Sony Ericsson X8 || GingerDX v017 Android 2.3.7 || Sense Theme

#2 OFFLINE   zylka

zylka

    Junior Activist of Sony.yt Community

  • User
  • 168 posts
    • Time Online: 25d 21h 46m

Posted 29 October 2011 - 21:40

W razie problemów z dodawaniem +1 można użyć programu Developer Patch Tool produkcji juhu07.
Posiada on funkcje BytesReverser z możliwością ustawienia dodawania +1 i automatycznego wklejania "odwróconej" funkcji do otwartego pliku liba



Posted Image

Attached Files


  • 3

Reklama i pozycjonowanie stron:

szybkakasa24h.pl/rejestracja.php?id=9

http://fastsurf.eu/



0 user(s) are reading this topic