Witam
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....
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:
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
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.
5. Klikamy Reverse Them!
6. Po kliknięciu reverse them zostaniemy przeniesieni do IDA i będzie tam zaznaczony na niebiesko ten ROM:
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:
9. Wciskamy na klawiaturze "C". Naszym oczom ukazuje się:
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:
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
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 )
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 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 Później wystarczy wgrać bibliotekę do telefonu.
26. Gdy już będziemy zamykać IDA, przy okienku, które wyskoczy robimy tak:
Później przy otwieraniu tego samego maina wybieramy plik IDB, ważący w granicach 100mb
(Screeny od zylka, dzięki bardzo )
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ę Najwięcej czasu zajmuje otwarcie maina w IDA
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ę