Hack software to unlock hardware - o potyczkach z HUBami USB w moim tablecie

Hej,

Ostatnio kupiłem jeden z chińskich tabletów, bazujący na układzie RK3066. Podobał mi sie głównie właśnie ze względu na RK3066 - na tym układzie można wiele eksperymentować a procesor zainstalowany przy nim jest bardzo wydajny.

Zirytowało mnie jednak, że po podłączeniu HUBa USB urządzenia przyłączone do tego HUBa nie działały. Podłączane bezpośrednio do portu w tablecie działały bez problemów. Pomyślałem sobie, że nie jest to zbyt fajne, zwłaszcza, że gdzieś w podróży może przydać się klawiatura i myszka z pendrivem na raz.

Wiedząc, że praktycznie niemożliwe jest zbrickowanie tabletu, wziąłem się za zabawę. Pierwsze, co zrobiłem to zainstalowałem emulator terminala celem zrzucenia kodu jednej ciekawej funkcji do pliku.

Chodzi o funkcję hub_probe. Jest tam pewien interesujący fragment:

#ifdef  CONFIG_USB_OTG_BLACKLIST_HUB
      if (hdev->parent) {
              dev_warn(&intf->dev, "ignoring external hub\n");
              return -ENODEV;
      }
#endif

Widać, że wszelakie urządzenia mające rodzica (podłączone do innego urządzenia usb) będą ignorowane.

Zrzućmy sobie hexkod funkcji hub_probe do pliku. Zrzućmy sobie 512 bajtów za pomocą polecenia dd, podając jako input file /dev/kmem. Adres z którego będziemy zrzucać wydobędziemy za pomocą


cat kallsyms | grep hub_probe


Należy pamiętać, żeby w dd podać adres decymalnie, konwertując z powyższego polecenia wartość z HEXa na DEC.

Dobra, mamy plik zawierający 512b kodu maszynowego startując na funkcji hub_probe. Wrzućmy to w IDA pro, zaznaczając składnię ARMv7a.

Oto co nam się ukaże:


Mamy zaznaczone co musimy zmienić (zgodnie z kodem open-sorce Androida, w kernelu drugie porównanie w funkcji hub_probe służy do sprawdzenia, czy mamy styczność z HUBem). Zgodne z tym co widzimy dalej, skok bezwarunkowy (B) ma kod operacji 0xEA. Musimy zmienić więc 0x0A na 0xEA.

W przypadku mojego tabletu mam trzy opcje:
  1. Edycja pliku kernela i udostępnienie go do flashowania.
  2. Udostępnienie aplikacji edytującej /dev/kmem
  3. Użycie polecenia dd, by wprowadzić hotpatch do /dev/kmem
Najpierw stworzyłem aplikację (2). Otwiera ona /dev/kmem modyfikując jądro po jej uruchomieniu. Stwierdziłem jednak, że nie chce mi się za każdym uruchamianiem tabletu włączać owej aplikacji. Stworzyłem więc sztywny patch na jądro (1). Plik kernel.img zawarty w ROMie udostępnianym do tabletu posiadał header i sumę kontrolną. Trzeba więc było wyciąć 8 pierwszych i 4 ostatnie bajty, celem uzyskania czystego obrazu kernela. Potem wyszukując po bajtach znalazłem cel i zmieniłem kod operacji 0x0A na 0xEA. Następnie spakowałem obraz kernela ponownie dodając sumę kontrolną i nagłówek. Wgrałem ROM na tablet.

Jak na razie hub USB działa świetnie (jak i 4 urządzenia podłączone do niego)

Metoda powinna działać w większości tabletów / telefonów, które programowo mają zablokowane HUBy USB. Przestrzegam jednak, że nie każde urządzenie "wyrobi" prądowo - nie chcę zatem odpowiadać za uszkodzenia układów USB w waszych droidach.

Komentarze

  1. Ciekawy artykuł. Czy masz jakiś inny pomysł na sprawdzenie adresu pamięci funkcji hub_probe?
    Ja również mam tablet zawierający RK3066 (CTAB2 - DS975-eng 4.1.1 JRO03H 20120828.094019 release-keys), ale wszystkie funkcje wymienione w /dev/kallsyms wskazują na adres 00000000.

    Do tego obawiam się, że musiałem chyba uszkodzić USB OTG próbując podłączać huby lub dysk (mimo, że wszystkie urządzenia z zewnętrznym zasilaniem). Co prawda pendrive jeszcze działa, ale klawiaturka (z etui) najpierw zaczęła mi sypać błędami w dmesg (i działała po kilka minut od podłączenia), a teraz już robi tylko niekończące się resety USB (dopóki jej nie odłączę).

    OdpowiedzUsuń
    Odpowiedzi
    1. Odszukaj plik kptr_restrict (bodajże w /sys/kernel) i tam zmień wartość 2 na 0.
      Procedura CAT powinna działać bez problemu.

      Usuń
  2. Dzięki!

    Faktycznie, /proc/sys/kernel/kptr_restrict zawierał '2'.
    Odczytałem offset, zmieniłem w kodzie Twojej appki, skompilowałem, odpaliłem i działa.

    Co ciekawe mam niby 2 huby z zasilaniem (4 i 7 portowe), do obu podłączałem ten sam zasilacz 5V 1A, a ten 4-portowy daje mniej prądu niż port microusb w tablecie (nawet samej przejściówki USB->2xPS2 nie uciągnął), a 7-portowy i tak nie jest w stanie podać więcej niż 500mA na port (pewnie nawet trochę mniej).

    Na 7-portowym zadziałał jednocześnie pendrive i ww. przejściówka, natomiast dysk 1TB 2,5" (pojedyncze USB na granicy 500mA na rozruchu) nie ruszył (tak, jak i podłączany bez huba).

    W moim przypadku offset wynosił 0xc06f7498+0x43.

    OdpowiedzUsuń
    Odpowiedzi
    1. Z ciekawości, jaki to tablet. Mógłbyś podać model ?
      Co do hubów, ja mam huba bez własnego zasiliania i tablet uciągał na nim myszke USB, klawiature USB + pendrive.
      Po podłączeniu pada z dual shock przez huba pad nie działał.

      Usuń
    2. CTAB2, jak podałem powyżej.
      Jednak USB w tablecie nie padło, a prawdopodobnie klawiatura z etui (na microusb).
      Ciekawe, że działa również adb po podłączeniu tego tabletu i innymi czy też telefonami. Nawet je ładuje z własnej baterii.
      A jaki jest model Twojego tabletu?
      Czy próbowałeś coś więcej niż dostarczony z nim rom? Np. coś z custom romów pod PIPO czy też Ubuntu pod rk3066?

      Usuń
    3. Mój tablet to U30GT-M. Udało mi się uruchomić Ubuntu. Aktualnie tablet pojechał do serwisu, gdyż wyrwało się USB, które było źle przylutowane. Będzie albo wymiana płyty głównej albo na inny model, możliwe że na RK3188. Romy przerabiałem stockowe, tak by rozszerzyć funkcjonalność tabletu, np poprawiłem bugi związane z grami od Gameloft'u, gdyż na stockowym sofcie się nie odpalały.

      Usuń
  3. a jak ta aplikacje uruchomic? ktora udostepniles ? trzeba ja skompilowac? sorry moja wiedza w tym temacie jest bliska zero ..

    OdpowiedzUsuń
  4. Świetny artykuł, pokazujący kierunek postępowania a nie dający rozwiązanie na tacy na zasadzie ctrl+c, ctrl+v.

    Po odczytaniu adresu bazowego, kompilacji i przetestowaniu Twojej aplikacji, wszystko zadziałało jak należy. Następnie przyszedł czas na modyfikacje jądra na tablecie, co też uczyniłem. Ze znalezieniem narzędzi pod linuksa do wypakowania / pakowania kernela pod rk3066 nie było problemu (dodawanie / wycinanie KRNL + sumy kontrolnej). Tutaj polecam weryfikacje narzędzi poprzez wypakowanie kernela, następnie ponowne spakowanie BEZ modyfikacji a następnie sprawdzenie sumy kontrolnej. Jak jest ta sama co z backupa z pamięci NAND to jest OK. Piszę dlatego że natknąłem się na różne wariacje narzędzi dodające inne nagłówki. Po weryfikacji zmodyfikowałem zadany bajt, spakowałem jądro narzędziem rkkernel, a następnie wrzuciłem na tablet rkflashtool. Tablet działa bez zarzutu, podłączony hub + peryferia zostają wykryte od razu po włączeniu urządzenia.

    Nie ukrywam że tak szczegółowego know how nawet na xda-developers nie znalazłem. Posty które znalazłem kończyły temat na podmianie bajtów + kompilacji modułu do jądra. A to rozwiązanie nie jest optymalne ze względu na wymóg odłączenia / przyłączenie huba po odpaleniu tableta.

    Natomiast modyfikacja skompilowanego jądra + wrzucenie na tablet daje kompletne rozwiązanie problemu. Dzięki za artykuł ! Nie ukrywam że jestem pozytywnie zaskoczony poziomem twojego bloga ... i to jeszcze pisanym po polsku :]

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki serdeczne za miłe słowa :). Ostatnio trochę brakuje mi czasu na tego bloga, jednak postaram się co jakiś czas jeszcze coś ciekawego spisać.

      Usuń
    2. widac, ze sie napracowales ale szkoda ze nie opisane dla przecietnego uzytkownika, mam dobry tablet prestigio ale zablokowana obsluga wielu urzadzen usb i fajnie byloby gdyby udalo by mi sie odblokowac. Jest szansa ze kiedy kolwiek pojawi sie poradnik dla przecietnego kowalskiego?

      Usuń
  5. witam... super art ! chcialbym to zastosowac w prestigio 5870c. niestety mam taki oto problem :
    u0_a146@android:/ $ su
    root@android:/ # cat kallsyms | grep hub_probe
    sh: cat: kallsyms: No such file or directory

    jakis pomysl ?

    pozdro Ryrzy z MoDaCo.pl :)

    OdpowiedzUsuń
    Odpowiedzi
    1. co sie stalo z oim drugim postem ? :( jakby co to dalem rade przez cat /proc/kallsyms. skompolowalem apke ale mam sh: /sdcard/usb_hub can't execute: permission denied mimo dobrych uprawnien :/

      Usuń
    2. ok poszło i to... mimo wpisania su a potem apki nie dawalo rady, trzeba bylo w jednej linii su usb_hub i poszło :) szkoda tylko ze nie mam huba to sprawdzenia :D

      Usuń
    3. no i niestety... nadal HUBy nie działają... czy aplikacja po jej uruchomieniu powinna coś wyświetlić ? widzę ze w kodzię sa printf... po odpaleniu w terminalu nic sie nie dzieje w zasadzie...

      Usuń
  6. Ryrzy pls zrob to mam to prestigio i uzywam od jakiegos czasu twoich softow jak jeszcze odblokujesz w nich huba to bedzie mistrzostwo swiata. To bedzie prawdziwy przelom, trzymam kciuki ze jakos dasz rade. Bedzie mozna wlaczyc juz tableta na biurku 24/h z klaw, zasilaczem myszka marze o tym bo narazie to jest tylko albo bateria i klaw albo zasilanie i dotyk. Modle sie zeby ci sie udalo odblokowanie tego huba w tym prestigio.

    OdpowiedzUsuń
  7. Chris mam ten sam problem w moim Kruger & Matz KM 0793 to klon pipo s3 ( też śmiga na rk3066) nie mogę nic podłączyć więcej poza hubem to takie frustrujące :/ Proszę pomóż nie znam się na komendach w terminalu nie wiem jak wywołać rzeczy o których piszesz :( mogę podać mój adres e-mail volante11@o2.pl skontaktuj się ze mną podaj prostszą wersję tego poradnika pomóż w potrzebie :)

    OdpowiedzUsuń
  8. Witam czy ten programik działa tylko na tym tablecie?? Dzięki z aodpowiedż

    OdpowiedzUsuń

Prześlij komentarz