jabools Opublikowano 21 Sierpnia 2014 Udostępnij Opublikowano 21 Sierpnia 2014 Witam :) Pracuję nad Androidowym multitoolem (tak do własnych potrzeb i z czystej zabawy) w C#. Piszę obecnie moduł rozdzielania obrazów boot.img i recovery.img. Ogólna struktura pliku boot.img jest mi znana, więc postanowiłem sobie (po analizie obrazów boot.img) rozdzielać ten plik na zasadzie szukania charakterystycznych bajtów, następnie kalkulowania rozmiaru kernela czy ramdiska i przekalkulowaniu ich na wielokrotności page size. Obecnie ten moduł działa w ten sposób (uwzględniam standardowe obrazy, czyli header, kernel, ramdisk): - (offset = 0) Szukam android magic, jeżeli nie ma go w odległości 255 bajtów to przerywam przetwarzanie pliku. - Jeżeli jest, szukam ciągu 4x "0x00, 0x00, 0xA0, 0xE1" - nazwę go sobie kernel_offset. Wszystko przed tym to header. - Page size = kernel_offset - android magic offset. - Lecę sobie przez kernela w poszukiwaniu 16 bajtów zer (struktura tych plików, przynajmniej 3 różnych telefonów które przeanalizowałem, opiera się o wielokrotności 16 bajtów). Do bufora ładuję po 16 bajtów, które są sprawdzane. - Jeżeli znajdę "bunch of zeroes", ustalam rozmiar kernela i przeliczam go na kernel_pages [kernel_pages = (kernel_size + header_size - 1) / header_size] - Po wyliczeniu kernel_pages, zapisuję kernela do pliku (plik o rozmiarze kernel_pages * page_size). - Całą resztę pliku (bo kernel pages kończy się w miejscu, gdzie jest GZ magic, czyli 1F 8B) zapisuję do archiwum ramdisk. I wszystko byłoby fajnie, bo działa pięknie dla obrazów np. HTC Sensation, czy LG Optimus L5. Ale przy Samsungu Galaxy S4 jest problem, gdyż w środku kernela jest przerwa (występuje tam 16 bajtów zer, jakieś 3/4 razy). Próbowałem to rozwiązać na zasadzie, że jeżeli znajdę zera, to sprawdzam czy za nimi jest już GZ magic, czy jakieś inne dane. Jeżeli gz magic, ustawiam offset ramdisku, jeżeli inne dane, to lecę przez nie w poszukiwaniu zer i znów sprawdzam czy za zerami jest gz magic. I tak w kółko. Z tym, że pętla nie chce poprawnie działać, bądź ja nie potrafię jej dobrze oprogramować. Wrzucę może lepiej kod, mam nadzieję, że coś z niego będzie wiadomo KOD Byłby w stanie ktoś pomóc? Z góry dzięki :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się