blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
2
SLEDOVAŤ BLOG
PHP, Arduino programátor
deadawp



Hack RS232 - Arduino UART
pridal deadawp 12.7. 2020 o 2:06



Výrobcovia kozmetických prístrojov častokrát vyrábajú aj príslušenostvo, ktoré je navrhnuté iba pre komunikáciu s daným prístrojom. To zaručuje, že sa prístroj používa iba s originálnym príslušenstvom, za ktoré si zákazník priplatí. V prípade použitia neoriginálneho príslušenstva ho prístroj nerozpozná a nie je ho možné využívať.

Na druhú stranu, na trhu existuje univerzálne príslušenstvo od rôznych výrobcov s totožnou funcionalitou, avšak softvérovo nie je prispôsobený pre prístroj danej značky. Existuje aj mnoho ďalší softvérových obmedzení prístrojov, ale aj periférii - kredit / počet použití a podobne.
Ilustračný obrázok kozmetického prístroja (nereprezentuje použitý):

Dnes si ukážeme hack čínskeho kozmetického prístroja využívajúceho aplikátory ako príslušenstvo - perifériu, ktorá je k nim pripojená. Aplikátory obsahujú integrovaný procesor, ktorý prostredníctvom RS232 linky komunikuje s kozmetickým prístrojom a posiela mu svoj identifikátor, ktorý kozmetický prístroj očakáva. Nakoľko sú dané procesory zamknuté pre čítanie, neostáva nič iné ako analyzovať komunikáciu a zistiť, aké dáta si zariadenia vymieňajú. Pripojením saleae analyzátora je možné skúmať RS232 linku. 
Ilustračný obrázok softvéru saleae analyzátora:

Saleae analyzátor - hardvér:

Z výsledku analýzy bolo zrejmé, že čínsky kozmetický prístroj komunikuje s aplikátorom po RS232 na rýchlosti 28800 baud/s a aplikátor sa identifikuje svojim 12-znakovým číselným kódom v plaintexte bez kódovania. Na základe identifikátoru prístroj začne obsluhovať daný aplikátor a je ho možné plne využívať. Komunikácia prebiehala na napäťovej úrovni 5V. Okrem týchto informácii saleae analyzátor umožňuje identifikovať aj logiku prenosu, v tomto prípade 8 dátových bitov, bez paritných bitov, 1 stop bit - 8-N-1. 

Snahou hacku je nahradenie RX signálu aplikátora a umožnenie využívania rôznych aplikátorov s prístrojom. S využitím Arduina je možné emulovať použitý aplikátor aj od univerzálnych výrobcov. Prostredníctvom dorobených tlačidiel na prístroji je možné prepínať medzi použitým aplikátorom, pričom Arduino odosiela identifikátor, ktorý sme vyčítali prostredníctvom saleae analyzátora. 

Nakoľko nebolo bez saleae analyzátora jasné, aké napäťové úrovne a baudrate používa prístroj s aplikátorom, môžeme si následne vyskúšať odchytenie informácii, ktoré sú posielané po RS232 prostredníctvom RX pinu Arduina, pričom môžeme využiť softvérovo emulovaný UART, ktorý bude preposielať prijaté dáta na buffri do hardvérového UARTU. V opačnom prípade by nebolo možné mať UART aktívny na dvoch zariadeniach súčasne a nebolo by možné nahrávať nový program, nakoľko by bol UART blokovaný. Pre monitor sériovej linky je možné využiť Putty, alebo vstavaný UART monitor v prostredí Arduino IDE. 
Viac projektov s Arduinom a obdobnými mikrokontrolérmi je možné nájsť na: https://arduino.php5.sk
Program pre odchytenie dát (bridge UART):

// Podla mojho originalu: https://github.com/martinius96/Hardware-serial-ESP32
//klon z HardWareSerial
#include <SoftwareSerial.h>

SoftwareSerial swSerial_1(3, 4); // RX, TX
void setup() {
  Serial.begin(9600); //UART do PC
  //  SW Serial, inicializacia, v zakladnom nastaveni 8-N-1
  swSerial_1.begin(28800); //RS232, znama rychlost z saleae analyzatora
}

void loop() {
  while (swSerial_1.available()) {
    char c = swSerial_1.read();
    Serial.write(c);
  }
  while (Serial.available()) {
    char d = Serial.read();
    swSerial_1.write(d);
  }
}


Druhý program reprezentuje príklad pre odosielanie dát na základe tlačidlového vstupu až pre 3 rôzne dostupné aplikátory. Dáta sa posielajú ako pole celých čísel (integerov). Týmto spôsobom je možné emulovať nový - univerzálny aplikátor na zariadení, ktoré akceptuje iba aplikátor s vlastným - "kompatibilným" softvérom.
Program pre odoslanie dát, identifikátor aplikátora:

//LED 13 sa rozsvieti iba pri STATE 1
//Revízia: Martin Chlebovec (martinius96)
int pin_LED = 13;
const int buttonPin1 = 2;
int buttonState1 = HIGH;
int lastButtonState1 = HIGH;
unsigned long lastDebounceTime1 = 0;
unsigned long debounceInterval = 50;
int inByte = 0;
byte state = 0;
int a[12] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
int b[12] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
int c[12] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};

void setup() {
  pinMode(buttonPin1, INPUT_PULLUP);
  Serial.begin(9600);
  establishContact();
  pinMode(pin_LED, OUTPUT);
  digitalWrite(pin_LED, LOW);
}

void loop() {
  int reading1 = digitalRead(buttonPin1);
  if (reading1 != lastButtonState1) {
    lastDebounceTime1 = millis();
  }
  if ((millis() - lastDebounceTime1) > debounceInterval) {
    if (reading1 != buttonState1) {
      buttonState1 = reading1;
      if (buttonState1 == HIGH) {
        state++;
        if (state > 3) {
          state = 0;
        }
      }
    }
  }
  lastButtonState1 = reading1;
  if (state == 1) {
    digitalWrite(pin_LED, HIGH);
  } else {
    digitalWrite(pin_LED, LOW);
  }
  if (Serial.available() > 0) {
    inByte = Serial.read();
    delay(1);
    switch (state) {
      case 1:
        //PRE HODNOTU STATE 1
        for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
        {
          Serial.print(a[i]);
        }
        break;
      case 2:
        //PRE HODNOTU STATE 2
        for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++)
        {
          Serial.print(b[i]);
        }
        break;
      case 3:
        //PRE HODNOTU STATE 3
        for (int i = 0; i < sizeof(c) / sizeof(c[0]); i++)
        {
          Serial.print(c[i]);
        }
        break;
      default:
        //PRE HODNOTU STATE 0 alebo inu
        Serial.print("STATE 0!");
        break;
    }
    delay(1000);
  }
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.println(" SEND ME DATA ");
    delay(1000);
  }
}

 



Prístupov 1547
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDOVAŤ
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
Ovládanie Arduina cez UART z počítača
[ 19.11.2020] (príspevkov 0)
ArduinoJson - knižnica pre parsovanie JS...
[ 15.11.2020] (príspevkov 0)
Overenie kradnutých vozidiel - Arduino +...
[ 11.11.2020] (príspevkov 0)
Hladinomer + Zrážkomer - Arduino / ESP82...
[ 2.11.2020] (príspevkov 0)
RFID vrátnik - update Október 2020
[ 29.10.2020] (príspevkov 0)
Digitálny potenciometer, prerušenie, deb...
[ 28.10.2020] (príspevkov 0)
Integrácia zrážkomera RG-11 do projektu ...
[ 22.10.2020] (príspevkov 0)
WiFi Termostat - ESP8266 - WiFiManager -...
[ 28.9.2020] (príspevkov 0)
Izbový termostat - Portovanie programu -...
[ 22.9.2020] (príspevkov 0)
RFID vrátnik - Ukončenie projektu
[ 9.9.2020] (príspevkov 0)