Skocz do zawartości

Binarne przeszukiwanie pliku


Rekomendowane odpowiedzi

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

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...