Bluetooth Jammer

Introducere

Dani Mocanu si compania sunt bine veniti in orice boxa, sa fim seriosi. Totusi, uneori chiar avem nevoie sa ne concentram pe treaba. In astfel de momente, cand ai atat de multe deadline-uri incat ai unul pana si pentru a pune de mancare pisicii, tot ce nu iti trebuie este sa auzi cum un proxenet nu va ramane in inchisoare si nu are frica nici de 1000 de mascati.

In acest sens, propun in cadrul acestui proiect un bluetooth jammer, cu scopul de a dezafecta temporar anumite device-uri ce folosesc acest protocol. Intrucat bruiajul intregii plaje de frecventa nu este legal, scopul este de a bloca doar unele adrese (printr-o tehnica similara, folosind un tip de DoS).

Disclaimer: intentionez sa folosesc acest proiect malevolent, partea didactica este doar un bonus adaugat

Descriere generală

Microcontrollerul va fi un Arduino Uno, care va fi legat la toate nenorocirile folosite. Vor exista doua butoane, unul avand rol de select/poll (care va putea si intrerupe executia), precum si unul de start/stop care modifica actiunea dorita. Un short press va duce executia in modul select (vor exista un numar de adrese deja in memorie), iar un double short press va duce in modul de search, in care va fi actualizata lista de adrese. Cardul SD va retine un numar de adrese, iar la pornire, controllerul va citi datele respective si va incepe blocarea in functie de informatiile retinute.

:!: Notabil este ca trebuie retinuta adresa, deoarece un canal poate fi refolosit de alta adresa, si nu dorim blocarea accidentala a acesteia.

O serie de led-uri vor descrie, in modul select, comportamentul fata de un astfel de dispozitiv (TBD).

LE: am adaugat inca un display lcd (e pe drum, e pe I2C frumos elegant, sa moara franta de mai aveam pini digitali liberi e la fix asta)

Rationamentul din Spate

O explicatie mai detaliata a protocolului Bluetooth se gaseste la adresa aceasta.

TLDR, exista 40 de canale folosite in cadrul acestui standard, dintre care 37 sunt destinate transmisiei datelor, iar 3 sunt folosite pentru initierea conexiunilor (advertising channels). Dat fiind ca mecanismul fizic de transmisie este relativ slabut, se foloseste o tehnica numita “channel hopping” pentru a pastra consistenta transmisiei datelor. Practic, se doreste folosirea unor canale alese “random” periodic (random adica se aduna un numar si apoi se pastreaza mod 37 din indicele canalului curent).
Aici devine destul de tricky, deoarece nu ai cum sa ghicesti ce canale vor fi folosite in cadrul unei conexiuni; o posibila metoda ar fi sa asculti ce frecvente sunt folosite pentru o anumita conexiune si apoi sa le umpli de junk, dar in punctul ala, am putea deja sa umplem intreaga plaja de functionare cu 0, nu ar mai fi mare diferenta.

Metoda folosita ofera stabilitate destul de ridicata (chiar e un protocol foarte bun, don't get me wrong), dar tot este susceptibil la clasicul DoS. Are si un termen specific: Bluejacking.

Hardware Design

  • Arduino Uno R3 CH340 (scrie QinHeng pe el, am mai multa incredere in anvelope smirgheluite pe ploaie) PDF Docs
  • HC-05 BLE Datasheet
  • Butoane (le-am scos din intrerupatorul de la baie)
  • Fire de legatura (aceeasi sursa ca mai sus)
  • Breadboard (efectiv doar ca sa fac divizoare de tensiune, nici macar nu sunt utile, doar ca sa fie)
  • SD card reader (no name, gasit la 8 lei pe emag)
  • SD card 16gb (e mai ieftin ca ala de 1gb :-?)
  • Led-uri gasite in sertar (am ars unul si l-am topit cu letconul ca sa vad cum miroase)
  • LCD 1602 @ i2c (pup jos ana maria coita tot respectul pentru livrarea prompta) EDIT: HUOOOO AI TRAS PE DREAPTA UN DISPLAY AM LUAT DOUA LA PUSCARIEEEE

PIN LAYOUT (subject to change)


Digital:

  • 4 - CS (card reader)
  • 8 - EN (HC-05, pentru AT command mode)
  • 9 - RXD (HC-05)
  • 10 - TXD (HC-05)
  • 11 - MOSI (card reader)
  • 12 - MISO (card reader - pe el scrie MOSO, nu stiam daca eram eu prost sau tailandezul care a facut modulul pe vapor)
  • 13 - CLK (card reader)
  • SOON:tm: int. SDA (display)
  • SOON:tm: int. SCL (display)
  • 2 - un buton amarat pentru input
  • 3 - un al doilea buton amarat pentru input

Analog:

  • Nu avem, dar si daca aveam, nu mai am rom pe placuta

Power:

  • 5V VCC in paralel la toate modulele
  • GND tras pe aceeasi linie

Cariera de electronist?


Schema electrica

Software Design

IDE: VSC, w/ PlatformIO extension
Librarii folosite: SD.h (folosita standard in Arduino), SoftwareSerial.h (comunicare seriala in general, built-in)
Algoritmi: urmeaza sa implementez o lista in care sa retin adresele care trebuiesc bubuite. Nu vor fi multe adrese simultan, nu e nevoie de optimizari grotesti suplimentare. Probabil si ceva de hashing pentru validare mai usoara.

Stage 1: avem cod, avem componente functionale, ce mai trebuie?
Da, ati ghicit, il testam pe victime inocente! Hai sa vedem ce se intampla de fapt.

Incepem astfel: comenzile AT, cele pe care le voi folosi pentru a controla facil modulul de bluetooth, sunt destul de dubioase si functioneaza numai cand are chef modulul. E un pic dezamagitor, dar functioneaza dupa un restart. Avem:

  • AT - testeaza practic daca vorbim cu vocile sau cu modulul
  • AT+UART? / AT+UART=x,y,z - seteaza baud rate-ul pentru comunicarea cu miuC
  • AT+INQM? / AT+INQM=x,y,z - seteaza parametrii folositi de inquiry mode (va fi util!)
  • AT+PAIR/BIND/LINK - folosite pentru a conecta modulul la un device, dar noi nu avem nevoie aici.
  • inca cateva mizerii de care nu avem nevoie deloc.

Le-am umplut frigiderul chinezilor care au scris capodoperele astea

avem urmatoarele bucati de cod mai importante:


initializarea modulului bt

#define AT_CONFIG_BAUD    38400
#define AT_MODE_BAUD      19200
#define SERIAL_BAUD       19200

[...]

  pinMode(8, OUTPUT);
  digitalWrite(8, LOW); // start in AT INQ MODE
  BTSerial.begin(AT_MODE_BAUD); // AT_CONFIG_BAUD for config mode

  delay(1000);
  Serial.println("enter AT commands:");
  digitalWrite(8, HIGH); // start taking AT commands

initializarea lcd

int find_i2c_addr() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  return nDevices;
}

[...]

LCDI2C_Generic lcd(0x27, 16, 2); // 0x27 a fost valoarea gasita in functia de mai sus

[...]


  lcd.init();
  lcd.backlight();

  lcd.setCursor(0, 0);
  lcd.print("bober kurwa");
  // lcd.clear();

initializarea modulului sd

 if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    // no root directory  
  }
  else {
    Serial.println("initialization done.");
    root = SD.open("/");
  }

  printDirectory(root, 0);

  File file = SD.open("test");
  if (file) {
    Serial.println("test:");
    // read from the file until there's nothing else in it:
    while (file.available()) {
      Serial.write(file.read());
    }
    // close the file:
    file.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test");
    delay(1000);
  }

Sa-mi bag p*** ca nu merge

Ei bine, planul era simplu, din acest punct voiam sa fac spam de comenzi de PAIR catre device-urile tinta (cele marcate de anumite adrese MAC), doar ca modulul BT pare ca se plictiseste si nu mai vrea sa faca nimic. Motivul e unul destul de simplu: cine a facut boxa asta pe care am testat eu a avut in gand si conceptul scorniturii mele din acest proiect. Adica, in loc sa fie tampiti si sa foloseasca un protocol simplu de care sa pot abuza, au considerat de cuviinta sa separe modul pairing de modul connection, ceea ce duce la incapacitatea mea de a mai ajunge vreodata la device atata timp cat modul pairing este oprit.

Ideea mea initiala nu poate functiona practic (nu in felul in care imi doream). Asa ca ajungem la urmatoarea solutie, care e un pic extrema: aducem o antena (un modul la 10 lei nRF24L01 eventual si cu o antena de amplificare) si nu mai lasam pe nimeni sa se bucure de aceasta unealta a lumii moderne numita comunicare wireless.

Rezultate Obţinute

Incepand cu ce a realizat acest proiect strict in forma curenta:

  • stie sa vada device-uri marcate ca fiind vizibile (adica device-uri care raspund la ping-uri)
  • stie sa le identifice in functie de adresele lor
  • stie sa le retina adresele
  • blocheaza tot ce tine de inbound la frecventa de 2.4ghz (care include si wifi, lol)*

Si, din pacate, ce nu stie sa faca:

  • sa deconecteze un device conectat la un altul
  • sa blocheze bufferul de output al unui device (asta nu prea era in plan oricum)

* rezultat speed test, wifi 2.452 ghz, bluetooth pornit, vizibil: 19.71mbps down, latenta 538ms down; aceleasi conditii, wifi 5.18 ghz: 245.04mbps down, latenta 48ms down. Este evident ca nesimtitul asta dauneaza grav frecventei prin tot spam-ul de inquiry pe care il face.

Concluzii

Bluetooth e un protocol care a trecut prin multe iteratii si a devenit foarte rezilient. In prezent, neavand acces din exterior in cadrul unei conextiuni, este aproape imposibil (cel putin cu aparatura descrisa aici) sa impiedici anumite device-uri din a primi pachete. Singurul mod valid pentru un asemenea act este bruierea intregii frecvente, care nu este tocmai o solutie fericita.

Godspeed, proiectul asta ajunge la gunoi (am mai comandat o antena si un transceiver ca sa imi duc scopul la bun final).

Download

Jurnal

25.05 - - - am scris codul si nu functioneaza

24.05 - - - merg toate piesele top sigur merge

23.05 - - - au venit in sfarsit restul de piese, dupa 2 saptamani de amanari

16.05 - - - a fost ziua mea :) (am pus si dovada cu proiectul asamblat)

16.05 - - - am asamblat mare parte din proiect (mai putin lcd)

11.05 - - - am facut rost de ce aveam nevoie cred

Bibliografie/Resurse

pm/prj2024/avaduva/cezar.zlatea.txt · Last modified: 2024/05/25 19:27 by cezar.zlatea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0