https://chacker.pl/
Do tej pory udowodniliśmy, że możemy przechwytywać i odtwarzać sygnał, ale tak naprawdę nie wiemy, co jest transmitowane. Podczas tej fazy spróbujemy dowiedzieć się, jak urządzenie rozróżnia różne naciśnięcia przycisków i czy jest wystarczająco inteligentne, aby wykluczyć inne piloty. Aby wykonać oba te zadania, musimy dowiedzieć się, jak kodowane są dane. Chociaż moglibyśmy użyć gnuradio_companion do przeprowadzenia analizy, zamierzamy użyć innego narzędzia, które nieco ułatwi to zadanie: inspectrum. Inspectrum (https://github.com/miek/inspectrum) to analizator sygnału radiowego offline, który działa na przechwyconych sygnałach radiowych. W momencie pisania tego tekstu wersja inspectrum zainstalowana przez apt w Ubuntu jest opóźniona w stosunku do najnowszej wersji i nie zawiera niektórych niezwykle przydatnych funkcji. Zalecam zbudowanie jej z GitHub. Aby zbudować inspectrum ze źródła, musisz również zainstalować liquid-dsp. W podstawowej instalacji Ubuntu, inspectrum można zainstalować za pomocą poleceń znajdujących się w pliku README.txt katalogu Analyze ze strony pobierania książki. Aby przesyłać dane między stacjami, sygnał nośny jest modulowany danymi do przesłania. Sygnał nośny lub częstotliwość są znane obu stronom i „niosą” dane. Kluczowanie on-off to prosta metoda modulacji amplitudy, która skutkuje obecnością lub brakiem częstotliwości nośnej w celu przekazania informacji.

Prosta forma kluczowania on-off może mieć tylko impulsy o jednym czasie trwania, gdzie obecność impulsu to 1, a brak impulsu przez ten czas to 0. Nieco bardziej skomplikowana forma może używać długiego impulsu jako 1 i krótkiego impulsu jako 0. Najmniejszy okres czasu przejścia od pewnej amplitudy do braku amplitudy nazywa się okresem symbolu. Po zainstalowaniu inspectrum po prostu uruchamiamy je i wprowadzamy niezbędne zmiany dla naszych próbek w GUI. Jeśli nie masz urządzenia, możesz użyć plików przechwytywania zawartych w katalogu Capture ze strony pobierania książki, aby śledzić. Na rysunku 22-7 zauważysz, że otworzyliśmy przechwytywanie w celu włączenia gniazda 1 (remote1-1on-4m-316mhz) i ustawiliśmy częstotliwość próbkowania na 4000000 (częstotliwość, z jaką przechwyciliśmy sygnał).

Oś pozioma to czas, a oś pionowa to częstotliwość. Kolor informacji wyświetlanych na ekranie można traktować jako intensywność i można go dostosować, przesuwając suwaki Power Max i Min. Dostosuj suwaki Power Max i Min tak, aby w tym przypadku widzieć wyraźniejsze krawędzie. –1 MHz na skali pionowej odnosi się do 316 MHz do 1 MHz (lub 315 MHz). Co więcej, jeśli będziesz podążać za diagramem poziomo, zobaczysz mnóstwo kresek o różnych rozmiarach z odstępem między nimi. Kreski na naszej częstotliwości roboczej wyglądają jak kod Morse’a i wskazują na formę klawiszowania on-off.
Aby zdekodować dane, musimy obliczyć okres symbolu i przetłumaczyć symbole pojedynczego pakietu. Na szczęście inspectrum udostępnia kilka narzędzi do pomiaru sygnału i przechwytywania danych symboli. Funkcja kursora zapewnia sposób graficznego podziału diagramu na symbole o określonej długości. Ponadto, ukryta na środkowym przycisku myszy jest możliwość dodania wykresu amplitudy i wyodrębnienia symboli. Na rysunku widać dodanie kursora przy okresie symbolu 272μs i ośmiu okresach nałożonych na sygnał.

Aby określić okres symbolu, wyrównaj przednią krawędź kursora na początku najmniejszego symbolu i przeskaluj kursor, aby wyrównał się na końcu tego samego symbolu. Następnie po prostu przesuń region, aby wyrównać na początku wszystkich symboli i zwiększyć liczbę symboli. Oryginalny okres symbolu nie będzie dokładny, ale powinien być w przybliżeniu. Głównym pomysłem jest zapewnienie, że krawędzie wszystkich symboli są wyrównane z krawędzią okresu. Nawet przy tak prostym wykresie przekazywanych jest kilka ważnych informacji:
- Najkrótszy impuls trwający 272μs.
- Najdłuższy impuls trwający jest trzy razy dłuższy od najmniejszego impulsu trwającego.
- Cztery okresy symboli 272μs występują między początkiem jednego impulsu a początkiem następnego impulsu.
Teraz, gdy mamy to, co wydaje się być okresem symboli, powinniśmy zwiększyć liczbę symboli i sprawdzić, czy nadal pokrywamy się z krawędziami kresek w całym pakiecie danych. Po prostu oddal diagram i zobacz, gdzie pokrywa się ostatni impuls. W naszym przypadku byliśmy nieco poza zasięgiem i musiałem lekko rozciągnąć okres, tak aby okres symboli wynosił 275μs zamiast 272μs. Nie jest to nieoczekiwane, biorąc pod uwagę, że wszelkie błędy w początkowym pomiarze są w tym przypadku mnożone przez 100. Po potwierdzeniu szybkości symboli i okresu możemy teraz wyodrębnić symbole i przetłumaczyć je na dane binarne. Aby to osiągnąć, używamy wykresu amplitudy ze środkowego przycisku myszy. Po dodaniu wykresu amplitudy do wykresu widma dodawany jest nowy nawias z trzema poziomymi liniami. Nawias musi być wyrównany (wyśrodkowany) na danych symbolu, aby uzyskać wykres amplitudy danych symbolu na nowo dodanym wykresie amplitudy. W takim przypadku, gdy nawiasy są wyśrodkowane na danych symbolu, a ustawienia Power Max/Min są rozsądne, wykres zaczyna wyglądać jak fala kwadratowa

Gdy fala kwadratowa wygląda jak fala kwadratowa, używamy ponownie środkowego przycisku myszy, aby wyodrębnić symbole do standardowego wyjścia (stdout). Wyodrębnione wartości są następnie drukowane w wierszu poleceń, w którym wywołano inspectrum

W tym momencie przejdziemy do małego programowania w Pythonie, aby przetłumaczyć wektor amplitudy na wektor binarny w celu dalszego przetwarzania.
Wyodrębnione symbole mieszczą się w przedziale od –1 do 17, dlatego musimy je przekonwertować na dane binarne, aby ułatwić przetwarzanie. Rozsądną metodą konwersji jest wybranie wartości progowej, gdzie wszystko powyżej progu jest binarną 1, a wszystko poniżej jest binarnym 0. Nadchodzący skrypt decode-inspectrum.py pozwala użytkownikowi wybrać próg na podstawie wartości wyodrębnionych z inspectrum.
UWAGA: Rzeczywiste wartości minimalne i maksymalne będą się różnić w zależności od ustawień Power Min/Max. Dodałem thresh (od progu) do funkcji decode, aby umożliwić uwzględnienie różnych wartości

Aby interaktywnie bawić się danymi, używam ipython3 (1), ale możesz uruchomić kod w dowolny sposób. Jedną z zalet ipython3 jest to, że możesz modyfikować rutynę i przeładowywać ją (2) według własnego uznania. Rutyna dekodowania (3) pobiera dane wyjściowe (4) symboli ekstrakcji z inspectrum i drukuje zdekodowane dane w postaci surowego dekodowania szesnastkowego (5), przetłumaczonych symboli decode(6) i surowego dekodowania binarnego (7). Dekodowanie przetłumaczonych symboli opiera się na fakcie, że kluczowanie włącz-wyłącz wydawało się mieć dwa symbole. Dane binarne odzwierciedlają te same dwa symbole, przy czym długi impuls to 0xe, a krótki impuls to 0x8. Wynik uruchomienia dekodowania dla wszystkich przechwytów pokazano poniżej:

Nie jest do końca jasne, jaki jest początek każdego pakietu, ale konsekwentnie wydaje się zaczynać od binarnej 10 (reprezentowanej jako 0xe8 w systemie szesnastkowym). Następnie dane różnią się tylko między pilotami, co może wskazywać na schemat adresowania, ponieważ piloty działają tylko na sparowanych gniazdach. Jeśli porównamy tę samą operację na obu pilotach, ostatnie 4 bity to wyraźnie wykonywana operacja (czyli włączenie gniazda 1). Jeśli wcześniej nie było to oczywiste, teraz wiemy, że ataki replay będą działać tylko na sparowanym gnieździe.