Posted on ::

Plan na dzisiaj: zhakować odkurzacz.

Zacznę od tego, że w momencie pisania tej notatki, nie jest ona nawet częścią bloga - w sensie nie jest w folderze "Blog", gdzie powstała większość wpisów. Na razie piszę to w moim prywatnym skarbcu Obsidianowym, bo już mam notatkę dotyczącą odkurzacza, a w sumie mogę ją przeredagować na styl wpisu i opublikować. To nie jest tak, że tu będą jakieś wielkie tajemnice - a może komuś się przyda, tak jak mi dosłownie trzy dni temu przydał się mój własny wpis o konfigurowaniu tożsamości repozytoriów Git.

Dlaczego chcę zhakować odkurzacz? Kilka powodów. Bo niepokoi mnie, że urządzenie z może kamerą, może lidarem, może mikrofonem, dzwoni do domu w Chinach. Bo chcę mieć kontrolę nad moimi urządzeniami. Bo dowiedziałem się, że istnieje coś takiego jak Valetudo. Bo lubię "komputerkować". Chyba wszystkie powody. Do rzeczy.

Pacjent: Mi Robot Vacuum-Mop P, model STYTJ02YM (spisane z naklejki na odkurzaczu). Odkurzacz kupiłem dawno temu chyba w sklepie Xiaomi - nie ogarniam wszystkich krzyżówek tych chińskich firm: Xiaomi, Mi, Mijia, Viomi i jeszcze z piętnaście innych nazw, które pojawiają się w losowych miejscach - punktem odniesienia jest numer modelu. Odkurzacz o dziwo całkiem "serwisowalny" - jakiś czas temu spalił się w nim jeden z silników, więc zamówiłem zamiennik na AliExpress za około 20 zł, wymieniłem, okazało się, że się pomyliłem - to nie ten silnik się spalił, tylko ten drugi, więc zamówiłem ten drugi, tym razem za 40 zł, wymieniłem, i odkurzacz z powrotem działa bardzo dobrze.

O samym Valetudo dowiedziałem się nie pamiętam skąd. Na moje szczęście, model mojego odkurzacza jest wspierany. Okazuje się, że odkurzacz tak naprawdę nazywa się "3irobotix CRL-200S". Albo i nie. Przy okazji: znalazłem ciekawe repozytorium, gdzie ktoś próbuje zrobić pełną inżynierię wsteczną, popieram! Instrukcja mówi, że model viomi.vacuum.v8 jest podatny na "uceglenie", i oczywiście ten model mam. Ale w innych miejscach jest napisane, że to jest takie pół na pół, więc postanowiłem zaryzykować.

Pierwszy krok to wbicie do systemu odkurzacza. Port USB znajduje się pod baterią, która jest przykryta klapką z czterema śrubkami. Do połączenia z odkurzaczem używa się adb czyli Android Debug Bridge - bardzo ciekawe. Oczywiście nie mogło obyć się bez kilku problemów:

  1. odkurzacz w ogóle nie włącza się, jeśli wykryje podłączony kabel USB,
  2. adb jest dostępne dosłownie przez trzy sekundy podczas uruchamiania odkurzacza, później urządzenie przestaje być wykrywalne,
  3. powłoka, do której się łączymy, wymaga podania hasła.

Na te problemy jest rozwiązanie w repozytorium w postaci mało eleganckiego skryptu, który w pętli wali do odkurzacza komendami, aż ten zacznie słuchać. Poniżej wrzucam moje bardziej eleganckie rozwiązanie, które robi dokładnie to samo, ale jest krótsze, bardziej eleganckie, no i moje:

#!/usr/bin/env bash
adb wait-for-device # można kulturalnie? można

# naprawiamy komendę `adb shell`
temp_file=$(mktemp)
trap "rm -f '$temp_file'" EXIT
cat >"$temp_file" <<"EOF"
#!/bin/sh
export ENV='/etc/adb_profile'
exec /bin/sh "$@"
EOF
chmod +x "$temp_file"
adb push -a "$temp_file" /bin/adb_shell

# usuwamy symboliczne dowiązanie do oryginalnego oprogramowania
adb shell "rm /etc/rc.d/S90robotManager"

# robimy backup
mkdir -p backup
adb pull /proc/partitions backup/
adb shell "find /dev -name 'nand*'" | tr -d '\r' | xargs -I {} adb pull {} backup/

Skrypt uruchamiamy - i on sobie grzecznie czeka - a my wyłączamy odkurzacz, podłączamy kabel USB do samego odkurzacza, następnie włączamy odkurzacz i natychmiast po zapaleniu się diody na odkurzaczu podłączamy kabel USB do komputera. Skrypt w pewnym momencie odnajduje urządzenie, robi z nim co trzeba, i od tej pory dostęp do urządzenia mamy już bez problemu. Ostatnia linijka jest wielokrotnie złożona, ale co robi, to z folderu /dev na odkurzaczu pobiera wszystkie pliki, których nazwa zaczyna się od nand. Skrypt z oryginalnego repozytorium wypisuje nazwy wszystkich plików pliki po kolei, ale my będziemy bardziej eleganccy.

Pierwszy etap za nami. Odkurzacz jest gotowy do hakowania.

Kolejny krok to zbudowanie firmware. Do tego kroku przygotowane jest już narzędzie DustBuilder i nie wiem, dlaczego twórca postanowił postawić całą infrastrukturę pod to, zamiast dostarczyć skrypty, ale nie będę narzekał - proces jest bajecznie prosty: wybieram mój odkurzacz, wpisuję adres email, podaję klucz publiczny - i po jednej minucie dostaję na pocztę linka do pobrania pliku viomi.vacuum.v7_fw.tar.gz. Na ten moment postanawiam zignorować fakt, ze nazwa ma "v7" zamiast "v8" - w formularzy pozycja nazywała się "v7/v8", więc mi się to składa w całość.

Żebym nie musiał się zastanawiać, napisałem sobie taki oto elegancki skrypt, który wrzuca pliki tam gdzie mają być, a następnie loguje się do odkurzacza i sprawdza dla pewności, czy pliki są tam gdzie są, a następnie zgodnie z instrukcją uruchamia instalację.

#!/usr/bin/env bash
adb push ./dustbuilder/viomi.vacuum.v7_fw.tar.gz /tmp/
adb push ./valetudo-armv7.upx /mnt/UDISK/valetudo
adb push ./convert-robot.sh /tmp/
cat <<EOF | adb shell
ls -la /tmp/$firmware_name
ls -la /tmp/convert-robot.sh
ls -la /mnt/UDISK/valetudo

cd /tmp/
chmod +x convert-robot.sh
sh ./convert-robot.sh
tar xzvf ./$firmware_name
chmod +x install.sh
sh ./install.sh
exit
EOF

Teraz czas na chwilę stresu. Naciskam enter i patrzę na konsolę. Poszło. Od teraz mój odkurzacz jest wolny. Elegancko.

Classy Jim - The Office US The Office