DIY: Prank USB-Stick - Tastatur mit Eigenleben

DIY: Prank USB-Stick - Tastatur mit Eigenleben

Prank ahead! Zufällige Tastatureingaben in zufälligen Abständen simulieren, um die Kollegen oder den unliebsamen Schwiegervater so richtig zu nerven! Heute soll es um ein kleines selbstgebautes Bad USB-Stick Projekt gehen, bei dem wir zufällige Tastatureingaben in möglichst zufälligen Zeitabständen durchführen. Das Ganze bedarf keiner Installation und könnte euer Opfer so richtig zur Weißglut bringen :D.
Warum? - Weil unser Projekt zufällig Tasten auf der Tastatur drückt und niemand wissen wird wo die herkommen. Zusehen und Spaß haben!

Vor fast genau drei Monaten habe ich einen Artikel zu einem Bad USB-Stick verfasst, um mittels einem Digispark in wenigen Sekunden ein neues Bildschirmhintergrundbild per simulierten Tastatureingaben herunterzuladen und zu installieren. Das ganze Projekt sollte ein wenig für die Gefahr durch und Problematik hinter Bad USB-Sticks sensibleren. Dieses mal wollen wir noch einmal einen drauf legen und das Opfer langfristig zur Weißglut bringen. Ich möchte vorher jedoch noch einmal darauf hinweisen, dass dieser Witz unter Umständen strafbar sein könnte. Das bedeutet: Nur mit Bedacht durchführen.

Was benötigen wir?

Wir benötigen einen Digispark V3 oder einen anderen Microcontroller, welcher Tastatureingaben simulieren kann. Beispielsweise eignet sich der Arduino Micro dazu. 
Zusätzlich benötigen wir die Arduino IDE und einen freien USB-Slot am PC. Erfahrungsgemäß eignet sich dazu ein direkter USB-Slot am Besten, da mein USB-Hub hier leider schlapp gemacht hat. Zum Stand dieses Artikels reichen also ~2€ Materialeinsatz (im 5er-Pack) und etwa 30min der eigenen Zeit aus. Ehrlich gesagt verdammt erschreckend :(

Die Vorbereitungen

Nach dem Kauf und der Lieferung der Microcontroller müssen wir die Arudino IDE mit mindestens der Version 1.6.6 und die DigiSpark (entfällt beim Arduino Micro) Windows Treiber installieren. Einen Download findet ihr hier und hier.

Da ich das Konvolut an Anleitung bereits in einem anderen Artikel abgearbeitet hatte werde ich das hier nur stiefmütterlich behandeln. Wer auf Fotos steht und längere Erklärungen verlangt, dem lege ich den vorangegangenen Artikel ans Herz: Guckst du hier

Eine detailierte Installationsanleitung erhaltet ihr hier: http://digistump.com/wiki/digispark/tutorials/connecting

Nach der Installation müssen wir der Arduino IDE "beibringen" mit dem DigiSpark kommunizieren zu können. Hierfür klicken wir auf: Datei -> Voreinstellungen und fügen folgendes unter dem Punkt "Zusätzliche Boardverwalter-URLs:" hinzu:

http://digistump.com/package_digistump_index.json

Anschließend klicken wir im Menü auf: Werkzeuge -> "Board: XXX" -> Boardverwalter und suchen dort nach "Digistump AVR". Das Suchergebnis müssen wir installieren.

Nach der Installation können wir unser Board auswählen: Werkzeuge -> "Board: XXX" -> Digistump AVR Boards -> DigiStump (Default - 16.5 MHz)
Bevor wir nun mit der Programmierung beginnen können ist noch die zusätzliche Installation einer Library nötig, die unseren DigiSpark in Zukunft als Tastatur ausgibt und Tastatureingaben an den angeschlossenen Rechner weitergibt. Hierzu müssen wir zwei Dinge tun. Erstens muss die eigentliche Library heruntergeladen werden. Im Anschluss ist ein deutsches Tastaturlayout zu programmieren.

Zur Installation klicken wir auf Werkzeuge -> "Bibliotheken verwalten..." und geben dann in die Suche DigisparkKeyboard ein. Installiert werden muss "DigiKeyboardFr".

Ist dies erledigt müssen wir in den selben Ordner in dem auch euer Arduino Projekt (sketchXXX.ino) liegt eine Datei ablegen die das Mapping auf das deutsche Tastaturlayout übernimmt. Diese nennen wir "DigiKeyboardDe.h" und besitzt den Inhalt:

#include "DigiKeyboard.h"
#ifndef DIGIKEYBOARDDE_H
#define DIGIKEYBOARDDE_H


#define DE_MOD_CONTROL_LEFT    (1<<8)
#define DE_MOD_SHIFT_LEFT      (1<<9)
#define DE_MOD_ALT_LEFT        (1<<10)
#define DE_MOD_GUI_LEFT        (1<<11)
#define DE_MOD_CONTROL_RIGHT   (1<<12)
#define DE_MOD_SHIFT_RIGHT     (1<<13)
#define DE_MOD_ALT_RIGHT       (1<<14)
#define DE_MOD_GUI_RIGHT       (1<<15)
const uint16_t _ascii_de_map[128] PROGMEM =
        {
                0x00,             // NUL
                0x00,             // SOH
                0x00,             // STX
                0x00,             // ETX
                0x00,             // EOT
                0x00,             // ENQ
                0x00,             // ACK
                0x00,             // BEL
                0x2a,     // BS Backspace
                0x2b,     // TAB  Tab
                0x28,     // LF Enter
                0x00,             // VT
                0x00,             // FF
                0x00,             // CR
                0x00,             // SO
                0x00,             // SI
                0x00,             // DEL
                0x00,             // DC1
                0x00,             // DC2
                0x00,             // DC3
                0x00,             // DC4
                0x00,             // NAK
                0x00,             // SYN
                0x00,             // ETB
                0x00,             // CAN
                0x00,             // EM
                0x00,             // SUB
                0x00,             // ESC
                0x00,             // FS
                0x00,             // GS
                0x00,             // RS
                0x00,             // US

                0x2c,      //  ' '
                0x1e|DE_MOD_SHIFT_LEFT,    // !
                0x1F|DE_MOD_SHIFT_LEFT,    // "
                0x38,    // #
                0x21|DE_MOD_SHIFT_LEFT,    // $
                0x22|DE_MOD_SHIFT_LEFT,    // %
                0x23|DE_MOD_SHIFT_LEFT,    // &
                0x32|DE_MOD_SHIFT_LEFT,          // '
                0x25|DE_MOD_SHIFT_LEFT,    // (
                0x26|DE_MOD_SHIFT_LEFT,    // )
                0x30|DE_MOD_SHIFT_LEFT,    // *
                0x30,    // +
                0x36,          // ,
                0x38,          // -
                0x37,          // .
                0x24|DE_MOD_SHIFT_LEFT,          // /
                0x27,          // 0
                0x1e,          // 1
                0x1f,          // 2
                0x20,          // 3
                0x21,          // 4
                0x22,          // 5
                0x23,          // 6
                0x24,          // 7
                0x25,          // 8
                0x26,          // 9
                0x37|DE_MOD_SHIFT_LEFT,      // :
                0x36|DE_MOD_SHIFT_LEFT,          // ;
                0x64,      // <
                0x27|DE_MOD_SHIFT_LEFT,          // =
                0x64|DE_MOD_SHIFT_LEFT,      // >
                0x2D|DE_MOD_SHIFT_LEFT,      // ?
                0x14|DE_MOD_ALT_RIGHT,      // @ 0x40 0x14
                0x04|DE_MOD_SHIFT_LEFT,      // A
                0x05|DE_MOD_SHIFT_LEFT,      // B
                0x06|DE_MOD_SHIFT_LEFT,      // C
                0x07|DE_MOD_SHIFT_LEFT,      // D
                0x08|DE_MOD_SHIFT_LEFT,      // E
                0x09|DE_MOD_SHIFT_LEFT,      // F
                0x0a|DE_MOD_SHIFT_LEFT,      // G
                0x0b|DE_MOD_SHIFT_LEFT,      // H
                0x0c|DE_MOD_SHIFT_LEFT,      // I
                0x0d|DE_MOD_SHIFT_LEFT,      // J
                0x0e|DE_MOD_SHIFT_LEFT,      // K
                0x0f|DE_MOD_SHIFT_LEFT,      // L
                0x10|DE_MOD_SHIFT_LEFT,      // M
                0x11|DE_MOD_SHIFT_LEFT,      // N
                0x12|DE_MOD_SHIFT_LEFT,      // O
                0x13|DE_MOD_SHIFT_LEFT,      // P
                0x14|DE_MOD_SHIFT_LEFT,      // Q
                0x15|DE_MOD_SHIFT_LEFT,      // R
                0x16|DE_MOD_SHIFT_LEFT,      // S
                0x17|DE_MOD_SHIFT_LEFT,      // T
                0x18|DE_MOD_SHIFT_LEFT,      // U
                0x19|DE_MOD_SHIFT_LEFT,      // V
                0x1a|DE_MOD_SHIFT_LEFT,      // W
                0x1b|DE_MOD_SHIFT_LEFT,      // X
                0x1d|DE_MOD_SHIFT_LEFT,      // Y
                0x1c|DE_MOD_SHIFT_LEFT,      // Z
                0x25|DE_MOD_ALT_RIGHT,          // [
                0x2d|DE_MOD_ALT_RIGHT,          // bslash
                0x26|DE_MOD_ALT_RIGHT,          // ]
                0x35,    // ^
                0x38|DE_MOD_SHIFT_LEFT,    // _
                0x2E|DE_MOD_SHIFT_LEFT,          // `
                0x04,          // a
                0x05,          // b
                0x06,          // c
                0x07,          // d
                0x08,          // e
                0x09,          // f
                0x0a,          // g
                0x0b,          // h
                0x0c,          // i
                0x0d,          // j
                0x0e,          // k
                0x0f,          // l
                0x10,          // m
                0x11,          // n
                0x12,          // o
                0x13,          // p
                0x14,          // q
                0x15,          // r
                0x16,          // s
                0x17,          // t
                0x18,          // u
                0x19,          // v
                0x1a,          // w
                0x1b,          // x
                0x1d,          // y
                0x1c,          // z
                0x24|DE_MOD_ALT_RIGHT,    // {
                0x64|DE_MOD_ALT_RIGHT,    // |
                0x27|DE_MOD_ALT_RIGHT,    // }
                0x30|DE_MOD_ALT_RIGHT,    // ~
                0       // DEL
        };

class DigiKeyboardDeviceDe : public DigiKeyboardDevice{
    public:
    size_t write(uint8_t chr) {
        unsigned int temp = pgm_read_word_near(_ascii_de_map + chr);
        unsigned char low = temp & 0xFF;
        unsigned char high = (temp >> 8) & 0xFF;
        sendKeyStroke(low,high);
        return 1;
    }
    void sendKeyReport(uchar *array,const unsigned int size){
        while (!usbInterruptIsReady()) {
            // Note: We wait until we can send keyPress
            //       so we know the previous keyPress was
            //       sent.
            usbPoll();
            _delay_ms(5);
        }

        usbSetInterrupt(array, size);
    }
};
DigiKeyboardDeviceDe DigiKeyboardDe = DigiKeyboardDeviceDe();
#endif //DIGIKEYBOARDDE_H

Nun können wir dann aber wirklich mal mit der eigentlichen Programmierung unseres "kleinen" Scherzes beginnen.


Unsere Programmierung

Steckt den Microcontroller nun, wenn noch nicht geschehen, in den PC ein und fügt folgenden Code in die Arduino IDE ein:

#include "DigiKeyboardDe.h"

char message[37] = "0123456789abcdefghijklmnopqrstuvwxyz";

void setup() {
  DigiKeyboardDe.delay(10000);
}

void loop() {
  int wait = random(5, 60) * 1000; // Wähle eine Zahlt zwischen 5000 und 60000 Millisekunden
  DigiKeyboardDe.delay(wait);// Warte die gewählte Zeit in Sekunden
  int randomKey = random(0, 35); // Zufälle Stelle aus den möglichen Tastatureingaben
  DigiKeyboardDe.print(message[randomKey]); // Schreibe den zufälligen Buchstaben auf dem PC
}


Und das wars dann auch schon. Klingt nach nicht viel, aber es reicht tatsächlich aus.

Was machen wir nun also mit diesem Stick, nachdem wir auf "Upload/Hochladen" geklickt haben und der Code auf dem Digispark angekommen ist? Ich würde behaupten wir schließen ihn an einen PC an und warten, bis die andere Person zur Weißglut getrieben wurde.
Ich wünsche viel Spaß und eine beschauliche Weihnachtszeit.

Marvin

Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Hat dir dieser Artikel gefallen?

Kommentar hinzufügen

*Pflichtfeld