Spis treści:
- DumpROM by zorn
- Rozpakowanie pliku romdump.dmp na komputerze - Zripper
- Patche - co oznaczają prefiksy SnR, Rel i Abs?
- W czym i jak pisać patche oraz jak je zapisywać?
- LINKI
DumpROM by zorn
Jest to mała aplikacja (link na samym dole) na telefon która wykona nam pełny zrzut pamięci ROM. Wystarczy zainstalować, uruchomić i wybrać opcję Dump. Cała zawartość pamięci ROM zostanie zapisana do pliku E:\romump.dmp.
Rozpakowanie pliku romdump.dmp na komputerze - Zripper
Aby rozpakować plik romdump.dmp należy skopiować go na komputer i wrzucić do folderu z aplikacją Zripper (link na samym dole). Aplikacja działa z linii komend, więc aby ją uruchomić należy wejść w konsolę (uruchom -> cmd.exe), wejść do folderu z aplikacją (polecenie: CD nazwa_folderu) i wpisać:
- Code: Select all
Please Login or Register, to see this Content
Po kilku minutach w folderze DiskZ pojawią się wszystkie pliki z pamięci ROM naszego telefonu. Pliku romdump.dmp nie kasujemy, ponieważ może się nam jeszcze przydać... (patrz: prefiks Abs)
Jeśli napisy wam za szybko przelatują to możecie zapisać cały log w pliku tekstowym.
- Code: Select all
Please Login or Register, to see this Content
Patche - co oznaczają prefiksy SnR, Rel i Abs?
Prefiksy w patchach dla ROMPatcher'a:
- SnR - Search and Replace (znajdź i zamień) - znajduje i zamienia wybrany ciąg znaków na inny.
- Rel - adres relatywny, liczony od początku pliku;
- Abs - adres absolutny, odnosi się do adresu absolutnego w pamięci ROM;
SnR
Prefiks SnR znajduje ciąg znaków i zamienia go na inny, przykładowo:
- Code: Select all
Please Login or Register, to see this Content
Schemat budowy patcha z prefiksem SnR:
SnR:ścieżka\plik:znajdź:zamień
ścieżka - katalog w którym znajduje się plik, np. sys\bin
plik - nazwa pliku i jego rozszerzenie, np. sysap.exe
znajdź - ciąg znaków do znalezienia
zamień - ciąg znaków jakimi chcemy zastąpić znaleziony fragment pliku.
Rel
Prefiks Rel jest podobny do SnR, z tym że znajduje ciąg znaków w wybranej lokalizacji i zamienia go na inny. Przykład:
- Code: Select all
Please Login or Register, to see this Content
Dzięki temu prefiksowi zabezpieczamy się przed sytuacją opisaną przy prefiksie SnR, gdy dany ciąg znaków występuje kilka razy w pliku.
Schemat:
Rel:ścieżka\plik:adres:znajdź:zamień
ścieżka - katalog w którym znajduje się plik, np. sys\bin
plik - nazwa pliku i jego rozszerzenie, np. sysap.exe
adres - tutaj oznaczamy adres wybranego znaku/ciągu znaków (format 0x????????)
znajdź - ciąg znaków do znalezienia
zamień - ciąg znaków jakimi chcemy zastąpić znaleziony fragment pliku.
Skąd wziąć ten adres? Musimy wykorzystać edytor HEX (np. HxD). Adres znajduje się w kolumnie po lewej stronie:
Początek odczytujemy z prawej kolumny (w naszym przypadku 0X00000000), a za ostatnie zero podstawiamy wartość z wiersza u samej góry. I tak jeśli chodzi nam o pierwszy bajt w tej linii to za zero podstawiamy zero (czyli zostawiamy bez zmian) , jeżeli o czwarty to wstawiamy 3 (0X00000003), a jeżeli o ostatni to podstawiamy F (0X0000000F). Sytuacja wygląda analogicznie dla pozostałych wierszy.
Jeżeli chcemy podmienić np. literę Z na C w ostatnim bajcie (F) w drugiej linii (0x00000010) w pliku SnifferAIPlugin.dll to patch musi wyglądać tak:
- Code: Select all
Please Login or Register, to see this Content
Abs
Tutaj mamy sytuację identyczną jak w prefiksie Rel, jednak zamiast adresu relatywnego (liczonego tylko od początku pliku) musimy użyć adresu absolutnego w pamięci ROM. Aby go uzyskać potrzebujemy zrzutu pamięci ROM wykonanego aplikacją DumpROM.
Schemat:
Abs:adres:znajdź:zamień
położenie - tutaj oznaczamy adres wybranego znaku/ciągu znaków (format 0x????????)
znajdź - ciąg znaków do znalezienia
zamień - ciąg znaków jakimi chcemy zastąpić znaleziony fragment pliku.
Otwieramy wybrany plik (np. SplashScreen.exe) edytorem HEX i szukamy ciągu znaków który chcemy zamienić. Np. aby sprawić żeby plik splashscreen.mif był odczytywany z dysku C: zamiast Z: musimy zmienić ścieżkę z z:splashscreen.mif na c:splashscreen.mif.
Patch z użyciem prefiksu Rel wyglądałby tak:
- Code: Select all
Please Login or Register, to see this Content
Teraz otwieramy plik romdump.dmp edytorem HEX i znajdujemy ciąg: z:splashscreen.mif
Widzimy że bajt zawierający literę Z znajduje się w adresie: 0x03377CA8. UWAGA! W przypadku adresu absolutnego dla FP1 i FP2 musimy jeszcze dodać 0x80000000 (dla preFP1 należy dodać 0xF0000000). Dodawanie wygląda tak:
- Code: Select all
Please Login or Register, to see this Content
Więc nasz patch z użyciem adresu absolutnego będzie więc wyglądał tak:
- Code: Select all
Please Login or Register, to see this Content
Nie zaleca się korzystania z tego prefiksu do modyfikacji plików (ponieważ patch będzie działał tylko na jednym modelu telefonu i tylko na jednej wersji FW), ale można go wykorzystać do innych celów:
a) zmiana nazwy pliku znajdującego się w pamięci ROM
Patch może się przydać gdy chcemy np. zainstalować aplikację zawierającą plik domainsrv.exe a telefon wywala nam błąd uaktualnienia (ponieważ taki plik już znajduje się w Z:\SYS\BIN). Możemy tymczasowo zmienić nazwę pliku na np. oomainsrv.exe a następnie bezproblemowo zainstalować aplikację. Jak to zrobić? Otwieramy romdump.dmp i szukamy "domainsrv.exe". Powinniśmy znaleść coś takiego:
Adres litery d jest równy: 0x0004b31A, dodajemy 0x80000000 i możemy napisać patch:
- Code: Select all
Please Login or Register, to see this Content
Po aktywacji patcha zmieni się nazwa pliku na dysku Z:.
b) zmiana rozmiaru pliku znajdującego się w pamięci ROM
Rozmiar pliku jest zapisany zaraz przed nazwą pliku.
Nie zaleca się modyfikować rozmiary plików EXE i DLL, ale można modyfikować rozmiar innych, np. TXT. Możemy utworzyć patch w ten sam sposób jak w podpunkcie a).
W czym i jak pisać patche oraz jak je zapisywać?
Aby napisać patch można użyć systemowego Notepad'a.
Komentarze
Na początku pliku, jeszcze przed patchem można umieścić dowolny tekst poprzedzony średnikiem - ";". Tekst ten może zawierać nazwę patcha, jego zastosowanie jak i nick autora. Te informacje pojawią się w RP+ po wybraniu opcji "Info o patchu" (opcja może nazywać się inaczej, w zależności od spolszczenia).
Przykładowy patch z użyciem komentarzy:
- Code: Select all
Please Login or Register, to see this Content
Instrukcje warunkowe
ROMPatcher w wersji 2.3 pozwala na użycie instrukcji warunkowych. Można je wykorzystać jeżeli mamy różne rodzaje patcha (dla różnych telefonów) i chcemy je umieścić w jednym patchu.
- Code: Select all
Please Login or Register, to see this Content
Kod jest stosunkowo prosty: jeżeli telefon ma podane UID, aktywuj patch. MACHINE_XXXXXXXX oznacza UID telefonu. Można go znaleźć tutaj lub odczytać za pomocą aplikacji PhoNetInfo (zakładka HAL, pole Machine UID):
Tutaj kolejny przykład wykorzystania instrukcji warunkowej. Przydatne jeżeli chcemy by patch działał tylko na jednym telefonie.
- Code: Select all
Please Login or Register, to see this Content
Dzięki poleceniu #define możemy definiować nowe zmienne. Jak widać w powyższym przykładzie pojawiło się polecenie error. Wyświetla ono w RP+ małe okienko w którym znajdzie się tekst napisany po dwukropku.
Dodatkowo jeżeli patch korzysta z funkcjonalności dodanych dopiero w nowszych wersjach ROMPatcher'a, można wykorzystać instrukcje warunkowe.
- Code: Select all
Please Login or Register, to see this Content
Teraz małe wyjaśnienie:
#ifdef - Jeżeli...
#ifndef - Jeżeli nie...
#else - ...w innym wypadku...
#endif - ... i koniec.
#define - Tworzy nową definicję.
Komunikaty
ROMPatcher w czasie aktywacji patcha może wyświetlać komunikaty.
- error - czyli po prostu błąd, patch nie zostaje aktywowany. Przykładowo:
- Code: Select all
Please Login or Register, to see this Content
- info - zwykły komunikat, przykładowo:
- Code: Select all
Please Login or Register, to see this Content
Ze względu na podobną budowę postanowiłem umieścić tutaj jeszcze jedno polecenie:
- return - to polecenie sprawia że patch zostaje aktywowany ale tylko w pewnej części. Wszystkie linijki patcha napisane przed tym poleceniem zostają aktywowane, natomiast wszystko co znajduje się po nim jest zwyczajnie omijane. Na liście patchów zobaczymy więc zieloną ikonkę informującą o poprawnym aktywowaniu patcha. Przykład:
- Code: Select all
Please Login or Register, to see this Content
Makra
Patch może odczytać nie tylko wersję ROMPatchera czy UID telefonu, ale również kilka innych rzeczy...
MACHINE_(wartość HEX) - UID telefonu (np. MACHINE_2000060B czyli N95-1)
CPU_(wartość dziesiętna) - rodzaj procesora (np. CPU_0 czyli AMR)
- 0 => ECPU_ARM,
- 1 => ECPU_MCORE,
- 2 => ECPU_X86,
- 0 => ECPUABI_ARM4,
- 1 => ECPUABI_ARMI,
- 2 => ECPUABI_THUMB,
- 3 => ECPUABI_MCORE,
- 4 => ECPUABI_MSVC,
- 5 => ECPUABI_ARM5T,
- 6 => ECPUABI_X86,
- 3.0 => 3rd Edition
- 3.1 => 3rd Edition FP1
- 3.2 => 3rd Edition FP2
- 5.0 => 5th Edition
FW_(wartość dziesiętna) - wersja FirmWare (np. FW_30.0.0.15)
RP+VERSION_(wartość dziesiętna) - Wersja RP+ (np. RP+VERSION_2.3)
Wieloznaki
Aplikacja ROMPatcher pozwala na stosowanie pytajników "??" w patchach. Co to daje? Tutaj przykład patcha z wykorzystaniem wieloznaków:
- Code: Select all
Please Login or Register, to see this Content
Jak widzimy w patchu pojawiły się pytajniki. Teraz rozbijemy patch na dwie części:
- Code: Select all
Please Login or Register, to see this Content
Search (znajdź)
Zaczynamy od ciągu bajtów które ROMPatcher musi znaleźć (Search). Użycie wieloznaków w polu "Search" sprawia że RP podczas wyszukiwania nie będzie zwracał uwagi na bajty oznaczone pytajnikami. Co to oznacza? Że szukając ciągu bajtów 0011????02233043 może znaleźć np.
- Code: Select all
Please Login or Register, to see this Content
i podmienić ciąg bajtów bez względu na to znajdzie się pod pytajnikami. Teraz pytanie: do czego można to użyć? Głównym zastosowaniem pytajników jest zwiększenie uniwersalności patcha po zastosowaniu prefiksu SnR. Im dłuższy ciąg do wyszukania tym trudniej o sytuację w której ROMPatcher znajdzie dwa takie samie ciągi bajtów. Jednak może się zdarzyć że na innym telefonie ten ciąg będzie wyglądał trochę inaczej - wtedy różniące się bajty zastępujemy pytajnikami.
Replace (zamień)
Teraz ciąg bajtów którym mamy zastąpić (Replace) to co RP znajdzie. Jeżeli nie ma konieczności aby zastąpić cały ciąg bajtów, ponieważ któryś bajt nie zawiera nic przydatnego, albo zaistnieje sytuacja w której wręcz konieczne będzie pozostawienie kilku bajtów bez zmian możemy użyć pytajników. Wieloznaki w części "Replace" informują ROMPatchera że zaznaczone bajty ma pozostawić bez zmian.
Uwaga! Nie można stosować pojedynczych pytajników! Za jeden bajt odpowiadają zawsze dwa pytajniki!
Przykładowe patche
Korzystając z makr i instrukcji warunkowych można robić bardzo rozbudowane patche.
Przykład 1. Patch "No Profile Name on Idle" od CODeRUS'a zadziała tylko na najnowszym firmware na n95-1. Na pozostałych telefonach lub gdy posiadamy starszy firmware wyskoczy błąd.
- Code: Select all
Please Login or Register, to see this Content
Przykład 2. Patch "Disable Popup Fader" zadziała tylko na N95, N96 i 5800:
- Code: Select all
Please Login or Register, to see this Content
Zapisywanie patcha (Notatnik)
Żeby zapisać patch należy wybrać Plik -> Zapisz jako..., następnie zmienić typ na "wszystkie pliki (*.*)" i dopisać do nazwy pliku rozszerzenie .rmp.
Teraz wystarczy przenieść gotowy patch na telefon.
Za informacje wielkie podziękowania dla: templove, segalx, Microx256 oraz Marco.
Linki
DumpROM by zorn + zripper
- Code: Select all
Please Login or Register, to see this Content
HxD 1.7.7.0 PL Portable - edytor HEX:
- Code: Select all
Please Login or Register, to see this Content